补偿游戏逻辑更新的绘图延迟

时间:2010-08-24 15:46:18

标签: java android

现在我有了(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) { 
        }

 }

此代码是否足以确保独立于低帧速率?如果没有,我的去向何方?

提前致谢!

2 个答案:

答案 0 :(得分:4)

http://dewitters.koonsolo.com/gameloop.html

这是我所知道的最好的短期课程之一。它显示了3种不同的方式来完成你正在寻找的东西。

答案 1 :(得分:2)

现在,我没有足够的经验给你一个明确的答案,我相信有人会很快就会给你这个。与此同时,我会提出我的想法:

所以问题是如何确保SurfaceView看起来漂亮和平滑,无论帧速率如何?

对于这样的事情,我认为一个常见的实现是使用double/mulitple buffering

从而在背景中绘制框架,并在准备就绪后,切换旧框架的新框架。

所以想象你有两幅画布A,B。

您向用户显示A,而在后台准备B.当客户端请求新帧时,您要么显示A,要么B准备就绪,您将其显示为B.

相关问题