對於我的遊戲,我必須爲每個敵人創建一個新的Timer.Task,以便在x秒後執行一段代碼。代碼執行後,我取消了該任務。這個計時器是在玩家與敵人相撞時創建的。那麼,是否會經常創建一個新的Timer.Task來影響我的性能?請記住,有很多敵人。如果是這樣,那麼是否有更好的方法在x秒後執行一段代碼(只有1次)。謝謝!Libgdx |性能是否通過每幀創建新的Timer.Task來實現?
0
A
回答
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:如果你不想重複,給它一個額外的條件。
相關問題
- 1. 是否爲每個實例重新創建對象屬性?
- 2. 通過傳遞params來創建新模型是否安全?
- 3. 每次android都通過Intent創建新的實例活動?
- 4. 是否有通過DbDataReader實現的IQueryable?
- 5. 如何通過複製現有的UIViewController來創建新的UIViewController?
- 6. 如何通過istio實現高性能
- 7. 運算符++(int x)是否每次都創建新的實例?
- 8. 創建通過實現Runnable接口
- 9. 什麼是通過調用_mm_stream_si64x()來實現性能增益的示例程序?
- 10. core.async是否可以通過序列實現它的功能?
- 11. 是否有可能創建System.Windows.Media.Projection的自定義實現
- 12. 如何通過擴展__init__參數來創建實例屬性?
- 13. 是否有可能使用MongoDB來實現Lagom持久性?
- 14. 是否有任何新的api來創建功能,如iBook
- 15. 在通過列添加創建的表之間是否存在性能差異?
- 16. 是否每次調用新的Handler(Looper.getMainLooper())創建它的新實例?
- 17. 是否有可能通過mysql獲取表的創建語法?
- 18. Xcode4是否具有自動實現創建功能?
- 19. 是否有可能通過屬性來分解渲染用戶?
- 20. 是否可以通過擴展POJO來構建JPA實體?
- 21. startService()是否創建一個新的Service實例或使用現有的實例?
- 22. 通過使用xpath在c#中過濾現有文檔來創建新的XMLDocument
- 23. 是否有可能通過PowerShell'更新'ADF管線屬性
- 24. 通過數據幀迭代來創建PDF文檔
- 25. 通過fromList創建(非列表)數據結構是否實際創建列表?
- 26. R:創建新的數據幀行是來自另一個數據幀的列
- 27. 每幀重新創建FBO(幀緩衝對象)
- 28. 是否有可能爲接口創建對象,而無需通過java中的任何類實現此目標?
- 29. 是否可以通過API在Basecamp中創建新項目?
- 30. 是否通過引用傳遞避免創建新變量?
yes,'android.os.Handler'及其「延遲」方法 – pskink
@pskink這看起來不是跨平臺的。 –
Libgdx任務與Android處理程序無關。任務在GL線程上運行。 – Tenfour04