的Android游戏循环使用postdelayed螺纹()

问题描述:

我想我使用用于游戏线程循环这个代码是巧妙,而不是通常的while(running)循环:的Android游戏循环使用postdelayed螺纹()

@Override 
    public void run() { 
     Log.d(TAG, "+ run()"); 
     final long [] old = new long [] { System.currentTimeMillis() }; 
     Log.w(TAG,"Start time=" + old[0]); 

     Thread loop = new Thread() { 
      public void run() { 
       if(running) { 
        Canvas canvas = null; 
        try { 
         canvas = mSurfaceHolder.lockCanvas(null); 
         long t = System.currentTimeMillis(); 
         Log.w(TAG,"Loop time=" + t + ", delta=" + (t-old[0])); 
         old[0] = t; 
         synchronized(mSurfaceHolder) { 
          mGame.update(); 
          mGame.onDraw(canvas); 
         } 
        } 
        finally { 
         // Do this in finally so that if an exception is thrown 
         // we don't leave the Surface in an inconsistent state 
         if(canvas != null) { 
          mSurfaceHolder.unlockCanvasAndPost(canvas); 
         } 
        } 
        Log.i(TAG, "Posting thread with delay " + interval + " milliseconds"); 
        handler.postDelayed(this, interval); 
       } 
      }; 
     }; 
     Log.i(TAG, "Posting thread with no delay"); 
     handler.post(loop); 
     Log.d(TAG, "- run()"); 
    } 

第一线程被张贴,则每个线程以给定的延迟将自己重新排队。

它生产这个记录(部分):

03-09 12:51:22.665: D/GameLoop(3116): + run() 
03-09 12:51:22.665: W/GameLoop(3116): Start time=1362826282665 
03-09 12:51:22.665: I/GameLoop(3116): Posting thread with no delay 
03-09 12:51:22.665: D/GameLoop(3116): - run() 
03-09 12:51:22.687: W/GameLoop(3116): Loop time=1362826282691, delta=26 
03-09 12:51:22.687: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:22.687: D/GameView(3116): + onWindowFocusChanged(hasWindowFocus:true) 
03-09 12:51:22.687: D/GameLoop(3116): + resume() 
03-09 12:51:22.687: D/GameLoop(3116): - resume() 
03-09 12:51:22.687: D/GameView(3116): - onWindowFocusChanged() 
03-09 12:51:22.745: W/GameLoop(3116): Loop time=1362826282745, delta=54 
03-09 12:51:22.745: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.284: W/GameLoop(3116): Loop time=1362826283284, delta=539 
03-09 12:51:23.285: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.366: W/GameLoop(3116): Loop time=1362826283367, delta=83 
03-09 12:51:23.366: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.425: W/GameLoop(3116): Loop time=1362826283426, delta=59 
03-09 12:51:23.425: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.495: W/GameLoop(3116): Loop time=1362826283504, delta=78 
03-09 12:51:23.505: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.555: W/GameLoop(3116): Loop time=1362826283561, delta=57 
03-09 12:51:23.555: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.615: W/GameLoop(3116): Loop time=1362826283622, delta=61 
03-09 12:51:23.615: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.675: W/GameLoop(3116): Loop time=1362826283675, delta=53 
03-09 12:51:23.686: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.749: W/GameLoop(3116): Loop time=1362826283750, delta=75 
03-09 12:51:23.749: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.807: W/GameLoop(3116): Loop time=1362826283808, delta=58 
03-09 12:51:23.807: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.875: W/GameLoop(3116): Loop time=1362826283884, delta=76 
03-09 12:51:23.875: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:23.936: W/GameLoop(3116): Loop time=1362826283938, delta=54 
03-09 12:51:23.946: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:24.006: W/GameLoop(3116): Loop time=1362826284006, delta=68 
03-09 12:51:24.006: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:24.065: W/GameLoop(3116): Loop time=1362826284065, delta=59 
03-09 12:51:24.065: I/GameLoop(3116): Posting thread with delay 50 milliseconds 
03-09 12:51:24.126: W/GameLoop(3116): Loop time=1362826284126, delta=61 
03-09 12:51:24.126: I/GameLoop(3116): Posting thread with delay 50 milliseconds 

我知道postdelay是不准确的,但在这里,每一次它的运行速度比所需的50毫晚。
我的mGame.update()方法现在是空的,并且mGame.onDraw()绘制2个矩形,一行和一个文本。我认为它不是特别沉重,但仍然跟不上20FPS。

他们如何渲染沥青等图形密集型游戏并保持高FPS?注意:它运行在运行英特尔HAXM引擎的仿真器上,仿真器可以像仿真器一样快速地运行。

要清楚在问我什么,那就是:

什么我必须做的,以实现高FPS的(不计算重)游戏循环?

注:我知道postdelayed将至少50毫米。但是有两件事让我感到困扰,总是第二个电话需要几百毫安,准确度从20到10 FPS不等,我担心屏幕上的移动看起来不统一。

编辑
只是为了测试我的间隔减少到20毫(50FPS)和增量保持在范围50-70毫(仿真器)。
我增加了83毫秒(12FPS)的间隔,增量为87-93(模拟器)。
我在运行Nvidia Quadcore的华硕TF201上安装了应用程序,三角洲的变化不大。

结论是,对于使用Canvas和更新绘制循环的游戏,我无法从20FPS上升。 Dissapointing。

我觉得他们为什么要使用同步在

synchronized(mSurfaceHolder) 
+0

我使用同步来确保这是触摸SurfaceView的唯一代码。 :::当我更改我的代码时,网络中的大部分游戏循环示例都使用'while()'循环与'synchronize()'主体,因为我不太确定其他线程在运行系统,并可能尝试通过'canvas = mSurfaceHolder访问相同的SurfaceView(例如垃圾回收(?)) – ilomambo 2013-03-09 11:25:41

+0

。lockCanvas(null);'只有这个线程可以修改这个画布 – 2013-03-09 11:31:14

+0

'synchronize()'是一个性能杀手吗? – ilomambo 2013-03-09 12:35:26

伙计,我用的帆布,并得到15ms的帧,1至4毫秒的滞后使用OpenGL代替画布

,拥有200个精灵所有的位图绘制到同步画布。不确定你的交易是什么,但是我在一年前只看了一次aunarlander api demo,从那里开始一直都是肉汁。清单中的一行可以实现硬件加速,并且可以避免模拟器可以处理任何需要快速和图形的任何事情。我不会撒谎,并说这是游戏开发的最简单的平台(这是关于最差的IMO),但给它一些时间,你会发现它。