Java 做游戏服务器开发的优势还是很多的,《我的世界》的服务器就是Java开发的。Java技术比较成熟,大数据,云计算,网站App后台,基本都采用Java开发,同时跨平台,游戏服务器这个领域,使用Java的公司月越来越多,一是技术成熟,简单,有很多框架可以使用,二来是招人也比较方便。
这里有个游戏开发交流小组点击可以直接加入
游戏服务器和应用服务器不一样,游戏服务器是需要让多个玩家同时在线,而应用服务器是玩家和系统之间的数据交互和通讯,所以应用服务器大多以http 短连接为主,而游戏服务器需要多人同时在线,同时服务器有时候要主动通知客户端,所以游戏中以长连接为主,同时支付等功能又需要http的短连接, 所以游戏服务器网络短连接+长连接模式。游戏服务器网络模块需要学些Netty等NIO高性能的网络库, 同时需要http,所以一般会搭建一个http server, 用来提供支付,资源更新, 游戏公告等功能服务,有时候登录也是走的http。Httpserver可以使用spring等, 具体取决于开发人员如何选定。多人同时在线的游戏逻辑服务器通常使用的是长连接,需要要提供高性能,高并发,目前主流的游戏服务器很多都用Netty这个NIO的网络框架。客户端发数据到服务器,或服务器发数据给客户端都需要对数据协议进行约定,将要发送的数据对象序列化成二进制,然后传送,接收端收到数据后再反序列化回来,一般这个我们采用Protobuf来做, 性能好,体积小,跨语言平台。
游戏开发中经常需要把数据保存到数据库,同时有些数据可能我们要缓存起来,数据这块也是比较重要的,Java 提供了完整的数据库的支持,JDBC,可以支持多个数据库,我们可以选用mysql等常见的数据库。同时为了加快访问,我们会把数据库中的数据缓存起来,一般主流的缓存技术可以采用redis来做。同时在开发中我们设计到大量的更新和修改数据库中的数据,如果全部手写sql,写起来也麻烦,同时如果数据结构有改动,所有的sql都要改动,所以一般我们会给数据库系统加一个ORM的框架,封装好后直接可以把数据结构更新到数据库,和把数据库内容加载出来生成数据结构。
日志对于游戏服务器开发来说是非常重要的,特别是上线的时候,日志是最重要的一个调试手段,线上版本代码出了bug,也只能通过日志来查,所以一个好的日志系统非常的重要,Java的日志系统也是非常成熟的,比如log4j等,很多日志系统可用。而且都比较成熟。
多线程,反射,注解对于Java游戏服务器来说也是非常重要的技术栈,首先我们要做高性能高并发,多线程就是非常重要的手段, 线程调度,线程同步, 线程通讯等。整个游戏服务器的业务驱动也是基于多线程来驱动的,所以多线程对Java游戏服务器非常重要。Java的注解就更加普遍了,很多我们要做的服务,描述这个服务的一些属性,我们经常需要使用注解,基于注解,我们能更好的管理我们的服务,编写业务逻辑。反射也是我们做游戏服务器常用的,特别是事件响应和处理,我们把对应的处理和对应的事件联系起来,底层都是通过反射,根据对应的事件编号等规则找到处理的反射对象或方法,底层来处理,这样业务逻辑层只需要接入服务的处理类就可以了,底层通过反射来把对应的事件映射派送到对应的服务。
游戏服务器,很多采用状态同步,其实所有的业务逻辑就是在服务端来跑, 服务端要处理游戏常用的经典问题,碰撞检测,寻路导航, 怪物AI等。所以我们需要基于Java服务器实现常用的算法和工具,比如寻路导航,行为决策树,有限状态机, 物理引擎,碰撞检测等。对于大型的MMORPG而言,还需要做好AOI的状态管理等,这些游戏中常用的核心算法我们要准备好。
使用Java来做游戏服务器,我们如何选择开放工具有Eclips+Maven或者是idea, 从开发工具来说都相对好用,但是idea似乎更懂程序员,越来越多的人也投入了idea的怀抱。其实两个方式组织起来都非常简单,还有些项目一个项目,两种工具开发模式都支持。多人协作,代码的版本管理,目前比较流行的有svn, git, git应用非常的广泛,针对分布式开发与版本管理,都非常好用,svn使用相对简单,但是分布式多人协作这块确实没有git灵活方便。
Java来做游戏服务器需要用到的大体的一些技术点,我们就给大家讲解到这里,下面我大家分享一下我们做商业项目的Java服务器用到的库,供大家参考。
Netty | nio socket 框架 | [http://netty.io/](http://netty.io/)
jprotobuf | 通信双方消息编解码 | [https://github.com/jhunters/jprotobuf](https://github.com/jhunters/jprotobuf)
Guava | 玩家数据缓存系统 | [https://github.com/google/guava](https://github.com/google/guava)
Jedis | 跨服数据内存数据库 | [https://redis.io](https://redis.io/)
quartz | job调度任务 | [http://www.quartz-scheduler.org/](http://www.quartz-scheduler.org/)
groovy | 热更新维护相关 | [http://www.groovy-lang.org/](http://www.groovy-lang.org/)
proxool | mysql数据链接池 | [http://proxool.sourceforge.net/](http://proxool.sourceforge.net/)
slf4j+log4j | 日志系统 | [https://www.slf4j.org/](https://www.slf4j.org/)
maven | 依赖管理及项目构建 | [http://maven.apache.org/](http://maven.apache.org/)