公司的新的pvp手游项目用了5个线程,分别是:主线程、迷雾线程、日志线程、游戏逻辑线程、Socket。
困而知之,所以和大家分享一下。
参考文章:
网络游戏服务器编程
Unity线程优先级(ThreadPriority)
- 优先级越高表示CPU分配给该线程的时间片越多,执行时间就多
- 优先级越低表示CPU分配给该线程的时间片越少,执行时间就少
实际上获得CPU时间长度与很多因素有关,不能仅靠优先级来判断。
环形缓冲区
不用频繁地分配内存,而在大多数情况下,内存的反复使用也使得我们能用更少的内存块做更多的事。
在网络io线程中,我们为每一个线程准备一个环形缓冲区,用于临时存放接收到的数据,以应付半包和粘包的情况。
在解包和解密完成之后,我们将这个数据包复制到逻辑线程消息队列中,如果我们只是用一个队列,那这里以后也将会是环形缓冲区,io线程往里面写,逻辑线程往后读,互相追逐,因为我们对同一个队列不会出现同时读和写的情况,每个队列在写满后交给逻辑线程去读,逻辑线程读完后清空队列再交给io线程去写,一段固定大小的缓冲区即可。
减少锁竞争次数
提供一个队列容器,里面有多个队列,每个队列都可固定存放一定数量的消息,网络线程要给逻辑线程投递消息时,会从队列容器中取一个空队列来使用,直到将该队列填满后再放回容器中换另一个队列。
逻辑线程取消息时时从队列容器中取一个有消息的队列来读取,处理完成后清空队列再放回容器中。这样使得只有在队列容器进行操作时才需要加锁,而io线程和逻辑线程在操作自己当前使用的队列时都不需要加锁,所以锁竞争的机会大大减少了。
可能会出现io线程未写满一个队列而逻辑线程又没有数据可处理的情况,特别是当数据量很少的时候出现。使用两个队列,一个给逻辑线程读,一个给io线程写,当逻辑线程读完后将自己的队列和io线程的队列想调换。
加锁的次数会比较多,io线程每次写队列时都要加锁,逻辑线程在调换队列时也要加锁,但逻辑线程在读队列时不需要加锁。
下午刚刚整理一下之前关于线程和进程的笔记。这里引用这个例子说明一下。
首先,因为没有开启新的进程,所以这五个线程都在一个进程中,这里谈谈我在开发中遇到的一些问题。
。。未完待续