Передача контекста GLSurfaceView в поток - PullRequest
0 голосов
/ 29 октября 2011

Я хочу, чтобы мой 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 Ответ

1 голос
/ 29 октября 2011
myGLSurfaceView = MyLaunchActivity.getMyGLSurfaceView();

Некоторые вопросы о вашем коде:

  • Как установить контекст?
  • Вы проверили, что вы создали объект GameLoop после инициализации MyGLSurfaceView, возвращенного MyLaunchActivity.getMyGLSurfaceView ()?

Первое, что вы можете сделать, это добавить предложение catch для Exception в ваш метод run (), чтобы увидеть, есть ли какая-либо проблема, объясняющая, почему метод не вызывается.

...