2

スレッドでゲームループを実行しています。私の問題は、

mGLSurfaceView.requestRender();

null ポインター例外でクラッシュします。サーフェスが作成されたことを証明する onSurfaceCreated メソッドにログ タグがあるので (少なくとも私はそう思います)、それは問題ではありません。

問題は、requestRender が非静的参照を必要とすることだと考えています。別のメソッドへの非静的参照を呼び出そうとすると、代わりにその行でクラッシュしました。したがって、スレッドは非静的とあまり友好的ではないとしか思えません。また、requestRender への静的参照を作成することもできません (これは明らかな解決策です)。

ここに私のゲームループスレッドがあります

import android.util.Log;

public class GameLoop extends Thread {

    private MyGLSurfaceView myGLSurfaceView;
    private final static int maxFPS = 30;
    private final static int maxFrameSkips = 5;
    private final static int framePeriod = 1000 / maxFPS;

    public static boolean running;
    public final static String TAG = "input";

@Override
public void run() {
    running = LaunchActivity.getRunning();
    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;


    sleepTime = 0;
    while (running) {
        running = LaunchActivity.getRunning();
        Log.d(TAG, "gameRunning");
        beginTime = System.currentTimeMillis();
        framesSkipped = 0;
            // notice the static reference here
        GameLogic.update();
        Log.d(TAG, "updated");
            // not static here
        myGLSurfaceView.requestRender();
        Log.d(TAG, "rendered");
        timeDiff = System.currentTimeMillis() - beginTime;
        sleepTime = (int)(framePeriod - timeDiff);

        if (sleepTime > 0) {
            try{
                Thread.sleep(sleepTime);
                Log.d(TAG, "sleeping" + String.valueOf(sleepTime));
            }catch(InterruptedException e){}
        }

        while(sleepTime < 0 && framesSkipped < maxFrameSkips){
            GameLogic.update();
            sleepTime += framePeriod;
            framesSkipped++;
            Log.d(TAG, "Frames Skipped");
        }




}
}


}

そして、これが私のサーフェス作成方法です(これは、長い目で見ると問題の一部になる可能性があります)

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    Log.d(TAG, "SurfaceCreated");

}

ああ、ちなみに私は使っています

glOrthof

投影

スタックトレース

10-05 20:26:44.694: ERROR/AndroidRuntime(18276): FATAL EXCEPTION: Thread-11
10-05 20:26:44.694: ERROR/AndroidRuntime(18276): java.lang.NullPointerException
10-05 20:26:44.694: ERROR/AndroidRuntime(18276):     at basicmelon.games.androidgamething.GameLoop.run(GameLoop.java:33)
10-05 20:26:44.694: ERROR/AndroidRuntime(18276):     at java.lang.Thread.run(Thread.java:1096)

ログタグ

10-05 20:28:23.077: DEBUG/input(18923): GLSurfaceViewed
10-05 20:28:23.116: DEBUG/input(18923): Created
10-05 20:28:23.116: DEBUG/input(18923): Resumed
10-05 20:28:23.124: DEBUG/input(18923): gameRunning
10-05 20:28:23.132: DEBUG/input(18923): Updated
10-05 20:28:23.210: DEBUG/input(18923): Paused
4

1 に答える 1

1

MyGLSurfaceView オブジェクトを作成することはありません。次の行を while ループの前のどこかに配置する必要があります。

myGLSurfaceView = new MyGLSurfaceView();
于 2011-10-05T19:41:46.787 に答える