WEB与游戏开发的一些区别

时间:2021-07-10 22:13:28   收藏:0   阅读:39

WEB与游戏开发的一些区别

前言

? 最近由于在准备期末考,以及准备实习。其实都没好好写过博客,但今天由于个人身边的一些事,所以对做web和做游戏开发的区别做个记录,以下都是从网上搜索到的资料文章,感觉可以解决一些疑惑,有的文章无法贴原作者的链接,因为实在找不到原作者,如有侵权,联系删!!!



解释一:

? 原文未找到!!!

在一间游戏公司的两个部门待过, 前一个部门以做web开发为主,后一个部门做游戏开发,我在两边都是做后端的。在游戏部门待的时间不长, 不敢说已经深入了解游戏开发技术细节,我仅把我已经接触到的内容与之前擅长的web技术做对比,一来作为工作日志记录, 二来希望能给想从web转游戏的同学提供一个预先学习的方向,少走一些弯路。

? 这一系列内容我会连载发布,而不是一次性讲清楚所有内容, 毕竟当前还不敢狂妄的表示已经了解游戏开发的种种细节。

通用性

? 即使不同类型的软件开发也是具有一定相似性的,这种相似性随软件类型的不同而不同。 如web前端开发与web后端开发差异就挺大, 前端程序运行在浏览器中,后端程序运行在服务器上;前端程序操纵的目标是网页元素,后端程序操纵的目标是存储在服务器上的数据。前端和后端相似的地方估计也就编程语言使用的一些基础概念了,所以前后端程序员岗位转变存在一定难度,比如让一个没有任何后端经验的前端程序员立马上手写后端程序,几乎不可能。

? 然而web服务器和游戏服务器的差异就没这么大了,它们用的是相同的编程语言, 比如说java;它们用的是相同的数据库软件,比如mysql和redis;它们都运行在服务器端,比如linux server和windows server,且对稳定性要求及其严格。拥有这几处相同点两种程序在宏观上是完全相似的,对应程序员工作的转换也不存在硬性的技术障碍, 如果程序员技术基础扎实,完全可以平滑过渡。

差异性

? 因为业务的不同,web服务器和游戏服务器势必存在不同之处,然而这种不同并非技术上的不同,而是套路上的不同。

服务器类型的不同

? web程序使用http服务,浏览器和服务器之间是http协议通信。游戏服务器通常是一个socket服务器,与游戏客户端之间保持长连接,如果是网页H5游戏,那么使用的也是全双工的websocket协议。通常,使用http协议的web服务器不用程序员费事去管理网络连接,程序员只要专注业务逻辑即可。而使用socket或者web socket等协议进行长连接通信却需要程序员手动编程管理,比如说断线重连游戏状态恢复机制,就需要手动处理网络连接。这表示socket编程难度大于http编程,从而导致游戏服务器编程大于web服务器编程。可这并不能表示游戏服务器编程不同于web编程, 如果一个web程序员不了解socket编程原理,那也不能算一个优秀的web程序员,毕竟http是以socket为基础的。

传输数据格式的不同

? 在web前后端传输数据除了使用http标准的键值对格式以外使用最多的是json,json被使用的一个最重要的原因是与JS无缝兼容,高效方便。然而,这种优势在游戏客户端中不存在,人家游戏客户端又不使用JavaScript编程,所以游戏客户端和服务器之间有更合适的数据传输时格式存在。我接触到的是谷人希家的protocol buffer协议, 它相对于json的优点是体积小。经我测试,同样的数据内容,使用protocol buffer格式存储大小只有使用json存储的三分之一甚至更低,即使在某些特殊情况下也不会超过json的一半。
严格验证数据格式,有xml xsd的功效。而json数据格式验证相对宽松,只要符合json语法就行,因此容易出错。反之,protocol buffer则更加稳定。至于缺点最严重的是使用麻烦, 需要借助谷人希的第三方工具才行。protocol buffer的使用细节,这里不作讲解。

