现在我有了(1:UI循环,放置了我的SurfaceView),(2:第二个线程,来自UI循环的绘制函数被称为AND我的引擎的更新计算)和(3 :引擎,所有的计算都是)。
现在我想知道如何使SurfaceView独立于实际帧速率的最佳和最流畅的方式。如果帧速率较低,我该怎么办呢?
我认为目前的解决方案还不够,请参阅下面的代码。
主题级
//Constructor stuff....
int static delay = 0; /* My delay in milliseconds, depends most on
which sort of game I'm trying to make */
@Override
public void run() {
while (state==RUNNING) {
long beforeTime = System.nanoTime();
engine.updateSprites(); //Update calculations from my engine
//Rita
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
view.myDraw(c); //My draw function
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
sleepTime = delay-((System.nanoTime()-beforeTime)/1000000); /* 1000000 because
of the nanoTime gives us the current timestamp in nanoseconds */
try {
if(sleepTime>0){
Thread.sleep(sleepTime);
}
} catch (InterruptedException ex) {
}
}
此代码是否足以确保独立于低帧速率?如果没有,我的去向何方?
提前致谢!
答案 0 :(得分:4)
http://dewitters.koonsolo.com/gameloop.html
这是我所知道的最好的短期课程之一。它显示了3种不同的方式来完成你正在寻找的东西。
答案 1 :(得分:2)
现在,我没有足够的经验给你一个明确的答案,我相信有人会很快就会给你这个。与此同时,我会提出我的想法:
所以问题是如何确保SurfaceView看起来漂亮和平滑,无论帧速率如何?
对于这样的事情,我认为一个常见的实现是使用double/mulitple buffering
从而在背景中绘制框架,并在准备就绪后,切换旧框架的新框架。
所以想象你有两幅画布A,B。
您向用户显示A,而在后台准备B.当客户端请求新帧时,您要么显示A,要么B准备就绪,您将其显示为B.