我正在开发针对手持硬件(Pandora)的 C++ RTS 游戏。作为参考,Pandora 有一个约 600Mhz 的 ARM 处理器并运行 Linux。我们正在尝试建立一个好的消息传递系统(内部和外部),这对我来说是一个新领域。
举一个我们想传递的信息的例子可能会有所帮助。一个单元可以进行这个调用来将它的模型加载到内存中:
sendMessage("model-loader", "load-model", my_model.path, model_id );
作为回报,该单元可以期待某种包含特定 model_id 的模型对象的消息,然后可以将其传递给图形系统。请注意,这个 sendMessage 函数绝不是最终的。它只是反映了我目前对消息传递系统的理解,这可能是不正确的:)
据我所知,有两种截然不同的选择。一种是在内存中传递消息,只有在需要与外部机器对话时才通过网络。我喜欢这个想法,因为开销似乎很低,但这里的大问题是您似乎需要在消息队列上广泛使用互斥锁。如果可能的话,我真的很想避免过度锁定。我已经阅读了一些实现简单队列而不加锁的方法(依靠原子int
操作),但这些方法假设一个队列只有一个读取器和一个写入器。这对我们的特定情况似乎没有用,因为一个对象的队列将有许多写入者和一个读取者。
另一种选择是完全越过网络层。这有一些有趣的优势,比如几乎免费的异步消息传递。此外,我们获得了使用与本地传递完全相同的调用将消息传递给其他机器的能力。但是,这个解决方案让我很不爽,可能是因为我不完全理解它:) 我们是否需要为每个将要发送/接收消息的对象提供一个套接字?如果是这样,这似乎是多余的。一个给定的游戏将有数千个对象。对于像 Pandora 这样动力不足的设备,我担心像这样滥用网络可能最终成为我们的瓶颈。但是,我还没有进行任何测试,所以这只是猜测。
MPI 似乎在消息传递方面很受欢迎,但对于我们想要的东西来说,它确实感觉有点矫枉过正。此代码永远不会触及集群或需要进行大量计算。
非常感谢您对我们有哪些选择来实现这一点的任何见解。