分布式处理业务

? 我接触到的游戏服务器是微服务的一种形态, 整个游戏服务器的逻辑被分割成很多服务模块,分别运行在不同的服务器上。然而,我无法理解的是每个模块之间的通信居然使用socket,而不是更流行的http。游戏客户端与服务器之间使用socket连接可以理解, 然而,服务器各模块之间也使用socket却有些使我莫名其妙,虽然这会使服务器之间通信性能有所提升,却会带来编写代码任务过于复杂,稳定性下降等问题,为了些许性能提升而丧失项目的维护性,有点得不偿失。 不过也有可能我还没有理解其中奥秘,判断过于片面。

极端的性能敏感

? 游戏中实时对战模块必须使用c/c++实现,原因是JVM执行垃圾收集时会造成虚拟机停顿,也就是stop the world。在虚拟机技术发展日新月异的今天, gc停顿依旧会对游戏体验造成影响,因而必须使用老掉牙的c++, 这使我感到震惊。另外, 游戏中大多数数据被放在redis中而非mysql也使我意外,数据持久化存储显然不是redis的优势,拿性能换稳定和安全,这种做法略显激进。

以上内容是我当前对于web开发与游戏服务器开发不同之处的见解,如有谬误请指出。 此外,在之后的学习和实践中的心得体会,会在之后的文章中继续发布。


解释二:

游戏服务器和Web服务器的区别

有些对游戏服务器的介绍可能会说,游戏服务器是一个需要长期运行的程序,然后怎么怎么样。我个人认为Web服务器一样的需要长期运行,也需要响应不定点不定时来自用户的请求。两者从宏观上来看其实没有本质的区别。同时Web服务器也会对于稳定性和性能有要求,游戏服一般分为大小服,我们这里都按照小服举例子。

3.1 状态

首先要提到的就是状态。可能你会听说过一个概念,游戏服务器是有状态的,而Web服务器是无状态的。什么意思呢?Web服务器的数据流大多直接会到数据库中。而游戏服务器的数据流首先会到内存中,然后定期的写入数据库(落地)。

换句话说,游戏服务器本身的数据与数据库中的数据在运行期间会存在一个数据不一致的窗口。如果此时游戏服务器宕机了,那么就会造成数据首先到的内存数据与数据库存的数据不一致。

而Web服务器则不会有这样的问题,Web所有的数据状态都会落地,而且可以针对操作加上事务,不用担心因为操作失败而引入脏数据。正因为有了状态的约束,游戏服务器就会很慎重的使用内存、CPU。以求在资源有限的情况下,最大化的提高的承载量,并且降低服务延迟。当然,Web服务器会为了降低某个接口的响应时间而去做对应的优化。

3.2 扩容

在Web服务器中,如果你不能评估一个服务所面临的压力,又不想因为瞬时的热点访问导致服务直接不可用的话,完全可以设置成自动扩容,因为每个服务只是单纯的接收请求,然后处理请求、返回结果,不会将数据保存在服务器的内存中。要有数据存到内存,那也是在Redis中。而Redis数据丢失对数据的一致性基本没有影响。

但是在游戏服务器这边很难做到像Web那样灵活。首先,数据的流向不是数据库,而是内存。

举个很简单的例子,玩家的主城被攻打着火了,如果有了自动扩容,很有可能在落地的窗口内,玩家再请求一次,请求到了另一个实例。主城又没有着火了。因为数据都会先存在内存中。

再举一个例子,玩家氪金买了一个礼包。然后退出游戏,落地窗口内再次上线没了。这就不是单纯的数据问题了,玩家这是花了真金白银买的道具,突然就没了,一两个还好处理,如果多个玩家都出现这样的问题,那这就属于严重的线上事故了。修复数据的工作量十分的大。

所以,对于一个游戏服务器,所能使用的内存和CPU的资源是非常有限的,不像Web服务器可以不用花很大的代价做到横向扩展。这也就是为什么游戏服务器会十分十分的注重代码的性能以及稳定性。

