普通业务功能的开发,和游戏方向的开发有什么差异吗

2020-07-02 12:01:41 +08:00
 Renco

了解下情况,游戏开发的语言比较常用的是哪些。Java 初级开发可以尝试着转游戏方向吗。

4392 次点击
所在节点    程序员
31 条回复
dogfeet
2020-07-03 10:21:37 +08:00
看过很多很多所谓的流水很高的 C++ 游戏服务端代码,大部分都是一坨烂泥。游戏界真的很奇怪,你说难点吧,确实很多,一些方面比 Web 领域的要复杂很多,这些难点吧,都还被一定程度的解决了或者说绕过去了。
听起来像很牛是吧,实际一看代码后,你会怀疑人生。
比如说数据一致性,分布式,包括像现在流行的微服务中的一些设施很多游戏服务端都有自己实现类似的概念,但是,和系统成理论的,成体系的,讲范式讲使用体验的现代搞法完全不一样。
很多这样的 C++ 的代码只是在一个小小的项目中不停的被重复拷贝粘贴修改,其中一堆的隐含前置条件,只能在本项目中保证绝大部分情况下不出问题而已。
看看游戏界的开源情况就知道了,可能因为本身相对还是太小众吧。
就技术而言,特别是 java 这块,总体平均水平看的话还是 Web 方向有技术含量些,你看看 github 上那些开源的 java 游戏服务端的项目都是些啥。
b00tyhunt3r
2020-07-03 10:33:10 +08:00
@dogfeet 我觉得游戏服务端开发比 web 难一个量级。
你应该是远远观望了一下得了个结论吧。
可以自己实现一个微型 mmo 服务器试试,要求不高,支持 3 个玩家同时在线,身上的物品可以扔在地上被其他玩家拾取,有 pk 和聊天功能。
dogfeet
2020-07-03 11:13:14 +08:00
@b00tyhunt3r 我想说的就是类似这样的问题,很多游戏服务端看起来好像解决了这个问题,实际上连最终一致性都没法保证
就以这个例子:玩家背包物品至场景地图再至另外玩家背包,大部分游戏实现是玩家背包物品在玩家 Actor 中(为了方便大量的养成玩法直接改变消耗背包物品),场景地图中的这块区域又是一个单独的 Actor 。Actor 与 Actor 的某一次通信,没有保证(也很难保证)绝对送达且只送达一次。
就我看过的所有实现都是,actor 发送个消息,改变自己的数据,做的更进一步的是会等待一个回复。整个过程实际上是一个事务过程,游戏服务端一般数据都是存储在内存中直接操作,绝大部分实现没有保证布操作是事务的。这个实现过程几乎就是一个不出问题就不出问题的实现。打架默认都是走事后补偿路线。
我在游戏行业十多年了,客户端服务端都写过不少垃圾代码,服务端的项目更是如此。

上面的场景在游戏业务中太常见了,但是并没有哪个组织哪个企业尝试去从上层给出一个框架或者库的解决方案。反观 Web 领域,他们的场景也游戏不太一样,但是会在另外的地方有难点。Web 最后是怎么做的?会有开源的解决方案出现,比如依赖数据库的强一致性性能瓶颈后会有人做消息队列,消息保证有且仅有一次消费,消息能持久化保证不丢失,大量的这些中间件,各种 Web 框架给开发者提供源源不断的动力。而且代码质量非常高,往往技术选型上升到范式,友好度,维护性这些上去了。

反观游戏界,以 java 为例,用个 netty 就算比较现代了,akka 的算是很前沿了,这些东西都不是为游戏界输出的,当然也不是游戏界产生的。老实说游戏界没产出啥开源方案。大家都是网络框架选型完了,数据库选型完了,剩下的就又开始在那个小圈子转来转去了,多少年都是在解决那些同样的问题。
ygtq
2020-07-03 11:15:45 +08:00
@sunmes 服务端和其他业务开发区别也挺大的,游戏玩法逻辑一般更复杂,一般手游服务器都是 TCP 或者 UDP,短连接的比较少
ygtq
2020-07-03 11:20:03 +08:00
@dogfeet 听语气像是写 erlang 的?
dogfeet
2020-07-03 11:24:52 +08:00
@ygtq erlang 项目我也参与过,事实上 C++ 的很多服务端也都是封装一个 Actor 的概念出来,用 java akka 的也是这么个概念,skynet 用的人也多,也是 actor 的概念。

我一直想说的就是游戏与 Web 都有他们各自复杂的地方,但是 Web 在解决他们面临的问题的时候更上层,那么多库框架中间件都是在尝试更系统的解决他们遇到的问题,游戏界这块真的不咋地。实际情况就是我看到的绝大部分代码真的很烂很烂。顶级项目吧,也没看到有什么开源的好的。
ygtq
2020-07-03 11:29:41 +08:00
@dogfeet 游戏项目无法更“上层”的主要原因是游戏这个需求就更复杂,更不容易统一化,项目代码烂可能是写的人烂,毕竟顶级项目的顶级是流水顶级日活顶级,并不一定是代码顶级,开源游戏框架里也有写得不错的啊,比如你提到的 skynet :)
b00tyhunt3r
2020-07-03 16:46:14 +08:00
@dogfeet 你这几个问题开源的虚幻 4 引擎源码都能回答你
dogfeet
2020-07-03 18:37:05 +08:00
@b00tyhunt3r 说远了,从头到位都是在说服务端
paoqi2048
2020-07-03 22:57:46 +08:00
@dogfeet 游戏服务端开发固步自封不是一天两天了
paoqi2048
2020-07-03 23:01:48 +08:00
@dogfeet 可以看下这个 /t/647606

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX