Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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 Android游戏引擎设计:如何同步游戏循环和画布更新线程?_Java_Android_Multithreading - Fatal编程技术网

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

Java Android游戏引擎设计:如何同步游戏循环和画布更新线程?,java,android,multithreading,Java,Android,Multithreading,我想将我的简单游戏引擎重写为在Android上运行,我想知道如何同步两个正在运行的线程。现在我有以下几点: 跑步者是本游戏的主要活动、切入点 CanvasView只是一张画布,在上面画画 顾名思义,GameWorld是一个类,用于存储有关游戏状态的当前信息。现在,让我们只说它还包含一个级别 GameLoop是一个单独的线程,它正在更新游戏状态 CanvasThread是一个单独的线程,运行它是为了在CanvasView上绘制当前级别 由于级别只是一个简单的数组,CanvasThread只需

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

  • 跑步者是本游戏的主要活动、切入点
  • CanvasView只是一张画布,在上面画画
  • 顾名思义,GameWorld是一个类,用于存储有关游戏状态的当前信息。现在,让我们只说它还包含一个级别
  • GameLoop是一个单独的线程,它正在更新游戏状态
  • CanvasThread是一个单独的线程,运行它是为了在CanvasView上绘制当前级别
由于级别只是一个简单的数组,CanvasThread只需迭代数组并在屏幕上绘制它。关于这一点,我有几个问题:

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

  • GameLoop->CanvaThread:请停止更新
  • 画布->游戏循环:好,停止
  • GameLoop->CanvaThread:好的,您可以继续
最好的方法是什么?我完全是Java/Android新手,所以我设置引擎的方式很可能不是最好的/最佳的。如果您对设计有任何建议,我将非常感谢

多谢各位


PS:如果我在创建上述图表时违反了所有最佳实践,请原谅。

Android有一种处理线程通信的简单方法。您可以使用循环器和处理程序在线程之间发送消息或完成可运行性

请看mindtherobot.com上的介绍

您可以发送一条“空”消息来表示某些内容,或者提供一些参数。您可以立即发送消息,也可以延迟发送


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

我很久以前创建的内容。也许有点帮助

我相信如果他们不交流,你会发现这会容易得多

取而代之的是,给自己施加一些约束,让自己保持清醒:

  • 做一个非常紧密的游戏循环。如果你打算以每秒30帧(约33毫秒)的速度更新画布,那么游戏循环所需的时间不会超过10或20毫秒
  • 锁定游戏循环和画布更新。现在,每个人都会等待另一个人完成自己的任务。您不会得到一个画布,其中一半屏幕在循环之前表示,另一半屏幕在循环之后表示
  • 例如:

    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
            }
        }
    }
    

    该代码将有很大的帮助。我不想要超级大的游戏引擎,我想了解编写合适的android应用程序的内部原理。非常感谢。