3. 线程阻塞的原因:

1.Thread.sleep(),线程放弃CPU,睡眠N秒,然后恢复运行
     2.线程要执行一段同步代码,由于无法获得相关的锁,阻塞。获得同步锁后,才可以恢复运行。
     .线程执行了一个对象的wait方法,进入阻塞状态,只有等到其他线程执行了该对象的notify、nnotifyAll,才能将其唤醒。
     4.IO操作,等待相关资源
阻塞线程的共同特点是:放弃CPU,停止运行,只有等到导致阻塞的原因消除,才能恢复运行 。或者被其他线程中断,该线程会退出阻塞状态,并抛出InterruptedException.

4.

阻塞/非阻塞/同步/异步
同步/异步关注的是消息如何通知的机制。而阻塞和非阻塞关注的是处理消息。是两组完全不同的概念。

5.几个常用概念
Select Poll
Epoll(Linux) Kqueue(FreeBSD)

IOCP    windows

Reactor
Dispatcher(分发器),Notifer(通知器), 事件到来时,使用Dispatcher(分发器)对Handler进行分派,这个Dispatcher要对所有注册的Handler进行维护。同时,有一个Demultiplexer(分拣器)对多路的同步事件进行分拣。

Proactor
Proactor和Reactor都是并发编程中的设计模式.用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。

两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。
不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。

6.

网络通讯框架
TCP Server框架:
Apache MINA(Multipurpose Infrastructure for Network Applications)2.0.4
Netty 3.5.0Final
Grizzly 2.2
Quickserver是一个免费的开源Java库,用于快速创建健壮的多线程、多客户端TCP服务器应用程序。使用QuickServer,用户可以只集中处理应用程序的逻辑/协议
Cindy 强壮,可扩展,高效的异步I/O框架
xSocket一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面
ACE 6.1.0 C++ADAPTIVE CommunicationEnvironment,
SmaxFoxServer 2.X 专门为Adobe Flash设计的跨平台socket服务器

7.消息编码协议

AMF/JSON/XML/自定义/ProtocolBuffer

无论是做何种网络应用,必须要解决的问题之一就是应用层从字节流中拆分出消息的问题,也就是对于 TCP 这种字节流协议,接收方应用层能够从字节流中识别发送方传输的消息.
1.使用特殊字符或者字符串作为消息的边界,应用层解析收到的字节流时,遇见此字符或者字符串则认为收到一个完整的消息 
2.为每个消息定义一个长度,应用层收到指定长度的字节流则认为收到了一个完整的消息
消息分隔标识(separator)、消息头(header)、消息体(body)
 len | message_id | data

|separator |     header   | body |
 | len       | message_id | data

8. 粘包:
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 
    1.发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续发送几次的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
    2.接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据

解决措施:
    1.对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件接收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
TCP-NO-DELAY-关闭了优化算法,不推荐
    2.对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象-当发送频率高时依然可能出现粘包
    3.接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。-效率低
    4.接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开

分包算法思路:
基本思路是首先将待处理的接收数据(长度设为m)强行转换成预定的结构数据形式,并从中取出数据结构长度字段,即n,而后根据n计算得到第一包数据长度
1) 若n<m,则表明数据流包含多包数据,从其头部截取n个字节存入临时缓冲区,剩余部分数据一次继续循环处理,直至结束。
2) 若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。
3) 若n>m,则表明数据流内容尚不够构成一个完整结构数据,需留待与下一包数据合并后再行处理。

五.正文之场景管理、ai、脚本

AOI: (Area Of Interest),广义上,AOI系统支持任何游戏世界中的物体个体对一定半径范围内发生的事件进行处理;但MMOPRG上绝大多数需求只是对半径范围内发生的物体离开/进入事件进行处理。当你进入一个游戏场景时,如果你能看到其他玩家,那背后AOI系统就正在运作.

