现在我有(1: UI-循环,我的SurfaceView被放置在那里),(2:第二个线程,从UI-循环调用绘制函数,并从我的引擎更新计算)和(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) {
}
}这段代码是否足以保证独立于低帧率?如果不是,我该怎么做呢?
提前感谢!
发布于 2010-08-28 02:23:26
http://dewitters.koonsolo.com/gameloop.html
这是我所知道的最好的简短课程之一。它展示了3种不同的方法来做你正在寻找的事情。
发布于 2010-08-25 00:01:58
现在,我在这方面没有足够的经验来给你一个明确的答案,我相信很快就会有人来给你这个答案。然而,在此期间,我将提供我的想法:
因此,问题是如何确保SurfaceView看起来很好和平滑,而不管帧速率如何?
对于这样的事情,我认为一种常见的实现是使用double/mulitple buffering
这样,您就可以在背景中绘制框架,一旦框架准备就绪,就可以将新框架切换为旧框架。
假设你有两个画布A,B。
您向用户显示A,而在后台您正在准备B。当客户端请求新帧时,您可以向他们显示A,或者如果B准备就绪,您可以向他们显示B。
https://stackoverflow.com/questions/3558284
复制相似问题