我正在开发一款针对手持硬件 (Pandora) 的 C++ 即时战略游戏。作为引用,Pandora 有一个大约 600Mhz 的 ARM 处理器并运行 Linux。我们正在尝试建立一个良好的消息传递系统(内部和外部),这对我来说是一个新领域。
举例说明我们要传递的消息可能会有所帮助。一个单元可以进行此调用以将其模型加载到内存中:
sendMessage("model-loader", "load-model", my_model.path, model_id );
作为返回,该单元可能会收到某种消息,其中包含特定 model_id 的模型对象,然后可以将其传递给图形系统。请注意,此 sendMessage 函数绝不是最终函数。它只是反射(reflect)了我目前对消息传递系统的理解,这可能是不正确的:)
据我所知,有两种截然不同的选择。一种是在内存中传递消息,只有在需要与外部机器通话时才通过网络传递。我喜欢这个想法,因为开销似乎很低,但这里的大问题是您似乎需要在消息队列上广泛使用互斥锁。如果可能的话,我真的很想避免过度锁定。我已经阅读了几种无需锁定(通过依赖原子 int
操作)实现简单队列的方法,但这些方法假设队列只有一个读取器和一个写入器。这似乎对我们的特定情况没有用,因为一个对象的队列将有许多作者和一个读者。
另一种选择是完全通过网络层。这有一些有趣的优势,比如几乎免费地获得异步消息传递。此外,我们获得了使用与本地传递完全相同的调用将消息传递到其他机器的能力。但是,这个解决方案让我误会了,可能是因为我没有完全理解它 :) 我们是否需要为每个将要发送/接收消息的对象提供一个套接字?如果是这样,这似乎过分了。给定的游戏将有数千个对象。对于像 Pandora 这样动力不足的设备,我担心像这样滥用网络可能最终成为我们的瓶颈。但是,我还没有运行任何测试,所以这只是猜测。
MPI 似乎在消息传递方面很受欢迎,但对于我们想要的东西来说,它确实感觉有点矫枉过正。此代码永远不会触及集群或需要进行大量计算。
非常感谢任何关于我们有哪些选择来实现这一目标的见解。
最佳答案
网络也将使用锁定。它只是在操作系统内核中您看不到的地方。
我要做的是创建您自己的消息队列对象,您可以根据需要重写该对象。从简单开始,然后根据需要改进。这样您就可以让它在幕后使用您喜欢的任何实现,而无需更改其余代码。
查看您将来可能希望执行的几种可能的实现并设计您的 API,以便在您决定以这些方式实现时能够高效地处理它们。
如果您想要真正高效的消息传递,请查看一些开源 L4 微内核。这些人将大量时间用于快速消息传递。
关于c++ - 游戏消息传递系统的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1001544/