阅读文章来源 https://www.cnblogs.com/cr1719/p/7430275.html
1.网络通讯
1.1 游戏客户端与游戏服务器的通讯
客户端复杂多变,比如传统页游flash,手机游戏,h5等,所用消息协议不同,但无非是tcp,http,websocket等。
web 端
手游,安卓,ios
客户端
h5小游戏
1.2 客户端与服务器约定速成的通信规则
protobuf
xml
json
自定义等
2.复杂的线程模型
线程,并发,负载
3.跨服、多服的简单解决方案
上面2步实现了单机最简单的消息投递方式,新的问题又来了,如果把网关服,用户服独立开,场景服务器独立开,跨服等如何实现呢?
java多进程之间通讯,看来rpc要派上用场了。游戏这里不比电商等业务,我们所有的服务都是同java语言开发维护,所以一个简单的chen-rpc就可以搞定啦。
rpc具体的实现细节,不作过多讨论。我们实现的最终目标,远程调用,就像本地调用一样的方便即可。
4.游戏后台管理系统
简单的前端框架xx抄过来,连ui都不用啦。
http服务,自己写了一个,tomcat都省了,gm指令,web后台登录权限控制,运营客服线上操作等,恩,不用太复杂。
当然,运营让你复杂,还是要搞一搞的。
5.游戏静态数据的配置维护
策划经常更改静态表数据,对服务器来说,这种常驻内存的数据,
如果更改一次,服务器重启一次,这样不仅仅是内网测试困难,线上怎么办呢?
5.1首先,策划表数据配置一般都在excel中,这里需要提供一个Excel解析工具,将excel数据,转换成data.dat配置,或者json等,最终生成在服务器项目下的resource
资源包下。
5.2策划更新维护时,通过4的游戏后台,上传data.dat文件,同时重新reload静态资源数据,将java内存值更改 。
6.动态数据的更新维护fixme
有静态数据,那必然有要动态更改的数据,这种数据如何落地?会有缓存穿透吗?如果线上有段代码需要更新,怎么办?
6.1目前我接触的几款游戏项目,选用的数据库都是mysql,同时游戏服务器内部有缓存。具体的缓存同步到数据库方式,一般有两种:
- 阻塞的队列,队列中有数据,就往数据库更新
- 定时消费,同步数据库
好了,orm开始登场啦。游戏的数据类型简单,表设定更容易,需要事务吗?应该是不需要的。
所以,除了那些大的框架,比如hibernae,jpa,ibatis等,我们可以自己写一个简单的orm,具体参考:apache下的dbUtils
6.2java的一系列因素,决定了动态更新一定不是件容易的事。目前动态更新有多种,具体不作详细介绍。但是,原理无外乎两种:
- 重写classLoader
- 关于Agent Main
7.寻路、视野
3d和2d目前我接触的两款游戏设定不一样,具体的我单独分篇来介绍,这里不过多说明。
8.游戏日志系统
日志系统很重要,不管是运营正常的数据需求,还是我们程序线上查找问题,日志都是比较完美的解决方案。
具体也不细说了。
9.算法+逻辑规则