Передача контекста GLSurfaceView в поток
Я хочу, чтобы мой GL Renderer был установлен на "DIRTY" и использовал поток для управления FPS, но по какой-то причине requestRender
звонок кажется пропущенным все вместе. У меня есть ощущение, что это может быть связано с тем, что поток не получает нужного контекста. Кто-нибудь знает хорошую практику для прохождения GLSurfaceView
контекст для других потоков?
Вот моя тема:
public class GameLoop extends Thread {
private GLSurfaceView 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";
public GameLoop(){
myGLSurfaceView = MyLaunchActivity.getMyGLSurfaceView();
}
@Override
public void run() {
running = MyLaunchActivity.getRunning();
long beginTime;
long timeDiff;
int sleepTime;
int framesSkipped;
sleepTime = 0;
while (running) {
running = MyLaunchActivity.getRunning();
//Log.d(TAG, "gameRunning");
beginTime = System.currentTimeMillis();
framesSkipped = 0;
GameLogic.update();
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");
}
}
}
}
А вот и конструктор для моего поверхностного вида...
public MyGLSurfaceView(Context context, AttributeSet attrs){
super(context, attrs);
myGLSurfaceRenderer = new MyGLSurfaceRenderer();
setRenderer(myGLSurfaceRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
Log.d(TAG, "GLSurfaceViewed");
}
1 ответ
myGLSurfaceView = MyLaunchActivity.getMyGLSurfaceView();
Несколько вопросов о вашем коде:
- Как вы устанавливаете контекст?
- Проверяли ли вы, что вы создали объект GameLoop после инициализации MyGLSurfaceView, возвращаемого MyLaunchActivity.getMyGLSurfaceView()?
Первое, что вы можете сделать, это добавить предложение catch для Exception в ваш метод run(), чтобы увидеть, есть ли какая-либо проблема, объясняющая, почему метод не вызывается.