0

Android 用の OpenGL ES でプログラムを実行すると、奇妙で​​予期しない結果が得られました。たとえば、次のコードをご覧ください。

matrix = ThisRot.get();
gl.glMultMatrixf(matrix, 0);
currentRotation.toMatrix(matrix);
temp.set(matrix);

gl.glMultMatrixf の引数として使用する前にマトリックス値を設定し、その後、マトリックスの値を変更して別の目的に使用しますが、オブジェクトの回転方法に影響するため、gl に影響するはずです。 glMultMatrixf()。それだけではありません。コードの他の場所で、この予期しない結果が得られました。ですから、これらは相互排除やマルチトレッドなどの原因で発生するのではないかと考えています。私は正しいですか?Android 用の Opengl ES でコーディングする場合、マルチスレッドについて心配する必要がありますか? どうすればこの種の問題を回避できますか。

4

1 に答える 1

1

もちろん、マルチスレッドについて心配する必要があります。特に、setRenderer() 関数を使用して GLRenderer 派生クラスを GLSurfaceView にアタッチすると、Android はレンダリング用に独自の GLThread を作成します。

実際、マルチスレッドは、特にオブジェクトの追加/削除などで配列をループするときに、プログラムで (予期しない動作だけでなく) クラッシュを引き起こす可能性があります。

GLRenderer と独自のスレッドの onDrawFrame 関数内で同じデータを変更しているかどうかを確認します。その場合は、変更されたコードの周りに次を追加してみてください (両方のスレッドで):

synchronize(variable) {
     modify(variable);
}

これにより、ブロックが終了するまで、modify() 関数全体で変数がロックされます。ただし、使いすぎないようにしてください。必要な場所でのみ使用してください。1 つのスレッドは、完了するまで他のスレッドをブロックします。

于 2012-07-15T16:06:21.060 に答える