Libgdx |每帧都创建新的Timer.Task会影响性能吗?

时间:2016-08-24 16:20:15

标签: java android libgdx

对于我的游戏,我必须为每个敌人创建一个新的Timer.Task,以便我可以在x秒后执行一些代码。代码执行后,我取消了该任务。当玩家与敌人发生碰撞时,会创建此计时器。那么,它会经常创建一个新的Timer.Task吗?请记住,有很多敌人。如果是这样,那么在x秒(仅1次)之后有更好的方法来执行一段代码。谢谢!

2 个答案:

答案 0 :(得分:1)

只要您重复使用任务,就不会有任何顾虑,因此您不会在渲染循环中导致大量分配和GC。一种方法是使用池。这将需要具体的Task实现,而不是匿名的。

您可以创建一个基本的PoolTask​​来扩展您的任务。完成后,实例将自动发送回池中的池,而不是收集垃圾。顺便说一下,完成后无需手动取消任务,因为Timer已经自动完成了这项任务。

public abstract class PoolTask extends Timer.Task {
    public void run (){
        doTask();
        Pools.free(this);
    }

    abstract public void doTask();
}

您可以通过将您的操作放入doTask()方法而不是run()来实现此类的子类。您的子类必须具有空构造函数,因此您可以从Pools自动获取池实例。

MyPoolTaskSubclass someTask = Pools.obtain(MyPoolTaskSubclass.class);
someTask.configure(x, y, z); //you can add config methods if it needs parameters
                             //since the constructor must be empty

Timer.scheduleTask(someTask, someDelay);

如果您的任务需要参数并且其中一些需要具有默认值,则该类应实现Poolable并在reset()方法中重新应用默认值。

答案 1 :(得分:0)

不要那样做,这不是表现明智的,有一种简单的方法来存档你想要的东西,在你的敌人渲染方法中添加以下内容:

private float timeSeconds = 0f;
private float period = 1f;

public void render() {
    [...]
        timeSeconds +=Gdx.graphics.getRawDeltaTime();
                if(timeSeconds > period){
                    timeSeconds-=period;
                    handleEvent();
                }
    [...]
}

你可以创建一个通用类来在不同的地方使用这个“计时器”,但我把它留给你。

ps:如果你不想重复它,就给它添加一个额外的条件。