Android——在 OnDrawFrame 方法之外将 GLSurfaceView.Renderer 置于睡眠状态(如 Thread.sleep(20))

2024-04-06

我想控制 GLSurfaceView.Renderer 的渲染速率。我在扩展 GLSurfaceView 的类中实现了一个线程,并在 while(true) 循环中定期将其置于睡眠状态,这不会减慢渲染器的速度。有一个很好的答案here https://stackoverflow.com/questions/4772693/how-to-limit-framerate-when-using-androids-glsurfaceview-rendermode-continuously建议通过在 Renderer.onDrawFrame() 方法中使用 Thread.sleep 将 GL 线程置于睡眠状态。我想从 Renderer 类之外处理它。当显式调用需要传入 GL10 对象时如何做到这一点?谢谢。


不要扩展 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
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android——在 OnDrawFrame 方法之外将 GLSurfaceView.Renderer 置于睡眠状态(如 Thread.sleep(20)) 的相关文章

随机推荐