Android - 游戏循环中的主动渲染?
Android - active rendering in game loop?
在 android 的游戏循环中渲染的最佳方式是什么?
当我在 java 中渲染时,我知道该怎么做。我创建缓冲区策略,而不是图形,我绘制,而不是处理和翻转缓冲区。 Andorid 有类似的吗?
我查看了视图,但当我尝试大量绘制时它无法正常工作。我查看了 SurfaceView,但我不明白如何刷新它的绘图。 invalidate 打破循环,postInvalidate 不起作用。我锁定 canvas 并在其上绘制,而不是在表面视图的 "create" 方法中解锁和 post(在循环中锁定 canvas 不起作用,应用程序中只有白屏出现)。所以我不明白。
在 Android 中大量渲染的最有效方法是什么?
在 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。
在 android 的游戏循环中渲染的最佳方式是什么?
当我在 java 中渲染时,我知道该怎么做。我创建缓冲区策略,而不是图形,我绘制,而不是处理和翻转缓冲区。 Andorid 有类似的吗?
我查看了视图,但当我尝试大量绘制时它无法正常工作。我查看了 SurfaceView,但我不明白如何刷新它的绘图。 invalidate 打破循环,postInvalidate 不起作用。我锁定 canvas 并在其上绘制,而不是在表面视图的 "create" 方法中解锁和 post(在循环中锁定 canvas 不起作用,应用程序中只有白屏出现)。所以我不明白。
在 Android 中大量渲染的最有效方法是什么?
在 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。