3.3 稳定

就像上面说的例子,如果游戏服务器运行中出了BUG,导致服务直接不可用,或者说通过这个BUG刷到了大量的道具,将是一个非常严重的线上事故。

而对于Web服务器来说,如果是管理系统之类的,有可能会有脏数据值得一提的是,脏数据对于Web来说,排查起来也是一件很头疼的事情。如果没有脏数据,只是服务暂且不可用,而且如果用的是微服务架构,重启服务的代价是相对来说比较小的,只有正在重启的服务的业务是不可用的,其余的部分则可以正常的访问。

而对于游戏服务器来说,服务器重启影响的是全服的玩家。玩家在停服期间,甚至连游戏都进不了,特别的影响玩家体验。而且,如果停服之前服务器的数据落地出现了问题,服务重启之后会将数据从数据库load到内存中,此时同样会造成数据不一致的问题。

3.4 性能

从我的经验来看,在做Web服务器的时候,没有为了减少GC的压力,为了少占用内存去做过多的优化。当然这是因为项目本身的体量不大,如果QPS很高的话,Web服务器同样很需要注重性能,只不过游戏服务器需要一直特别注意这个方面。

不过在Web,如果访问量很大的话导致单个服务不能扛住压力,大部分人首先想到的解决方案应该就是搞多个实例,毕竟可以做到很轻松的横向扩展。

在游戏服务器里,会把服务器的资源看的相当的宝贵。例如,能不落地的字段就绝对不要落地,某个字段的值可以通过已知的条件算出来的,就尽量不要定义在代码里。不过这也要看具体情况权衡运算量和调用的频率。因为上线之后,如果遇到了数据不一致,维护的数据越少,修复数据的难度就越小。

3.5 严谨

这一点上来说,我认为是两者都很关注的一个重点。只不过,在游戏服务器的某些情况中,如果服务器抛出异常或者panic。其造成的后果会被游戏特殊的环境放大。

例如,召回你的在外部队失败了,那么部队就会一直在外面且不可用。这跟在浏览器中点一个按钮没有反应比起来,影响相对较小。而且使用微服务架构,在修复问题之后可以以很低的成本来重启对应的服务,而游戏服务器中还要修复一次数据。

再举一个很极端的例子,点击商店,玩家要准备氪金了。但是却发现进不了商店,也可能不能获取商品列表。这些会直接影响到游戏的体验,甚至收入。

而对于Web来说,服务器的稳定性同样很重要。不然根据业务的不同,造成后果的严重性也有可能不同。影响了用户体验,就会直接影响到产品的口碑。

3.6 数据传输格式

熟悉Web的都知道,数据传输格式是JSON。而在游戏服务器中是Protobuf,是由Google开发的数据传输格式,与JSON类似。Protobuf是二进制的,二进制数据量会比JSON更小一点。而且,如果传输的字段是空值,就不会被传输。而JSON如果是空值,一样的也会被传输。

无论是在什么样的环境中,举个例子,Node.js和Java中,Protobuf的性能表现都比JSON好。在Java中,Protobuf甚至要比JSON快了接近80%。如果Java的服务之间通信有了性能瓶颈, 可以考虑服务之间使用RPC来通信。

但是凡事都具有两面性。Protobuf的缺点仍然存在:

  • 文档较少
  • 社区与JSON的对比起来
  • 可读性没有JSON好

原文:https://zhuanlan.zhihu.com/p/86748689


问题

? 对这块仅仅做了个简单的了解,也并不知道大佬们眼中的区别是怎样的,以及那种多人联网棋牌类游戏用Java可以开发吗?如果可以,可以用什么方式呢?个人没有一个准确的认识,希望有大佬可以给我指正以及讲述一下这里面的一些原理。

原文:https://www.cnblogs.com/yuyueq/p/14994810.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!