游戏开发总结-java篇

  • 前言
  • 网络通信
  • 数据存储
  • 逻辑开发
    • 逻辑开发一般遇到的问题有:
  • Java游戏服务器方面的开发要掌握的技术:
    • java服务器目前主流框架技术

前言

Java语言,由于学习成本低,开发速度快,稳定性高,开源框架多,目前已成为网页游戏和手机游戏服务器开发的主要语言。从系统的开发流程简单梳理一下服务器开发需要用到的技术。

网络通信

这个是首要实现的,如果没有网络通信,就没有服务器存在的必要了。
网络通信就需要建立网络连接。目前网络通信有两种方式,

  • 一种是短连接 比如http,
  • 一种是长连接 比如socket
    当然http也是基于socket的,socket是通信的基础。所以要对tcp/ip通信的知识有所了解,明白通信的原理。
  • 基于这两种网络通信,游戏服务器也分为两种,弱联网和强联网。
    弱联网的游戏一般是指一些小型的游戏,比如开心消消乐,连连看,以及一些卡牌养成类游戏,这类游戏一般几秒钟或几分钟再会与服务器同步一次数据,一般会使用短连接。
    一些arpg游戏,实时战斗类游戏,以及带同屏显示玩家的游戏,这类游戏与服务器交互信息频繁,一秒钟可能几十次,会采用长连接,避免每次连接重新建立消耗系统资源,提高通信效率。

为了网络通信的效率,服务器要使用NIO(非阻塞网络通信)通信。它能支持大并发连接。
Java NIO是多路复用IO,在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。** 目前基于此技术有很多开源框架,最常用的有两种,Netty和Mina **

所以在网络通信这一块,如果是弱联网游戏,可以使用web那一套来开发游戏服务器,需要学习的技术一般有http原理,Json格式协议,servlet,Tomcat(也可以是其它web容器),spring等。
如果是强联网游戏,要学习的技术有Netty或Mina可以选择一种,多线程以及线程池的应用。这是网络通信所必须掌握的。只要能把客户端发送的信息接收到,并解析成代码使用的明文,就是成功了一半了,剩下的事就是把代码封装好,方便逻辑开发调用!

通信这块还要考虑消息的并发,长连接情况下,怎么处理断包,粘包问题,每个用户的消息处理的是不是有序的,如果有序会不会阻塞消息,如果无序会不会造成处理混乱,比如后到的消息先处理了,这些问题都要处理好,目前一般是保证同一个用户的消息要有序处理!

数据存储

网络通信调试好之后,不要急着做逻辑开发,还需要把数据如何存储理清楚!因为服务器端操作的全是数据,如果处理的不好,容易出bug,丢数据,这对游戏玩家来说是致命的,不可接受的!
数据存储要考虑:

  1. 数据如何存到数据库,是同步存储,还是异步存储!同步存储即将数操作完之后立刻写入数据库,异步操作即数据操作完之后先存储到内存缓存,然后由另外的线程或进程再同步到数据库!游戏中一般都是采用的异步存储方式,因为游戏并发量大,必须低延时,快速响应客户端!如果直接操作数据库太慢,会造成消息阻塞!内存缓存可先择的框架有redis,memcache,具体怎么同步到数据库,需要自己去设计了!
  2. 数据接口如何设计,能不能用工作生成这些数据操作的代码,能不能不用写SQL语句,需是封装在底层,或由工具生成。编程是门艺术,在这就体现出来了,当然是仁者见仁,智者见智了!
  3. 并发情况下数据的一致性,像这类可能多线程操作的数据,一般是放在内存中,由锁来控制并发!所以对锁的使用要熟悉,不要出现死锁,或锁粒度过大,造成线程的长时间等待的情况!
  4. 当数据量太大,一个数据库存储不了,数据该怎么分库分表!一种是水平划分,一种是垂直划分!具体的划分方式其它资料已有详细介绍,请自行查找阅读!目前有一个开源的分库框架mycat,是用JAVA写的,大家可以研究一下!

逻辑开发

逻辑开发就是实现游戏策划想象的各种游戏功能,比如,登录,物品使用,战斗结算等!逻辑开发代码量巨大,相互之间有很紧密的耦合性,所以每个功能模块一定要划分好!
最好是接触下单元测试,写之前考虑一下是否方便单元测试,这样设计的代码会更加清晰,每个方法责任明确,不容易出bug!
正是因为逻辑代码复杂,为了更好的管理代码,前辈们给我们总结了一些经验,就是著名的设计模式,所以学习一下设计模式对代码的管理有很大的好处!

