我正在用C++开发一款针对手持硬件(潘多拉)的即时测试游戏。作为参考,Pandora有一个大约600 the的ARM处理器,并运行Linux。我们正在努力确定一个好的消息传递系统(内部和外部),这对我来说是一个新领域。
举一个我们想要传递的信息的例子可能会有所帮助。一个单元可能会进行以下调用,将其模型加载到内存中:
sendMessage("model-loader", "load-model", my_model.path, model_id );
作为回报,该单元可以期待某种类型的消息,该消息包含特定model_id的模型对象,然后可以将其传递给图形系统。请注意,此sendMessage函数绝不是最终函数。它只是反映了我目前对消息传递系统的理解,这可能是不正确的:)
据我所知,有两种截然不同的选择。一种是在内存中传递消息,只有在需要与外部机器通信时才通过网络。我喜欢这个想法,因为开销似乎很低,但这里最大的问题是,您似乎需要在消息队列上广泛使用互斥锁。如果可能的话,我真的希望避免过多的锁定。我已经阅读了几种实现简单队列而不使用锁定的方法(通过依赖原子int操作),但这些方法假定一个队列只有一个读取器和一个写入器。这对于我们的特殊情况似乎没有什么用处,因为一个对象的队列将有多个写入器和一个读取器。
另一种选择是完全跨越网络层。这有一些有趣的优点,比如几乎免费地获得异步消息传递。此外,我们还获得了使用与本地传递完全相同的调用将消息传递到其他机器的能力。然而,这个解决方案惹恼了我,可能是因为我没有完全理解它:)我们需要为每个将要发送/接收消息的对象提供一个套接字吗?如果是这样的话,这似乎有点过分了。一个给定的游戏将有数千个对象。对于像Pandora这样动力不足的设备,我担心滥用网络可能会成为我们的瓶颈。但是,我还没有运行任何测试,所以这只是猜测。
MPI似乎在消息传递方面很受欢迎,但对我们想要的东西来说,它确实有点过头了。这段代码永远不会接触到集群,也不需要做繁重的计算。
任何对我们实现这一目标的选择的洞察都是非常感谢的。
发布于 2009-06-16 14:23:59
由于这是一个小型平台,因此可能值得对这两种方法进行计时。
然而,除非有一些大的速度问题,否则我总是选择代码更简单的方法。这可能会使用网络堆栈,因为无论接收方在哪里,它都将是相同的代码,并且您不必手动编码和破坏您的互斥、消息缓冲、分配等。
如果你发现它太慢了,你可以在以后使用内存重新编码本地的东西。但是,如果你可能没有必要的话,为什么要浪费时间提前做这些事情呢?
https://stackoverflow.com/questions/1001544
复制相似问题