У меня работает gameloop в потоке, моя проблема в том, что
mGLSurfaceView.requestRender();
аварийно завершает работу с исключением нулевого указателя.У меня есть метод log в моем методе 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
проекция
StackTrace
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)
Журнал TAG
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