9

ゲームエリアの地図を表示するGLSurfaceViewを作成しようとしています。プレーヤーが移動すると、ゲームアクティビティはhighlightSpotを呼び出します。これにより、レンダリングリクエストがトリガーされます。ビューを再描画したいのは、プレーヤーが移動したときだけです。

ただし、現在の実装でsetRenderMode(RENDERMODE_WHEN_DIRTY)は、GLSurfaceViewを呼び出しても、レンダリングモードは継続しているように見えます。確認するために、onDrawFrameメソッドで1つのprintlnステートメントをスローしました。アプリケーションを実行すると、プレーヤーが1回も移動しなくても、出力がすぐにlogcatでいっぱいになります。これは、意図したとおりに動作していないことは明らかです。要求されたときにのみビューをレンダリングするために他に何かする必要がありますか?

(このコードの大部分は、http://insanitydesign.com/wp/projects/nehe-android-ports/のチュートリアルから派生しています。簡潔にするために、onDrawFrame、OnSurfaceChanged、およびonSurfaceCreatedメソッドを省略しました。レンダリングモードを変更したり、これらのメソッドのどこかでレンダリングを要求したりしないでください。誰かがそれが関連していると思われる場合は、それらも投稿できます。)

public class SurfaceViewClass extends GLSurfaceView implements Renderer {
    public SurfaceViewClass(Context context) {
        super(context);

        ...

        this.setRenderer(this);
        this.setRenderMode(RENDERMODE_WHEN_DIRTY);
    }

    public void highlightSpot(int x, int y) {
        /* change some variables here */
        ...

        this.requestRender();
    }
}
4

1 に答える 1

7

OK、私はこれを整理したと思います。レンダリングモードを設定する場所は、GLSurfaceViewコンストラクターではなく、GLSurfaceViewオブジェクトを含むクラスのようです。また( GLSurfaceViewのAndroidドキュメントで見落としていたと思います)、レンダラーを設定する前にGLSurfaceViewのレンダリングモードを設定することはできません。これが、コンストラクターでレンダリングモードを設定しようとしても機能しない理由である可能性があります。

これにより、必要なときにのみレンダリングが強制されるようです。これはまさに私が望んでいたことです。

public class Game extends Activity {
private GLSurfaceView glSurface;
private SurfaceViewClass svc;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    glSurface = (GLSurfaceView) findViewById(R.id.SurfaceView01);

    svc = new SurfaceViewClass(this);
    glSurface.setRenderer(svc);
    glSurface.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

public void movePlayer() {
    svc.highlightSpot(location[PLAYER], 0);
    glSurface.requestRender();
}
}
于 2010-12-02T04:21:38.717 に答える