什么是在Android游戏循环中渲染的最佳方式?
当我在java中渲染时,我知道如何做到这一点。我创建缓冲区策略,比绘制图形,我绘制,比处置和翻转缓冲区。安道尔是否相当于那个?
我查看了视图,但是当我尝试绘制时,它无法正常工作。我查看了SurfaceView,但我无法理解如何刷新它的绘图。 invalidate打破循环,postInvalidate不起作用。我锁定画布并在其上绘制,然后从表面视图解锁并在“创建”方法中发布(在循环中锁定画布不起作用,仅显示应用程序中的白色屏幕)。所以我不明白。
什么是在Android中大量渲染的最有效方法?
答案 0 :(得分:3)
在SurfaceView中渲染的常用方法是通过其SurfaceHolder。
通常你会通过持有人获得Canvas并在其上画画:
SurfaceHolder surfaceHolder = surfaceView.getHolder();
Canvas canvas = surfaceHolder.getSurface().lockCanvas();
//draw in the canvas
canvas.drawPoint(...);
surfaceHolder.unlockCanvasAndPost(canvas);
正确的方法是在一个单独的线程(渲染线程)中循环lockCanvas()
和unlockCanvasAndPost()
(包括)之间的所有代码,并在内部使用Thread.sleep()
控制帧速率循环。
修改强>:
有许多方法可以控制渲染线程的FPS,这是一个基本的方法,只需将常用的FPS设置为常量:
public class RenderThread extends Thread {
private boolean running;
private final static int MAX_FPS = 30;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
@Override
public void run() {
long beginTime;
long timeDiff;
int sleepTime;
sleepTime = 0;
while (running) {
beginTime = System.currentTimeMillis();
//RENDER
// How long did the render take
timeDiff = System.currentTimeMillis() - beginTime;
// calculate sleep time
sleepTime = (int)(FRAME_PERIOD - timeDiff);
if (sleepTime > 0) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {}
}
}
}
}
如果你搜索游戏循环,有很多references。