Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 补偿游戏逻辑更新导致的绘图延迟_Java_Android - Fatal编程技术网

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

Java 补偿游戏逻辑更新导致的绘图延迟,java,android,Java,Android,现在我有(1:UI循环,我的SurfaceView放在那里),(2:第二个线程,从UI循环调用draw函数,从我的引擎更新计算)和(3:引擎,所有的计算都在那里) 现在,我想知道如何独立于实际帧速率进行SurfaceView的最佳和最平滑的方法。如果帧速率较低,它将如何补偿 我认为我目前的解决方案还不够,请参阅下面的代码 螺纹类 //Constructor stuff.... int static delay = 0; /* My delay in milliseconds, depends

现在我有(1:UI循环,我的SurfaceView放在那里),(2:第二个线程,从UI循环调用draw函数,从我的引擎更新计算)和(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) { 
        }

 }
该代码是否足以确保独立于低帧速率?如果没有,我该怎么办


提前谢谢

现在,我还没有足够的经验给你一个明确的答案,我相信很快就会有人给你这个答案。然而,在此期间,我将提供我的想法:

因此,问题是如何确保SurfaceView显示良好且平滑,而不考虑帧速率

对于类似的东西,我相信一个常见的实现是使用

这样,您就可以在背景中绘制帧,一旦准备就绪,就可以将新帧切换为旧帧

假设你有两张画布A,B


您向用户显示A,而在后台您正在准备B。当客户端请求一个新帧时,您可以向他们显示A,或者如果B已准备好,则向他们显示B。

现在,我在这方面的经验不足,无法给您一个明确的答案,我相信很快会有人给您这个答案。然而,在此期间,我将提供我的想法:

因此,问题是如何确保SurfaceView显示良好且平滑,而不考虑帧速率

对于类似的东西,我相信一个常见的实现是使用

这样,您就可以在背景中绘制帧,一旦准备就绪,就可以将新帧切换为旧帧

假设你有两张画布A,B

在后台准备B时,您向用户显示A。当客户端请求新帧时,您可以向用户显示A,或者如果B已准备好,则向用户显示B。

这是我所知道的最好的短训之一。它显示了3种不同的方法来完成您想要的任务。


这是我所知道的最好的短训之一。它显示了3种不同的方法来完成您想要的操作。

是的,无论帧速率如何,都可以使SurfaceView平滑。你写的另一个选项不是Android的工作方式。Android Surface不像常规的双缓冲。哦,好吧,这很有趣。我发现这样的回答:这解释了缓冲是如何工作的。在这一页上,有一个建议是创建您自己的缓冲区,以便您的前/后缓冲区以标准方式进行双缓冲。不过,它需要一个额外的缓冲区大小副本,因此与您添加周期延迟的想法相比,它可能并不理想。但是你有没有双重缓冲的例子,比如“创建你自己的缓冲”?不过,关于延迟的问题仍然存在。是的,不管帧速率如何,都可以使SurfaceView平滑。你写的另一个选项不是Android的工作方式。Android Surface不像常规的双缓冲。哦,好吧,这很有趣。我发现这样的回答:这解释了缓冲是如何工作的。在这一页上,有一个建议是创建您自己的缓冲区,以便您的前/后缓冲区以标准方式进行双缓冲。不过,它需要一个额外的缓冲区大小副本,因此与您添加周期延迟的想法相比,它可能并不理想。但是你有没有双重缓冲的例子,比如“创建你自己的缓冲”?不过,关于延迟的问题仍然存在。现在是他推荐的预测/插值解决方案在我的代码中实现。我被迫把它从C++转换成类似java的代码,它工作了!谢谢你,沃伦!嗯,我不明白,你为什么不从我这里得到你的赏金?我想我会在5天内得到:)在这段时间里,如果你觉得更好,你可以选择另一个答案。现在他的推荐预测/插值解决方案在我的代码中实现了。我被迫把它从C++转换成类似java的代码,它工作了!谢谢你,沃伦!嗯,我不明白,你为什么不从我这里得到你的赏金呢?我想我5天内就能得到:)在这段时间里,如果你觉得更好的话,你可以选择另一个答案