1. 很容易想象,AOI的需求最简单的做法是全世界玩家信息全部同步给客户端。这个方案是O(n^2)的复杂度,对服务器来说是不能承受之重。但如果是超小地图十人以下的特殊需求倒可能是个简洁的方案。
    2. 比较流行的方案是网格法,简单,高效:将地图按设定的格子大小划分为网格,设玩家移动到某坐标,我们很容易地将玩家归入该坐标所属的网格G的玩家链中,而这个玩家的可见集可以简单地将以网格G为中心的九宫格中的玩家链聚合而得到。而要获得两次移动间的可见集差异,也非难事.

所谓 AOI ( Area Of Interest ) ,大致有两个用途。
    一则是解决 NPC 的 AI 事件触发问题。游戏场景中有众多的 NPC ,比 PC 大致要多一个数量级。NPC 的 AI 触发条件往往是和其它 NPC 或 PC 距离接近。如果没有 AOI 模块,每个 NPC 都需要遍历场景中其它对象,判断与之距离。这个检索量是非常巨大的(复杂度 O(N*N) )。一般我们会设计一个 AOI 模块,统一处理,并优化比较次数,当两个对象距离接近时,以消息的形式通知它们。
    二则用于减少向 PC 发送的同步消息数量。把离 PC 较远的物体状态变化的消息过滤掉。PC 身上可以带一个附近对象列表,由 AOI 消息来增减这个列表的内容。
在服务器上,我们一般推荐把 AOI 模块做成一个独立服务 。场景模块通知它改变对象的位置信息。AOI 服务则发送 AOI 消息给场景
AOI 的传统实现方法大致有三种:

第一,也是最苯的方案。直接定期比较所有对象间的关系,发现能够触发 AOI 事件就发送消息。这种方案实现起来相当简洁,几乎不可能有 bug ,可以用来验证服务协议的正确性。在场景中对象不对的情况下其实也是不错的一个方案。如果我们独立出来的话,利用一个单独的核,其实可以定期处理相当大的对象数量。

第二,空间切割监视的方法。把场景划分为等大的格子,在每个格子里树立灯塔。在对象进入或退出格子时,维护每个灯塔上的对象列表。对于每个灯塔还是 O(N * N) 的复杂度,但由于把对象数据量大量降了下来,所以性能要好的多,实现也很容易。缺点是,存储空间不仅和对象数量有关,还和场景大小有关。更浪费内存。且当场景规模大过对象数量规模时,性能还会下降。因为要遍历整个场景。对大地图不太合适。这里还有一些优化技巧,比如可以把格子划分为六边形 的。

第三,使用十字链表 (3d 空间则再增加一个链表维度) 保存一系列线段,当线段移动时触发 AOI 事件。算法不展开解释,这个用的很多应该搜的到。优点是可以混用于不同半径的 AOI 区域。

