2016-08-24 63 views
0

對於我的遊戲,我必須爲每個敵人創建一個新的Timer.Task,以便在x秒後執行一段代碼。代碼執行後,我取消了該任務。這個計時器是在玩家與敵人相撞時創建的。那麼,是否會經常創建一個新的Timer.Task來影響我的性能?請記住,有很多敵人。如果是這樣,那麼是否有更好的方法在x秒後執行一段代碼(只有1次)。謝謝!Libgdx |性能是否通過每幀創建新的Timer.Task來實現?

+0

yes,'android.os.Handler'及其「延遲」方法 – pskink

+0

@pskink這看起來不是跨平臺的。 –

+0

Libgdx任務與Android處理程序無關。任務在GL線程上運行。 – Tenfour04

回答

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()實現這個子類。你的子類必須有一個空的構造函數,所以你可以從池中自動獲得池化實例。

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); 

如果任務需要的參數,其中一些需要有默認值,類應該實現可池化,並在reset()方法重新應用默認值。

0

不要這樣幹,這不是明智的性能,還有一個更簡單的方法來存檔你想要什麼,你的敵人內部渲染方法,只需添加以下內容:

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

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

你可以創建一個通用類在不同的地方使用這個「計時器」,但我把它留給你。

ps:如果你不想重複,給它一個額外的條件。

相關問題