游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11491|回复: 21

请问多线程之间使用消息队列通信好吗?

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-1-12 18:23:00 | 显示全部楼层 |阅读模式
游戏逻辑一个线程
物理引擎一个线程
网络引擎一个线程
渲染引擎一个线程(如果是客户端的话)

我现在打算使用队列在这些线程之间通信,每个线程一个队列,其他线程要向这个线程发消息的话,就把消息发到这个线程的队列里,然后当那个线程运行了一个周期后,会到队列里取出所有的对象,对它们调用process()来处理。
每个逻辑对象都breathe了一次之后,处理消息队列
物理引擎运行了一个step之后,处理消息队列
网络引擎嘛……没事干的时候就处理队列好了……
渲染引擎渲染了一帧之后处理消息队列

虽然物理引擎、渲染引擎本身不是多线程安全的,但是这样设计的话也能用在多线程环境里了。

但是我现在的问题是……这样好吗?效率可以接受吗?会不会是不必要的复杂?
[em10] [em10] [em10] [em10] [em10]

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2007-1-13 11:14:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

根本没有必要使用多线程。因为你所有的东西都是实时的,在你这样的情况下,多线程即不能提高效率,也不能使设计变得简单。或者反而会让程序变得更坏。网络的话可以使用Nonblocking模式,你要另开一线程也可以。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-1-13 11:58:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

嗯……客户端上,多线程的确看不到多少好处。那么如果是服务器呢?好像很多服务器都是多个CPU的……  *^_^*

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-1-13 18:24:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

晕……怎么没人来讨论呢……
小顶一下……T.T

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-1-13 23:15:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

我觉得开两个线程差不多了.
以后可能会流行双核的PC,一个处理渲染,另一个处理其他逻辑.,这样即使是线程间的通信,或者安全,都容易很多,出了问题,debug也容易.
多线程的设计,能避免最好避免,现在那款游戏用到多线程处理各个模块的么(客户端).本来就已经够复杂了,还要把问题变的更复杂么?虽然有时候能享受到充分利用系统资源的好处,但付出的代价也是沉重的,起码开发周期要长,很难保重系统稳定,最要命的是维护不方便.可能会导致bug的不定期,不唯一的出现.
再说,单单一个线程,一个游戏已经占用了90%左右的cpu了,你多开这么多线程能提高效率么?
我的建议,一个CPU一个线程.

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-1-14 00:29:00 | 显示全部楼层

Re: Re:请问多线程之间使用消息队列通信好吗?

月下临风: Re:请问多线程之间使用消息队列通信好吗?

我觉得开两个线程差不多了.
以后可能会流行双核的PC,一个处理渲染,另一个处理其他逻辑.,这样即使是线程间的...


客户端多开一个线程来处理资源后台异步加载是很有必要的,大多数的网络游戏都是这么干的 [em5]

网络游戏毕竟不是单机的,很多同步要考虑

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-1-14 13:38:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

终于又有人回帖了……感动中……T.T

我是这样想的,用户有几个CPU,每个CPU是几核,这些都只有用户知道,所以我能做的就是做好多线程的特性,然后用户只需要在配置文件里设置什么模块要单独的线程,什么模块不要单独的线程。我想把选择留给用户。
但是,因为要能够通过配置文件来方便地配置线程使用,所以我只能按照多线程来设计,而且不能假设哪个模块一定有单独的线程,哪个模块一定没有自己单独的线程。所以我会面临这种N个线程之间通信的情况。而另一方面,由于一些库,比如物理引擎、渲染引擎,这些不一定有良好的多线程支持,所以我还得考虑如何把这些单线程的库整合到这个可配置的多线程架构里,所以我现在脑子里好乱……

我现在感觉,使用队列+Command模式来通信,实现起来并不困难,因为这样的话,可能被多个线程操作的数据结构主要就是这些队列了,容易控制,比起把线程同步分布得到处都是要好得多。
但是,我现在最担心的还是性能问题:因为本来很多通信都只是调用几个函数而已,而现在需要创建Command对象,入队,出队,调用virutal void process()处理,我感觉这样对性能会有很严重的负面影响。所以我现在还不敢确定到底能不能这么做,但是不用队列,我自己又想不到什么更好的办法了,毕竟要考虑维护方便,调试方便,更重要的是要能够把那些本身并不线程安全的库给整合进来。

所以想问问大家,到底能不能这么做,以及是否有更好的办法……谢谢大家先~   *^_^*

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2007-1-14 17:35:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

多线程的引入,必然带来互斥、指针有效性维护,以及一些本想阻塞等待的操作,变成了异步(例如,以前一个函数内调用另外一个模块的3个功能接口,引入多线程后很可能原有逻辑要分3次来做,且需要考虑其间如何处理),代码的复杂度也会大规模增加。

我写过的代码,最郁闷的就是Debug多线程,BUG出的让人头大,基本是随机出现。。。。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-1-14 21:02:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

嗯……那些用mutex括起来的函数调用的确很容易出问题,特别是有n个线程之间彼此通信的时候……
所以我的想法是:把这些通信尽量都集中起来,也就是集中到消息队列里。
比如有个物理引擎,允许在其自己单独的线程上,这时其他线程的模块要与这个物理引擎交互时,都是先生成Command对象,把这个对象放到队列里,然后等物理引擎运行了一个step之后,由物理引擎调用队列里每个消息的process()方法,这样其他线程对物理引擎的调用都集中在了这个阶段,而不会到处都是的。而且这样的话真正的互斥主要就是入队、出队和process的时候,而入队、出队和process这种操作一般不会花去太多时间,这样各线程间互相等待的概率也小了。
复杂是肯定更复杂了的,不过我觉得如果都使用队列通信,那么多线程带来的负面影响应该还是可以接受的。

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-1-14 21:22:00 | 显示全部楼层

Re:请问多线程之间使用消息队列通信好吗?

消息机制你可以使用 Wait / Notify 机制。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表