2017-08-24 16 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; 
} 

呼び出し、例えば

:1回のコールの後に停止し、それが再びそれを呼び出した後に中断したところから続けることができる機能を持っていいだろうソリューション

を提案

loadEverything()最初のobjectsToAdd/10回は、一度に10個のオブジェクトをゲーム世界に追加します。その後、それを呼び出してmakeCollision()を実行してから停止してください。再度呼び出すとmergeObjects()が実行され、関数はtrueを返します。呼び出し元関数では、trueを返すまでloadEverything()を実行します。

hereのようなイールド・リターン・イールド・ブレイク・インプリメンテーションについては知っていますが、より一般的なインプリメンテーションがあるのか​​、それとももっと良い解決策が必要なのかは疑問です余分な依存関係。

答えて

0

コルーチンを見ていますか?ネイティブはimplementation in Kotlinですが、Javaにはオプションherehereがあります。

私はコルーチンが新しいスレッドの下で作成されると思うので、メインスレッドに必要なOpenGLまたはBox2D操作がメインスレッドにあることを確認する必要があります。そのような操作のために作品を分割することは得策ではないかもしれません。

別のオプション

あなたは、実行時にオブジェクトを作成する際に作品を分割する必要があると言います。手前で望むオブジェクトの数を予測したり、見積もったりできますか?そのようなオブジェクトを動的に作成する必要がない場合は、libgdxのオブジェクトプールを参照することをお勧めします(詳細はhereを参照してください)。このリンクには、あなたのゲームでPoolを使用する実例があります。

このようなプールには、オンデマンドでグラブして使用する準備ができているオブジェクトが既に用意されています。また、実行時に必要に応じて拡張できるため、使用するオブジェクトの数を見積もることができれば、 。

0

なぜ関数呼び出しの間に値を保持する静的変数を1つ追加しないのですか?その後、現在の値から現在の値+ 10にループし、現在の値(その静的変数)を10だけ増加させて終了することができます。