2017-08-24 40 views
0

首先我將解釋我想要做什麼以及後續處理,我將提供一個建議的解決方案。Java拆分框架之間的工作

問題

我運行一個遊戲,我想這樣做一定量的工作的每一個幀。例如,我有N個對象在隊列中等待初始化(假設初始化是一個相當昂貴的操作,N很大),並且在添加它們之後,我想創建它們的衝突框,然後,我想要將它們合併在一起以限制呈現調用。我不能在不同的線程上進行這些操作,因爲所有這些東西都與遊戲世界密切相關。但是我想把所有這些操作分成一塊大小的塊來運行每一幀,以便有最小的延遲(幀率下降)。我會如何去做這件事?

建議的解決方案

這將是很好有一個功能,可以一個電話後停下來,繼續在那裏再次調用它後離開:

例如,

boolean loadEverything() { 
    for (int i = 0; i < objectsToAdd.length; i++) { 
     world.add(objectsToAdd[i]); 
     if (i % 10 == 0) { 
      return stop(); 
     }   
    } 

    makeCollision(); 
    return stop(); 

    mergeObjects(); 

    return true; 
} 

呼叫loadEverything()第一個objectsToAdd/10次一次向遊戲世界添加10個對象。然後調用它應該運行makeCollision()然後停止。再次調用它將運行mergeObjects(),然後函數返回true。在調用者函數中,我將運行loadEverything(),直到它返回true。

我知道yeild-return,yield-break類似於here的實現存在,但我想知道是否有更一般的實現,或者可能存在一個不需要任何更好的解決方案額外的依賴關係。

回答

0

你看看Coroutine了嗎?有原生implementation in Kotlin,但在Java中有選項herehere

通過一切手段,我們需要確保需要在主線程中的OpenGL或Box2D操作應該在主線程中,因爲我相信在新線程下會創建協程。因此,這些類型的作業可能無法分割作品。

另一個選項

你說你需要創建在運行時的對象分裂的作品。你能預測或估計你想要的對象數量嗎?所以如果你不需要動態創建這樣的對象,我建議看看libgdx中的對象池(參見更多here)。該鏈接有一個工作示例,可以在遊戲中使用Pool。

這樣的Pool已經有了初始化的對象,可以隨時抓取和使用,如果需要在運行時也可以增長,所以最初如果您可以提供對打算使用的對象數量的良好估計,那一切都很好。

0

爲什麼不添加一個靜態變量來保持函數調用之間的值?然後,您可以從當前值循環到當前值+ 10,將當前值(該靜態變量)增加10並退出。