逻辑开发一般遇到的问题有:

  1. 数据同步
    一说到数据同步或资源共享的时候,一般都会考虑到锁的使用。因为一份资源同时只能被一个线程访问才是安全的。Java的JDK中提供了一些锁,比如:synchronized,以及java.util.concurrent.lock包中的Lock对象,java.util.concurrent包中还提供了其它的一些原子操作的类,我们知道i++操作不是线程安全的,但是可以使用AtomicInteger中的getAndIncrement();方法代替,还有线程安全的ConcurrentHashMap哈稀Map。以及阻塞队列LinkedBlockingQueue等。都是逻辑开发中常用的处理数据同步的类。

  2. 设计模式的使用
    使用设计模式,可以让代码更加清晰,可扩展性更强,维护性更佳,比如,任务系统,任务会有很多种类型,要获得任务数据时,在一开始写这个系统的时候,我是这样写的if(type == 1)做什么,else if(type == 2)做什么,else if(type == 3)…else if(type == 35) else等。如果需要添加新的类型,又要添加else,这些if else都在同一个方法中。最后都不敢动一块,就怕出bug。其实当一个方法中出现三个以上的if else将来还可能增加时,就应当考虑设计是不是有问题了,后来改成责任链模式或状态模式,就解决了这个问题。还有一个例子是,当一个值变化,要影响多个任务完成状态时,可以使用观察者模式或监听模式或订阅模式去实现,这样功能之间完全解耦,出问题的机率会很小很小。

  3. 数据缓存框架的API使用
    目前主流使用的数据缓存框架有redis和memcache,虽然在逻辑开发前,主程会对这些进行一些封装,但是作为使用者还是需要对这些框架的客户端的使用要有所了解的。这些可以去阅读相关的文档。不是太难。

  4. 程序部署与运行
    目前,大多数Java项目都采用maven管理 ,可以使用maven打包开发好的程序,程序一般运行在远程服务器上,比如云服务器。一般运行Java程序的远程服务器都是Linux系统,需要使用Linux命令操作,或写一些shell脚本去自动化部署管理一些程序。

  5. 艰苦奋斗的精神
    首先,一定要让自己对这一行有兴趣,明确自己在这一行的技术选择,人生选择。很多人都知道,程序员加班是常有的事,坚持的住就做,坚持不了就再换一家公司做。

Java游戏服务器方面的开发要掌握的技术:

  1. 网络通信框架,Mina或Netty必须熟悉一种。而且自己必须要亲自搭建过,并明白其它原理。
  2. 通信协议制定和处理断包粘包,这一般属于网络通信框架要解决的问题。
  3. 数据缓存框架,redis或memcache选择一个,能熟练使用其客户端的命令。
  4. Java基础,Java NIO通信原理,Java集合的使用,Java多线程开发,Java锁的使用
  5. 了解一些设计模式。最好能把23种设计模式都看一遍,并结合自己的开发经验,看哪些可以用到设计模式,但也不能死套设计模式,要灵活运用。
  6. 熟悉使用Mysql数据库
  7. 了解数据库连接池的一些框架,比如Mybatis,hibernate
  8. 对Http协议熟悉,熟悉一种web容器,比如tomcat,了解其配置。
  9. 对常用的一些Linux命令要熟悉使用。
  10. 热爱学习,不断的充实自己,上面所说的只是入门技能而已,真正做起来要复杂的多,一定要让自己喜欢游戏这个行业,这样才能有动力做下去,做自己喜欢的工作还是比为了工作要好的!

java服务器目前主流框架技术

网络层netty或mina
数据协议protobuf
数据库mysql
缓存数据库redis jdbc一般是mybaits或者jpa
项目管理maven
设计层面spring
然后还需要熟悉多线程
linux的基本操作,git或者svn。