游戏架构 游戏架构设计(12)相关推荐

  1. 一个C/S结构的优秀例子: 延迟补偿在C/S架构游戏协议设计和优化中的应用

    这篇文章介绍了cs这样的第一人称射击游戏中如何实现延迟补偿.非第一人称设计游戏设计也可以参考其中一些思想 原文地址: https://developer.valvesoftware.com/wiki/ ...

  2. 延迟补偿在C/S架构游戏协议设计和优化中的应用

    这篇文章介绍了cs这样的第一人称射击游戏中如何实现延迟补偿.非第一人称设计游戏设计也可以参考其中一些思想 原文地址: https://developer.valvesoftware.com/wiki/ ...

  3. 一款成功的全球服游戏该如何进行架构选型与设计?

    全球服游戏如今正在成为出海游戏的主要考虑模式,跨国对战.全球通服打破国界的限制,将不同地区不同语言的玩家放在一起合作/竞技,成功吸引了大量玩家的关注,并逐渐成为主流的游戏玩法. 游戏厂商们也在尝试采用 ...

  4. 大型游戏服务器架构该怎么设计?

    一.游戏服务器特征 游戏服务器,是一个会长期运行程序,并且它还要服务于多个不定时,不定点的网络请求.所以这类服务的特点是要特别关注稳定性和性能.这类程序如果需要多个协作来提高承载能力,则还要关注部署和 ...

  5. 基于滴滴云的棋牌游戏服务端架构设计

    现在小团队开发的棋牌游戏有很多,棋牌行业的相互攻击是非常普遍的现象,同行之间往往会采取 DDOS.CC 等攻击的手段来打击对手,这是目前棋牌运营商们面临的比较严峻的一个问题,那么在设计棋牌游戏服务端架 ...

  6. mysql服务端放置_放置类游戏后端服务器架构设计与实现

    前言: 停更了一段时间.2020年也接近尾声了,调整了一下人生状态,继续前进. 今年完全参与了一款放置类游戏从0到开发上线再到合服.从目前市场上买量游戏的发展线路来看,合服意味着游戏走向压榨玩家的最后 ...

  7. 游戏服务器的架构演进、多进程架构通信

    系列文章目录 文章目录 系列文章目录 前言 一.游戏服务器特征 二.游戏服务器架构要素 三.服务器演化进程 1.卡牌等休闲游戏弱交互游戏 2.长链接游戏服务器 1.第一代网游服务器(单线程无阻塞) 2 ...

  8. 游戏服务端架构发展史(中)

    出处:http://www.skywind.me/blog/archives/1301 类型4:第三代游戏服务器 2007 从魔兽世界开始无缝世界地图已经深入人心,比较以往游戏玩家走个几步还需要切换场 ...

  9. 《游戏服务器的架构演进》阅读笔记

    游戏服务器特征 游戏服务器端,是一个会长期运行的程序,并且它还要服务于多个不定时,不定点的网络请求.所以这类软件的特点是要非常关注稳定性和性能.这类程序如果需要多个协作来提高承载能力,则还要关注部署和 ...

  10. 游戏服务器的架构演进

    本文阅读预计需要10分钟,主要技术点来如下,感兴趣请继续: 游戏服务器特征 短连接游戏服务器架构 长链接游戏服务器架构 分区分服服务器架构 MMOARPG服务器架构 房间服务器架构 一.游戏服务器特征 ...

最新文章

  1. OPUS 视频PPT介绍
  2. Linux中expect实现自动登录
  3. linux 7 zip软件下载,linux安装使用7zip教程
  4. 两张趣图助你理解 HTTP 状态码
  5. oracle日志查看问题?
  6. Fault Tolerance 要求、限制和许可
  7. mysql开发必知必会
  8. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
  9. 人大金仓V8数据库安装教程及避坑小指南
  10. Ubuntu18.04设置阿里源
  11. 服务器建网站要数据库,云服务器建网站需要数据库
  12. OpenMP 参考(指令详解)
  13. 软件过程的价值观、原则以及实践——从敏捷说起
  14. VBA案例8:实现在ppt中写vba,控制动态图
  15. NAACL最佳方法论文:课本上的A*搜索算法可以提升文本生成效果!
  16. Proteus电路图绘制与CubeMX生成框架下填充Keil 5代码的联调仿真
  17. MATLAB教程笔记——B站台大郭彦甫
  18. c语言输入函数 scanf 详解 - 解决常见输入问题
  19. Python常用模块之四 funsctools
  20. 初阶C++——C++第二节——类和对象(大全篇)

热门文章

  1. 调用亚马逊插件keepa数据的API获取产品的历史信息
  2. 你长得好像我同事啊……
  3. HTML+CSS实现导航页
  4. 区块链+教育 解决教育行业所面临的问题
  5. Python:图像数据增强和保存
  6. 2021年安全员-A证-主要负责人(广东省)考试题及安全员-A证-主要负责人(广东省)试题及解析
  7. 计算机科学与技术人才培养方案设计模式,2009级计算机科学与技术人才培养方案.doc...
  8. 达内科技:聪明的价格战
  9. visual c++中如何改变窗口背景颜色
  10. Python 大神强力推荐的11个Python 开发框架