Android游戏引擎设计:如何同步游戏循环和画布更新线程?

时间:2011-09-07 13:23:41

标签: java android multithreading

我想重写我在Android上运行的简单游戏引擎,我想知道如何同步两个正在运行的线程。现在我有以下内容:

enter image description here

  • Runner是这个游戏的主要活动,切入点;
  • CanvasView只是一个正在进行绘图的画布;
  • GameWorld - 顾名思义 - 是存储有关游戏状态的当前信息的类。现在,我们只想说它还包含一个Level。
  • GameLoop是一个单独的线程,它正在更新游戏状态;
  • CanvasThread是一个单独的线程,用于在CanvasView上绘制当前的Level。

由于关卡只是一个简单的数组,CanvasThread只是遍历数组并在屏幕上绘制。我对此几乎没有问题:

  • 是否有可能按需运行CanvasThread的onDraw()方法?在引擎的当前状态下,当前一个引擎的执行完成时,它将被重新启动。
  • 我想在GameLoop和CanvasThread之间实现某种三次握手,类似于:

    1. GameLoop - > CanvasThread:请停止更新
    2. 画布 - > GameLoop:好的,停止了
    3. GameLoop - > CanvasThread:好的,你可以恢复。

最好的方法是什么?我是一个完整的Java / Android新手,所以我设置引擎的方式很可能不是最佳/最佳的。如果您对设计有任何建议,我将很乐意欣赏它们。

谢谢。

PS:如果我在创建上图时违反了所有最佳做法,请原谅我。

3 个答案:

答案 0 :(得分:2)

Android有一种简单的方法来处理线程通信。您可以使用Looper和Handler在线程之间发送消息或完成Runnables。

请访问mindtherobot.com上的Android Guts: Intro to Loopers and Handlers进行介绍。

您可以发送“空”消息来发出信号,或提供一些参数。您可以立即发送消息,也可以延迟发送消息。

如果您通过向自己发送消息来设计游戏循环,那么从其他线程注入消息会很容易。

答案 1 :(得分:2)

我很久以前创作的。也许它有点帮助 http://code.google.com/p/candroidengine/

答案 2 :(得分:2)

我相信如果他们不沟通,你会发现它容易得多。

相反,要采取一些限制措施以保持自己的理智:

  1. 制作一个非常紧凑的游戏循环。如果你要更新你的画布,比方说,30 fps(约33 ms)使你的游戏循环时间不会超过10或20毫秒。
  2. 锁定游戏循环和画布更新。现在,每个人都会在做他们的事情之前等待对方完成。你不会得到一个画面,它在循环之前代表屏幕的一半,在循环之后代表屏幕的另一半。
  3. 示例:

    class GameLoop extends Thread {
    
        public void run() {
            while(true) {
                synchronized(theGameWorldObject) {
                    // update game info here
                }
            }
        }
    
    }
    
    class Canvas {
        updateCanvas() { // or whatever you call it
            synchronized(theGameWorldObject) {
                // update canvas here
            }
        }
    }