0

我正在开发针对手持硬件(Pandora)的 C++ RTS 游戏。作为参考,Pandora 有一个约 600Mhz 的 ARM 处理器并运行 Linux。我们正在尝试建立一个好的消息传递系统(内部和外部),这对我来说是一个新领域。

举一个我们想传递的信息的例子可能会有所帮助。一个单元可以进行这个调用来将它的模型加载到内存中:

sendMessage("model-loader", "load-model", my_model.path, model_id );

作为回报,该单元可以期待某种包含特定 model_id 的模型对象的消息,然后可以将其传递给图形系统。请注意,这个 sendMessage 函数绝不是最终的。它只是反映了我目前对消息传递系统的理解,这可能是不正确的:)

据我所知,有两种截然不同的选择。一种是在内存中传递消息,只有在需要与外部机器对话时才通过网络。我喜欢这个想法,因为开销似乎很低,但这里的大问题是您似乎需要在消息队列上广泛使用互斥锁。如果可能的话,我真的很想避免过度锁定。我已经阅读了一些实现简单队列而不加锁的方法(依靠原子int操作),但这些方法假设一个队列只有一个读取器和一个写入器。这对我们的特定情况似乎没有用,因为一个对象的队列将有许多写入者和一个读取者。

另一种选择是完全越过网络层。这有一些有趣的优势,比如几乎免费的异步消息传递。此外,我们获得了使用与本地传递完全相同的调用将消息传递给其他机器的能力。但是,这个解决方案让我很不爽,可能是因为我不完全理解它:) 我们是否需要为每个将要发送/接收消息的对象提供一个套接字?如果是这样,这似乎是多余的。一个给定的游戏将有数千个对象。对于像 Pandora 这样动力不足的设备,我担心像这样滥用网络可能最终成为我们的瓶颈。但是,我还没有进行任何测试,所以这只是猜测。

MPI 似乎在消息传递方面很受欢迎,但对于我们想要的东西来说,它确实感觉有点矫枉过正。此代码永远不会触及集群或需要进行大量计算。

非常感谢您对我们有哪些选择来实现这一点的任何见解。

4

3 回答 3

2

网络也将使用锁定。它只是在操作系统内核中你看不到的地方。

我要做的是创建您自己的消息队列对象,您可以根据需要对其进行重写。从简单开始,并根据需要使其变得更好。这样,您就可以让它在幕后使用您喜欢的任何实现,而无需更改其余代码。

查看您将来可能想做的几种可能的实现并设计您的 API,以便在您决定以这些术语实现时可以有效地处理它们。

如果您想要真正高效的消息传递,请查看一些开源 L4 微内核。那些家伙花了很多时间来快速传递消息。

于 2009-06-16T13:55:40.550 回答
1

由于这是一个小型平台,因此可能值得对这两种方法进行计时。

但是,除非出现某种大的速度问题,否则我总是会采用更易于编码的方法。这可能会使用网络堆栈,因为无论接收者在哪里,它都是相同的代码,并且您不必手动编码和调试您的互斥、消息缓冲、分配等。

如果您发现它太慢,您可以稍后使用内存重新编码本地内容。但是,如果您可能不必这样做,为什么要浪费时间预先做这件事呢?

于 2009-06-16T14:23:58.650 回答
0

我同意 Zan 的建议,尽可能在内存中传递消息。

一个原因是您可以传递复杂的对象 C++ 而无需编组和解组(序列化和反序列化)它们。

使用信号量保护消息队列的成本很可能低于进行网络代码调用的成本。

如果您使用一些无锁算法(使用您自己提到的原子操作)保护您的消息队列,您可以避免很多上下文切换进出内核。

于 2009-06-16T14:07:31.120 回答