游戏预研杂记

转载请注明出处:

1. 角色扮演游戏(Role-playing game),简称为RPG,是游戏类型的一种。在游戏中,玩家负责扮演这个角色在一个写实或虚构世界中活动。

玩家负责扮演一个或多个角色,并在一个结构化规则下通过一些行动令所扮演的角色发展。玩家在这个过程中的成功与失败取决于一个规则或行动方针的形式系统(Formal system)。

 

2. FPS(First-person Shooting game)第一人称视角射击游戏顾名思义就是以玩家的主观视角来进行射击游戏

 

3. MOBA,英文全称:Multiplayer Online Battle Arena,缩写:MOBA,中文翻译:多人在线战术竞技游戏,又被称为Action Real-Time Strategy(缩写:Action RTS,ARTS)动作即时战略游戏。

 

4. “MMORPG游戏”其实就是“大型多人在线角色扮演游戏”的英文缩写,属于电子游戏的一种。

MMORPG是角色扮演的一种,只不过是大型多人的,原名是Massive Multiplayer Online Role-Playing Game,就是指的现在大型多人在线角色扮演游戏。

在所有角色扮演游戏中,玩家都要扮演一个虚构角色,并控制该角色的许多活动。

 

游戏长链接预言

  1. 参考项目:

https://github.com/zfoo-project/tank-game-server/blob/main/README_CN.md


zfoo简介

https://github.com/zfoo-project/zfoo/blob/main/README_CN.md


NettyWebSocket 长链接,支持像 RequestMapper 资源映射

https://gitee.com/xiao-guo-coder/netty-web-scoket


nodejs

https://github.com/k8w/tsrpc-examples

 

go 游戏项目:

https://github.com/danie1Lin/Distributed-Golang-Game-Server

 

https://juejin.cn/post/7041560950897377293

 

状态同步和帧同步

一、同步 同步就是要多个客户端表现效果是一致的,而且对于大多数的游戏,不仅仅要表现一致,还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的。

二、帧同步 帧同步的代表作当属当下最火的手游王者荣耀了吧,它就是帧同步完成的,也意味着它的核心的战斗逻辑写在客户端。帧同步经常被采用在RTS游戏(Real-Time Strategy )中。在游戏中,又客户端给服务器上传玩家的指令,服务器收到指令之后不做任何操作然后转发给所有的客户端。客户端来运算包括技能逻辑、普攻、属性,伤害、移动、Al、检测、碰撞等一系列的内容,这也是游戏中最核心和最难的部分。所有的客户端运算完成所有接收到的指令,并且修改相应的属性和对应的特效。

三、状态同步 状态同步和帧同步是相反的,它最核心的一系列东西都写在服务器端。当客户端发送要进行操作给服务器,服务器进行一系列的操作运算,然后把相应的结果发送给所有的客户端,客户端接到数据后修改属性。这里客户端相当于服务器的播放器一样,因为核心的判断都是在服务器的,一切的表现和属性都以服务器为准,就算客户端的血条是满的,服务器的血条是0,那依旧要死。

例子:一个角色要释放一个技能(非指向技能),

客户端告诉服务器我要释放一个技能 服务器通知所有客户端在某个地方以什么方向释放技能 客户端根据收到的信息创建一个特效放在这个地方,然后以某个方向飞行 服务器根据碰撞检测判断到某个时刻碰到了地方英雄,通知客户端 客户端根据服务器发来的信息删除特效,被打到的人减少血量播放收击特效 四、帧同步和状态同步的区别

  1. 流量 状态同步的消耗的流量比帧同步要多的多,因为状态同步所有的属性都是在服务器的,当某个角色的属性变化之后都需要同步给所有客户端,而且在一些复杂一些的玩家角色的属性有上百条,这样同步下来消耗是巨大的。而帧同步不需要做属性同步,服务器只需要做一次转发操作指令,属性这些都是客户端自己计算,所以消耗少的多。

  2. 回放和观战 帧同步比状态同步简单,因为只需要保存每局内所有人的操作就好了,当回放的时候只需要挨个播放这局所有的操作就好。状态同步需要有一个专门的服务器,当一局战斗打响,服务器给客户端发送消息的同时,还需要把这些消息发送给这个专门的服务器做存储,当有人看回放或者观战时,这个专门的服务器把存储起来的消息发就可以了

  3. 安全性 状态同步比帧同步安全性高很多,因为状态同步的所有数据和逻辑都是在服务器端保存的,要想作弊就必须修改服务器的值,这样难度就会高很多;而帧同步所有的数据时在客户端,只要解析客户端的数据之后就可以达到自己想要的效果。

