私はしばらくの間、勉強してゲームを作っていましたが、最近私はAndroid向けゲームを開発しようとしています。OpenGLを搭載したAndroid用のペースの速いゲームのゲームロジックをレンダリングから分離する最も良い方法は?
私にとっては、ネイティブC++コードからAndroid Javaへのジャンプはそれほど難しくありませんでしたが、ロジックをレンダリングからどのように分離して維持することができないか考えていました。
私はここや他のサイトで周りに読んでいる:確かに Androidの意志が処理のために問題がないという理由だけで、それのために別のスレッドを作成しない方が良いです
。コード意味
はこのようなものになるだろう:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
しかし、私はそれが最善のアプローチであるかどうか分かりません。論理をGLRenderer::onDrawFrame
メソッドの中に入れれば、どうやって見えるのか気に入らないと思うので、限り、私が知っている限り、このメソッドは、描画することを意味し、私はそこにロジックを置く場合、フレームを遅くする可能性があります。それは私の理解の中でPOOの概念を傷つけることは言うまでもありません。
私はこれは私が計画していた方法です、使用してスレッドが道かもしれないと思う:
主な活動:
public void onCreate(Bundle savedInstanceState) {
//set fullscreen, etc
GLSurfaceView view = new GLSurfaceView(this);
//Configure view
GameManager game = new GameManager();
game.start(context, view);
setContentView(view);
}
GameManager:
OpenGLRenderer renderer;
Boolean running;
public void start(Context context, GLSurfaceView view) {
this.renderer = new OpenGLRenderer(context);
view.setRenderer(this.renderer);
//create Texturelib, create sound system...
running = true;
//create a thread to run GameManager::update()
}
public void update(){
while(running){
//update game logic here
//put, edit and remove sprites from renderer list
//set running to false to quit game
}
}
そして最後に、OpenGLRenderer:
ListOrMap toDraw;
public void onDrawFrame(GL10 gl) {
for(sprite i : toDraw)
{
i.draw();
}
}
これは大まかな考えであり、完全には完了していません。 このパターンはすべて分離された状態になり、やや良く見えますが、パフォーマンスにとって最適ですか?
私が研究している限り、スレッド化されたゲームのほとんどの例では、キャンバスやサーフェスビューを使用していますが、私はOpenGLESを使用しているので、それらは私のケースに合わないでしょう。
だからここに私の質問です:OpenGLESを使用した場合、レンダリングからの私の ゲームロジックを分離するための最良の方法である
?私の アプリケーションをスレッディングしますか?ロジックを別のメソッドに入れ、drawメソッドを から呼び出すだけですか?
すばらしい答えスティーブ、ありがとう!私はデザインを台無しにしたくないと思っても、私は#1に従います。私のゲームはアクティブですが、物理学や衝突チェックのような重い計算はありません。ちょうど私の考えについて確かめるために、もし私がそれを選んだら(論理的なスレッドを同期マップに書いて、それを読んでいるスレッドをレンダリングして)質問のスレッドのアプローチが正しいでしょうか? –
ああ、もう1つ。人々は私のロジックアップデートを30fpsに制限すると言っていましたが、これはレンダリングの場合もそうですか?私は、すべての更新のために33msを待つために関数全体を制限するべきですか、または最後の更新以来33msを過ぎた場合にはロジックを更新するだけですか? –
私はあなたがそれを制限する必要はないと思っていますが、おそらくそれはいくつかの携帯電話のそれよりも期待することはありません。これは、最初のHDPI電話機のいくつかのフレームレート(私はDroid 1の周りにあると思います)が限られているため、1秒間に約30回以上のピクセルで画面を描画できなかったためです。おそらく、GPUはそれより速くフレームを送り出すことができますが、CPUは画面をすばやく動かすことができません。これは、私が思うより新しい携帯電話の場合ではありません。 –