0

Android デベロッパーの皆様、こんにちは。

モードが「Render_when_dirty」に等しい場合、GLSurfaceView の現在のレンダリング フェーズを中断して新しいフェーズを開始する最良の方法は何ですか? フラグをチェックし、「onDraw」メソッドで呼び出される実際のレンダリングメソッドから戻ることにより、「onDraw」メソッドで人為的にレンダリングを停止します。次に、メイン スレッドのコンテキストで、「requestRender()」を呼び出してシーンを更新します。ただし、私が認識していない理由により、中間の古いフレームのいくつかは非常に短い期間表示されます(一方で、それらはユーザーが移行を認識できるほど長い期間保持されます) ; 実際のシーンが opengl es 2.x エンジンによってレンダリングされる前。何にも影響しません。しかし直すの面倒。何を指示してるんですか?

PS onDraw メソッド内で InterruptedException をスローしても、GLSurfaveView の実際のレンダリング スレッドが破壊されるため役に立ちません。

敬具。

4

1 に答える 1

0

古いフレームの一部が描画されていると言う場合、描画されたフレームの一部が古いということですか、それとも onDraw() を複数回呼び出すと、古い情報の一部がディスプレイに表示されることになります。

ここで起こっていることがいくつかあります。次のような onDraw() がある場合:

  onDrawFrame(){
  ... stuff ...
  if (stateVariableSet)
     return;
  ... stuff ...

私の理解では、関数の実行が完了すると、バック/フロント バッファーがスワップされて描画されるということです。ここで発生している可能性のあることの 1 つは、state/State 変数を更新しようとしているときに onDrawFrame() の呼び出しがいくつかレンダリングされることです。

一方、次のようなものがある場合:

   onDrawFrame(){
   ... stuff..
   semaphore.acquire(); // lock the thread waiting for the state to update
   ... stuff ...

ロックの前に描画されたものは古くなります(ただし、そのフレームのみ-少なくともそれは私が予想していることです)。

また、マルチコア システムで実行していますか?

于 2013-04-05T17:17:38.073 に答える