4.断线重连 帧同步的锻炼重连时比较麻烦的,当你在10分钟的时候断线了,在15分钟回来,就需要把服务器这15分钟的消息一次性的发送给客户端,然后客户端加速整个游戏的核心逻辑运算,直到追上现有进度。状态同步很简单,重新把整个场景中的任务全部重新生成一边,各种数值根据服务端提供的信息加到任务身上即可。

  1. 开发效率 状态同步的游戏占主流,同一个功能至少需要一个客户端和服务器共同完成,开发起来比较困难。而帧同步服务器开发难度低,服务器只需要转发,而帧同步不需要和服务器的沟通交状态同步,开发的效率也高。 ———————————————— 版权声明:本文为CSDN博主「choudan8888」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/choudan8888/article/details/118414664

 
 

游戏开发中网络通讯协议对比

 

在网络游戏开发中,通讯协议是一个无法被避免的问题,无论对于客户端开发中还是服务器开发程序猿而言,制定一个合适的通讯协议是很有必要的

游戏联网需求有弱联网游戏,即时互动类游戏

选择通讯协议的时候主要关注于延迟低,易用,低成本等

 

下面对比TCP,UDP,HTTP,WebSocket 四种协议优缺点、特性

TCP:

优点: 可靠性 、全双工协议、开源支持多、应用较广泛、面向连接、研发成本低、报文内容不限制(IP层自动分包,重传,不大于1452bytes)

缺点: 操作系统:较耗内存,支持连接数有限、设计:协议较复杂,自定义应用层协议、网络:网络差情况下延迟较高、传输:效率低于UDP协议

特性: 面向连接、可靠性、全双工协议、基于IP层、OSI参考模型位于传输层、适用于二进制传输

 

UDP

优点: 操作系统:并发高,内存消耗较低、传输:效率高,网络延迟低、传输模型简单,研发成本低

缺点: 协议不可靠、单向协议、开源支持少、报文内容有限,不能大于1464bytes、设计:协议设计较复杂、网络:网络差,而且丢数据报文

特性:无连接,不可靠,基于IP协议层,OSI参考模型位于传输层,最大努力交付,适用于二进制传输

 

HTTP:

优点: 协议较成熟,应用广泛、基于TCP/IP,拥有TCP优点、研发成本很低,开发快速、开源软件较多,nginx,apache,tomact等

缺点: 无状态无连接、只有PULL模式,不支持PUSH、数据报文较大

特性: 基于TCP/IP应用层协议、无状态,无连接、支持C/S模式、适用于文本传输

 

WebSocket

优点:协议较成熟、基于TCP/IP,拥有TCP优点、数据报文较小,包头非常小、面向连接,有状态协议、开源较多,开发较快

缺点:没发现啥缺点

特性:有状态,面向连接、数据报头较小、适用于WEB3.0,以及其他即时联网通讯

 

 

协议选择

通过以上对协议特性分析,我想大家心里已经有低儿了。建议:

1、对于弱联网类游戏,必须消除类的,卡牌类的,可以直接HTTP协议,考虑安全的话直接HTTPS,或者对内容体做对称加密;

2、对于实时性,交互性要求较高,且team有过相关经验,可以优先选择websocket,其次TCP协议;

3、对于实时性要求极高,且可达性要求一般可以选择UDP协议;

4、局域网对战类,赛车类,直接来UDP协议吧(公网对战,P2P的UDP还得“打洞”处理) ———————————————— 版权声明:本文为CSDN博主「honey199396」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/honey199396/article/details/54603860

 

netty中的NIO Socket底层使用的就是TCP协议,所以我们只需要像常用的netty客户端服务一样构建客户端即可。

 

1.Socket通讯 TCP/IP协议是一种通用的、跨语言、跨操作系统、跨机器的通讯方案。这也是开发者首先想到的一种手段。在使用上,有使用TCP和UDP两个选择。一般我们倾向在游戏系统中使用TCP,因为游戏数据的逻辑相关性比较强UDP由于可能存在的丢包和重发处理,在游戏逻辑上的处理一般比较复杂。由于多进程系统的进程间网络一般情况较好,UDP的性能优势不会特别明显。

要使用TCP做跨进程通讯,首先就是要写一个TCP Server,做端口监听和连接管理;其次需要对可能用到的通信内容做协议定制;最后是要编写编解码和业务逻辑转发的逻辑。这些都完成了之后,才能真正的开始用来作为进程间通信手段。

———————————————— 版权声明:本文为CSDN博主「森明帮大于黑虎帮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_44918090/article/details/126510455

 
 

