Android - перевод GLSurfaceView.Renderer в спящий режим (как в Thread.sleep (20)) вне метода OnDrawFrame - PullRequest
2 голосов
/ 04 мая 2011

Я хочу контролировать скорость рендеринга моего GLSurfaceView.Renderer.Я реализовал поток в классе, который расширяет GLSurfaceView, и периодически переводил его в спящий цикл (true), который ничего не делал для замедления рендерера.Есть хороший ответ здесь , который предлагает перевести поток GL в спящий режим с помощью Thread.sleep в методе Renderer.onDrawFrame ().Я бы хотел справиться с этим вне класса Renderer.Как это можно сделать, когда явный вызов требует передачи объекта GL10?Спасибо.

1 Ответ

3 голосов
/ 08 декабря 2011

Не расширяйте GLSurfaceView.Если вы еще этого не сделали, сохраните рендерер в качестве переменной в вашем классе активности:

public class MyActivity extends Activity {

    protected GLSurfaceView mGLView;
    protected GraphicsRenderer graphicsRenderer; // keep reference to renderer

    protected void initGraphics() {

        graphicsRenderer = new GraphicsRenderer(this);

        mGLView = (GLSurfaceView) findViewById(R.id.graphics_glsurfaceview1);
        mGLView.setEGLConfigChooser(true);         
        mGLView.setRenderer(graphicsRenderer);

        graphicsRenderer.setFrameRate(30);


    }
}

Затем вы можете создать метод в вашем рендере для управления частотой кадров:

public class GraphicsRenderer  implements GLSurfaceView.Renderer {

    private long framesPerSecond;
    private long frameInterval; // the time it should take 1 frame to render
    private final long millisecondsInSecond = 1000;

    public void setFrameRate(long fps){

        framesPerSecond = fps;

        frameInterval= millisecondsInSeconds / framesPerSecond;

    }


    public void onDrawFrame(GL10 gl) {

        // get the time at the start of the frame
        long time = System.currentTimeMillis();

        // drawing code goes here

        // get the time taken to render the frame       
        long time2 = System.currentTimeMillis() - time;

        // if time elapsed is less than the frame interval
        if(time2 < frameInterval){          
            try {
                // sleep the thread for the remaining time until the interval has elapsed
                Thread.sleep(frameInterval - time2);
            } catch (InterruptedException e) {
                // Thread error
                e.printStackTrace();
            }
        } else {
            // framerate is slower than desired
        }
    }

}
...