シンプルな 3D エンジンで Android アプリを作成しています。以前は機能していましたが、信じられないほど面倒でした。私はそれをリファクタリングしましたが、3D エンジンにはほとんど手を加えていません。draw() メソッド (GLSurfaceView.Renderer を実装するクラス内の onDrawFrame 内から呼び出される) 内で translatef を呼び出すと、x/z float 変数の現在の値が使用されないという、非常に奇妙な問題に直面しています。クラスにスコープされます。説明できません。それらを初期値にリセットするコードはありませんが、それが起こっています。これらの変数が変更されるのは、クラスがインスタンス化されたとき (一度実行され、二度と変更されない)、ユーザー入力によって変数が変更されたとき (可能なすべてのポイントでデバッガーを使用して正確であることが検証されたとき)、および translatef が呼び出されたときだけです。
問題は、translatef メソッドによって読み取られたときにコンストラクターに渡された初期値は常にですが、それ以外の場合は、クラス内の他の時点で使用または変更されたときに正確です。たとえば、z を z + 1 に設定すると、translatef によって読み取られる値に関係なく、その値のままになります。何を与える?draw() および/または translatef() メソッドが何らかの形で元の値に固執し、変更された値を読み取らない理由について、私は途方に暮れています。テスト プラットフォームとして GL ES 1.0 と Android 2.2 を使用しています。
ここにすべてをダンプするには多すぎますが、問題を解決するにはこれで十分です。
private float movex, movez;
public GLEngine(){
//The values are set in the constructor and are accurate at this point.
movex = Controller.getX();
movey = Controller.getZ();
}
public void move(float x, float z){
//Again, debugging in here shows that the values are being set properly.
movex = x;
movez = z;
}
public void onDrawFrame(GL10 gl){
//Debugging anywhere within this method shows only the values for movex and
//movez that were set in the constructor.
...
gl.translatef(movex, .5f, movez);
...
これはスレッド化の問題に関連している可能性が高いため、movex と movez を揮発性にするためのヒントを得ました (ただし、ここではスレッドを明示的に宣言していません) が、それは役に立ちませんでした。
両方の値がクラスの外部に保持されているため、onDrawFrame メソッドでコントローラーからそれらをプルすることでこれを機能させることができましたが、これには変数をプルする必要があり、描画のたびにそれらに対して追加の操作を実行する必要があり、コストがかかります。 . もっと良い方法があるはずです...