游戏开发总结-java篇相关推荐

  1. 游戏开发心得——书籍篇——《游戏引擎框架》-导论

    游戏开发心得--书籍篇--<游戏引擎框架>-导论 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 学习<游戏引擎框架> ...

  2. 游戏开发面试答案篇(一)-- C++篇​

    游戏开发程序岗面试题答案版C++篇,后续继续更新游戏逻辑篇.unity篇.图形学篇,并整理成文档,可在公号[游戏君五尘]获取 原文链接 游戏开发面试答案篇(一)-- C++篇​ 目录 一.基础语法 二 ...

  3. 游戏开发心得——书籍篇——《游戏引擎框架》-专业工具

    游戏开发心得--书籍篇--<游戏引擎框架>-专业工具 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 学习<游戏引擎框架&g ...

  4. Cocos2D手机游戏开发之优化篇

    Cocos2D手机游戏开发之优化篇 在这个手机游戏盛行已久的年代,一款产品想要博得更多用户的喜爱就要在细节上做得更加到位.而游戏的优化在这里面起到了非常关键的作用.试想下,一款画面和玩法都深受用户喜欢 ...

  5. Java 游戏开发:关于Java面向对象的知识( 四)

    这是上期教程:Go To It! 新年过去了,鸽了几天的教程,今天我们开始继续学习(新年快乐~) 游戏人物类的实现 对于一个游戏人物而言,我们可以想到以下的字段: 最大血量 当前血量 名称 装备数组( ...

  6. Java 游戏开发:关于Java面向对象的知识(一)

    Java 游戏开发:关于Java面向对象的知识(一) 软件的生命周期(了解即可) 由于我们是大专生 这里的生命周期是之前软件工程的笔记,你们了解就可以了 什么是软件的生命周期 一个软件从被开发到被正式 ...

  7. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[0]——月晕础润

    开场诗: 不儒不道又不仙,非神非圣也非贤.轻吐心头寻常语, 开辟文武一片天. 自表诗: 北冥沉渊有鲲鹏, 吞噬金乌戮真龙.一日扶摇凌天起,三千世界可横行. 小子"鹏凌三千",欲将心 ...

  8. 人生如梦游戏间,RPG游戏开源开发讲座 JAVA篇 4 ——一步莲华

    从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低--无比郁闷中,继续写这个-- 上一回我们写到关于如何改变角色的移动样式及线程的初步 ...

  9. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华

    从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低--无比郁闷中,继续写这个-- 上一回我们写到关于如何改变角色的移动样式及线程的初步 ...

最新文章

  1. 微软发起Java on Azure调查,呼吁Java社区积极参与
  2. (牛人莫入)Silverlight 独立文件存储
  3. 【Python Turtle合集】”外面的花已经开得很像样了, 我看到风拥作一团, 前来庆贺“(春天来啦~)
  4. 工作中必须要知道的git高级用法
  5. IE6 下图片少一块
  6. 2021年慈溪横河中学高考成绩查询,慈溪中学
  7. 系统架构工作笔记-数据展示进程与读取数据进程分离,实现低耦合(展示软件可适用任意厂家数据库)
  8. java list resultset_Java工具类 通过ResultSet对象返回对应的实体List集合
  9. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解
  10. 请求参数完整性校验,解决流只能写一次的问题
  11. jmeter连接mysql时jdbc下载
  12. 《Apache Spark源码剖析》
  13. java天津与深圳,国内最可惜的城市:GDP曾是深圳的38倍,如今GDP被反超万亿!
  14. 怎么用c语言测试音频文件,如果用c语言程序读取一段音频文件要如何做,具体要调用哪些函数,在网上搜索了半天,乱七八糟的,找不到什么有用的信息...
  15. 当我跑步时我在想什么读后感
  16. VR Masterclass
  17. make编译源码时报error: ‘for’ loop initial declarations are only allowed in C99 mode的解决办法
  18. linux mysql ip_Linux下配置mysql允许指定IP远程访问
  19. 关于测试中常用到的一些方法、策略总结
  20. 门禁系统远程无线联网解决方案

热门文章

  1. Dijkstra算法之matlab实现
  2. html form表单数据转为json传输
  3. 搭建Harbor镜像仓库
  4. 利用JAXB 返回 POJO对象
  5. 论文阅读:CVPR2020 | MoCo:Momentum Contrast for Unsupervised Visual Representation Learning
  6. 辞职了,老板不发工资,怎么办?
  7. Xutils的注解示例
  8. ALIos与android区别,xamarim开发android,ios到底好不好
  9. 汕头市队赛 yyl杯1 T2
  10. [普及扫盲]芙蓉JJ——红透清华北大的美女(狂晕中)