普通业务功能的开发,和游戏方向的开发有什么差异吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Renco
V2EX    程序员

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

  •  1
     
  •   Renco 2020-07-02 12:01:41 +08:00 5196 次点击
    这是一个创建于 1928 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    32 条回复    2024-11-14 10:34:20 +08:00
    kop1989
        1
    kop1989  
       2020-07-02 12:06:43 +08:00
    服务器端的话都差不多,只是侧重点不同。因为游戏要求高并发,低延时,抗破解。
    客户端(不管是单机游戏、联机游戏还是网络游戏)的话之前是偏向于 c++,目前不知道了,因为大家都在用第三方引擎,只浅尝辄止过 unity,不敢班门弄斧了。

    不过游戏行业普遍比较累。属于劳动密集型。
    sunny352787
        2
    sunny352787  
       2020-07-02 13:52:58 +08:00
    服务器有用 Java 的,实际上现在的游戏逻辑也都是 CRUD,区别只在于游戏服务器的架构没有一定之规,基本一个游戏一个样,不像其他写 Java 就 SSH 那点东西,TCP 、RPC 什么的基本都得知道一点

    不过你要是初级开发的话,就不用想太多了,到哪都是读写数据库,想来玩玩就试试吧
    DiverO
        3
    DiverO  
       2020-07-02 14:13:25 +08:00
    Unity 手游
    客户端:C#,lua
    服务器:C++,lua(go)
    coderluan
        4
    coderluan  
       2020-07-02 14:27:45 +08:00
    服务器端差别不大, 业务功能开放和游戏开放本身差别其实很大, 越是复杂的游戏差别越大, 毕竟逻辑 /算法 /技巧大多都是不通的, 不过初级转的话问题不算太大, 毕竟一般都是用现成的引擎, 理解的运行的逻辑就能上手, 别的慢慢学就行了.
    VDimos
        5
    VDimos  
       2020-07-02 14:30:47 +08:00 via Android
    游戏服务器用 c 艹的比较多吧,游戏本体的话,2d 小游戏很多用前端开发的,3d 的话很多引擎可以用。
    初级 java 跨游戏,步子太大了。
    boyhailong
        6
    boyhailong  
       2020-07-02 14:33:44 +08:00
    没啥区别吧 都是实现逻辑 curd
    shpkng
        7
    spkng  
       2020-07-02 14:35:07 +08:00
    @VDimos 小厂不会用 C++的
    amwyyyy
        8
    amwyyyy  
       2020-07-02 14:38:17 +08:00
    有差别吧,我记得之前看到一家游戏公司的招聘要求,上面有一条,业务开发经验不算工作经验。
    tgy3313
        9
    tgy3313  
       2020-07-02 15:49:21 +08:00
    没记错的黑色沙漠服务器后端业务逻辑用的就是 java
    paoqi2048
        10
    paoqi2048  
       2020-07-02 16:08:07 +08:00
    @shpkng 不是直接使用 C++,是导出接口给脚本用
    takemeaway
        11
    takemeaway  
       2020-07-02 16:17:18 +08:00
    都一样。 只不过游戏多数更倾向于 socket
    moyixuan
        12
    moyixuan  
       2020-07-02 16:54:18 +08:00
    如果想做游戏开发,应该从什么方面入手,同 Java 开发
    wujieyuan
        13
    wujieyuan  
       2020-07-02 17:01:28 +08:00
    @moyixuan 百度一下 Cocos
    qmzhixu
        14
    qmzhixu  
       2020-07-02 17:01:50 +08:00
    我觉得区别还是挺大的,玩法需要的东西,要是没接触过,就很难转变,和常规的 crud 不一样
    joesonw
        15
    joesonw  
       2020-07-02 17:21:10 +08:00
    1. 数据怎么同步
    2. 跨服怎么做(聊天?)
    3. 热更新怎么做
    4. 重连逻辑怎么做
    xzc2677
        16
    xzc2677  
       2020-07-02 18:00:38 +08:00   1
    服务器: 一般是 C++底层 + 脚本语言游戏逻辑(Python, Lua 比较多)。Java 的不是很了解,但是也有服务器用 java 开发。
    客户端:讲讲熟悉的 Unity,一般是 C#做框架(底层) + 脚本语言游戏逻辑(也是 Python Lua 较多)。
    以上不包括小程序游戏,小游戏一般会用 Javascript/Typescript 。有个引擎叫 Cocos,还有个叫白鹭。

    我认为游戏和普通的功能业务开发差别较大的地方有
    1. 热更新非常非常重要,不管是服务器还是客户端。
    2. 配置的灵活性(游戏玩法),几乎任何新玩法都需要可以被策划随意的配置(不然真就改死你)。
    3. 不要想破脑袋去考虑扩展性,复用逻辑(仅针对玩法),因为可能过一天,整个玩法就大改,也可能再过一天,你这个玩法就没了。
    4. 游戏玩法可能比业务流程复杂很多很多很多(不同游戏类型可能有差别)。
    5. 往往没有(或者仅有有限的)单元测试。
    6. 强度真的大。
    7. 客户端最好要懂图形学。
    sunny352787
        17
    sunny352787  
       2020-07-02 18:08:55 +08:00
    人家都说了自己是个 java 初级开发...数据同步热更新跨服图形学这些轮得到他写吗...
    sunmes
        18
    sunmes  
       2020-07-02 18:28:58 +08:00   1
    游戏开发还要分两种,客户端和服务端.
    (姑且认为业务开发就是网站开发)

    服务端:
    服务端和业务开发基本没区别,反正也是和数据库相关的打交道.
    使用 HTTP 短连接的就基本完全一致了.
    Socket 原生的也基本会有各种类库框架处理一些细节问题.
    服务端的游戏逻辑和业务逻辑基本一致,用户角色,行为操作.

    客户端:
    客户端区别相对大一些.
    通用的,比如涉及到 Android,iOS 这类平台化的差异,不过大部分游戏引擎都具备跨平台,所以实际上这块需要了解的可能并不需要太多.
    然后一定的计算机图形相关的知识--纹理,混合,Shader 等等.

    其它的就是和具体的游戏引擎相关的了.基本上就是引擎使用的熟练度问题。

    和业务逻辑的主要区别大概就是需要考虑"显示"的问题
    位置大小,动画效果,时序...

    //=======================
    基于 Java 语言的 有一个名为 “Libgdx”的游戏开发框架,可以自行尝试下.
    直接官网下载 gdx-setup.jar
    运行即可生成项目。(可以配置 Maven 镜像)
    示例项目就是显示一张图。

    你可以尝试:
    给这张图增加按键监听,按下方向键,图片可以根据对应的方向键移动。
    嗯,大概游戏开发整体都是类似“事件驱动”.

    //=======================
    游戏引擎(或者说框架)的概念可以自行查阅。游戏开发基本离不开 游戏引擎。

    游戏引擎几乎个个语言都有。
    但是有名的(或者说正式用的)引擎似乎就那么几个,大公司应该是有自己的自研引擎?

    C/C++的游戏引擎应该相当多,不过我就了解过一个 SDL (Simple DirectMedia Layer)
    (OpenGL 或者 DirectX 的 SDK 基本就是原生的 C/C++.)
    移动端也有用到的我了解的大概就一个 Cocos2dx .
    还有就是 Unreal(虚幻)了,这个引擎相当重量级...

    JS 的游戏引擎也很多,尤其 H5 出来了这些年了.
    比如 Cocos-Creator,白鹭 Egret,LayaBox 等等(这几个都是国内的,国外也是有不少)

    Java 目前似乎就 Libgdx
    针对桌面版的基本就是 OpenGL 的一些封装,比如 Lwjgl(Libgdx 桌面实现就是基于这个的)

    C# Unity
    Unity 感觉几乎就是移动端游戏开发的王者.

    其它的一些 Lua -- LVE,Ruby - RPGMaker ? Python Cocos ?

    Cocos 这个框架的一些概念还是很通用也很不错的,可以去官网文档看看.
    Director- >Layer -> Node


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

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

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

    我一直想说的就是游戏与 Web 都有他们各自复杂的地方,但是 Web 在解决他们面临的问题的时候更上层,那么多库框架中间件都是在尝试更系统的解决他们遇到的问题,游戏界这块真的不咋地。实际情况就是我看到的绝大部分代码真的很烂很烂。顶级项目吧,也没看到有什么开源的好的。
    ygtq
        27
    ygtq  
       2020-07-03 11:29:41 +08:00
    @dogfeet 游戏项目无法更“上层”的主要原因是游戏这个需求就更复杂,更不容易统一化,项目代码烂可能是写的人烂,毕竟顶级项目的顶级是流水顶级日活顶级,并不一定是代码顶级,开源游戏框架里也有写得不错的啊,比如你提到的 skynet :)
    b00tyhunt3r
        28
    b00tyhunt3r  
       2020-07-03 16:46:14 +08:00 via iPhone
    @dogfeet 你这几个问题开源的虚幻 4 引擎源码都能回答你
    dogfeet
        29
    dogfeet  
       2020-07-03 18:37:05 +08:00
    @b00tyhunt3r 说远了,从头到位都是在说服务端
    paoqi2048
        30
    paoqi2048  
       2020-07-03 22:57:46 +08:00
    @dogfeet 游戏服务端开发固步自封不是一天两天了
    paoqi2048
        31
    paoqi2048  
       2020-07-03 23:01:48 +08:00
    @dogfeet 可以看下这个 /t/647606
    lizy0329
        32
    lizy0329  
       332 天前
    @dogfeet #23 真专业啊,直接可以操作内存掩盖了很多问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 18:44 PVG 02:44 LAX 11:44 JFK 14:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86