链接

Springboot使用netty应用tcp协议

https://blog.csdn.net/qq_27535933/article/details/122107134

 

经典游戏服务器端架构

https://blog.csdn.net/qq_44918090/article/details/126510455?spm=1001.2014.3001.5502

 

https://blog.csdn.net/qq_44918090?type=blog

 

服务器解决了什么问题、状态同步和帧同步

https://blog.csdn.net/qq_44918090/article/details/126505660

 

游戏 帧同步 实现

https://blog.csdn.net/best789248/article/details/78439254?spm=1001.2014.3001.5502

二进制的世界

https://blog.csdn.net/best789248?type=blog

 

游戏 场景同步 实现(状态同步)

https://blog.csdn.net/best789248/article/details/78434114

 
 

链接

Springboot使用netty应用tcp协议

https://blog.csdn.net/qq_27535933/article/details/122107134

 

经典游戏服务器端架构

https://blog.csdn.net/qq_44918090/article/details/126510455?spm=1001.2014.3001.5502

 

https://blog.csdn.net/qq_44918090?type=blog

 

服务器解决了什么问题、状态同步和帧同步

https://blog.csdn.net/qq_44918090/article/details/126505660

 

游戏 帧同步 实现

https://blog.csdn.net/best789248/article/details/78439254?spm=1001.2014.3001.5502

二进制的世界

https://blog.csdn.net/best789248?type=blog

 

游戏 场景同步 实现(状态同步)

https://blog.csdn.net/best789248/article/details/78434114

 
 
 

从市场来看,以Go为主要语言的商业模式基本是视频、通讯、游戏、云设施等,业务不是特别复杂,但要求性能好。当然,java语言的性能还不错,但是确实很吃资源。

Go 的公共库质量很差,而且 Go 的包管理实际上一直在变化。这是个大问题。从职业上来说,go更适合C++转换。

还有企业级开发、电子商务、大数据公司、金融支付等等,你基本可以想到java的影子。 Go不适用于业务复杂、数据处理多样的系统。如变换、多重排序、过滤、聚合。这时候的java真的香了,永远也不过分。没有必要重复创造汽车和马匹。这是Java成功的关键。历史已经尘埃落定,以至于 Java 提供了太多的选择。

 

业务越复杂,越适合用java。 java的性能非常强,比如网站12306和淘宝就足以证明这一点。 Go 语言甚至没有一个有用的缓存框架。

 

与 Java 相比,go 仍然是一门相当不成熟的语言。

Go语言设计的初衷是快速解决问题,学习门槛低。

https://www.joyindie.com/articles/6151.html

 

擅长的领域不同

Go从诞生到现在,都是致力于将编程简单化,go更偏向于效率。Java的优势依旧在于安全、稳定,跨平台。

 

protostuff 与 protobuf

 

Google的protobuf因为其编码后体积小,序列化/反序列化性能好,被广泛使用。但是protobuf需要编写.proto文件,再通过protobuf转换成对应的java代码,非常不好维护。

protostuff就是为了解决这个痛点而产生的。通过protostuff,不需要编写.proto文件,只需要编写普通的java bean就可以使用protobuf的序列化/反序列化。

protostuff有两个东西:Schema和Runtime Schema

链接:https://www.jianshu.com/p/6cfa88606260

 

java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子

http://www.javashuo.com/article/p-gnixjckj-ma.html

 

netty结合Protostuff传输对象案例,单机压测秒级接收35万个对象

https://blog.csdn.net/tianyaleixiaowu/article/details/107714868

 

从零学Netty(十)Netty心跳处理器

https://lionli.blog.csdn.net/article/details/109203108

 

netty 与 websocket 对比

websocket是一个通信协议,而netty是一个Java网络编程框架。我们可以利用netty实现websocket通信,也可以用其他的。

 

netty-example

  https://gitee.com/doveylovey/netty-example?_from=gitee_search#https://gitee.com/link?target=https%3A%2F%2Fwww.cnblogs.com%2Fsnail-gao%2Fp%2F15595747.html

 

 

 


Go语言圣经(中文版)

https://docs.hacknode.org/gopl-zh/

details/122107134

Go语言高级编程

https://books.studygolang.com/advanced-go-programming-book/

 

Go语言中国(重生)

https://github.com/golang-chinadetails/122107134

 

go语言分布式游戏项目

https://github.com/danie1Lin/Distributed-Golang-Game-Server

 

 

 
 

 

posted @ 2022-03-23 23:33  香吧香  阅读(84)  评论(0编辑  收藏  举报