很烂,烂到加上小作坊的独立游戏(包括RPG Maker和橙光游戏),应该都能排进倒数。
这游戏的火完全不是靠技术。
我自己不写Java,也没看过Minecraft的源码,但看过许多mod作者的吐槽,列举如下:
- 完全没有API的概念。所有mod都是解包后强行hack进源码,甚至要用到一堆private方法。forge/bukkit是把这个hack工作进行封装抽象,模拟了一组API。
- 几乎没有事件概念,连它自己用的Java网络框架(netty)的事件架构都没用上,mod要自己做个游戏内的交互界面,得自己从头到尾造轮子,包括处理鼠标事件。
- 完全没有多线程。有人作了全文搜索,代码里仅有的几个thread和synchronized只出现在I/O相关的地方。直到最新的几个版本更新后,才开始为区块生成做了多线程,区块/单位更新这种最急需的不知道最新版本是不是多线程了。
- 因为没有多线程,Minecraft的服务器是市面上极其稀有的,用酷睿比用至强性能好的,因为酷睿单核主频比志强高……然而哪怕是顶配服务器,让150人同时在线就能给你卡飞……心疼所有腐竹的钱包,有这钱租服务器,搭个魔兽私服都舒服得多。
- 对 OpenGL 的应用,连入门级别都算不上,OpenGL 中 glVertexBuffer 根本没使用上,导致图形性能奇差无比,于是出现了装上 OptiFine这个光影 mod 后反而帧数更高的诡异结果……因为这个游戏太流行了,几乎所有安卓系统的厂商,都不得不在 GPU 驱动里,专门为手机 Minecraft 开了个绿色通道,在 Minecraft 调用 OpenGL 接口时,系统帮忙擦屁股,把 glVertexBuffer 补上……(详见https://www.zhihu.com/answer/43891325)
- 同上,方块渲染绘制时,根本没管方块是否可见,只要是所有暴露出来的面都会被绘制……比如区块加载未完成时能看到的地底方块……比如某些明明一马平川却能把人卡飞的地方,地底肯定有一个大型矿洞。
- 再同上,单线程+无优化,导致了Minecraft里万恶的区块更新策略的诞生(只有玩家角色附近的区块会更新,其他区块都是时间静止的),严重影响了机械化/工业化/红石化玩家的经营规模。
- 方块列表是一个数组,静态长度数组。没有方块注册接口,程序初始化时直接array[0] = new xxx(1, 3, "Dirt", ...); array[1] = new xxx(xx, xx, ...)这样把所有属性硬编码进去,如此写了几百行初始化上所有方块类型。方块的唯一标识就是数组下标,导致不同mod添加的自定义方块极容易因为下标重复而撞车。(比如某两个大型工业mod(看其他回答,这个feature终于被当作bug修复掉了?
- 因为根本没有API设计,所以方块的实现非常困难。实现一个新方块,需要继承自方块的基类并填充接口方法,那个基类貌似有200+的接口方法……
- 因为上面的各个问题,导致Minecraft貌似至今都无法让一个格子里放下任意两种不同半砖的组合,因为每种组合都必须硬编码一个新方块来实现,而无法通过一个“半砖组合机制”来自动完成——建筑玩家体验极差。
- 药水同样是一个静态数组,同样的硬编码初始化,更惨的是,药水数组长度只有32,一开始就写死了。听说有的主打药水的mod,是自己从零开始硬造了另一套药水系统,来绕过这个限制的。(这个操作似曾相识……前面说的写GUI/HUD的mod也是这么搞的)
- 因为没有API,不同版本之间的代码变化非常大。并且作者还头铁(或者技术不够),不肯(或者不会)二进制发布,发布的是Java包,极容易解包源码。所以作者还做了代码混淆,然而不同版本之间的代码混淆方式也不同,导致代码变动更大了——因此,Minecraft的mod更新极难无比,大多数大中型mod都是直接绑定在少数几个常用版本里的,而没法全版本适配或者迅速跟进新版本——因为每次更新后,forge/bukkit作者都得重新解包原码,重新反混淆,然后重新适配API,更新mod框架。
- 上一条的直接后果是,Minecraft的所有mod作者(包括不写mod的高清贴图作者,因为高清贴图依赖于mod),都是hack了游戏本身,违反了游戏软件的用户许可协议EULA。然而Mojang默许了这些行为的存在,并不去管——因为自己没本事做出稳定的API和mod框架,管了的话mod社区就不存在了,游戏就火不起来了。
- 某个评论都不敢开的答主居然说我们看到的代码烂因为它是反编译的,不是开发者写的源码,而且说有遮挡判断所以 drawCall 很低,性能很好?笑掉大牙了,编译优化会把一堆设计良好的类结构组成的方块系统合并成有几千行代码两百多个 API 的基类?编译优化会把方块/药水 ID 注册机制改造成静态数组?编译优化会把半砖拼接系统运行时代码干掉直接变成硬编码?编译优化会把 glVertrxBuffer 删除然后等驱动给你打补丁?编译优化会把多线程砍没?编译优化会把 netty 的事件层调用完全砍掉,让反编译呈现出没有事件系统的表现?任何一个合格的遮挡判断会在地表完全看不见时依然绘制矿洞?Minecraft 的编码水平之烂已经不是反编译能洗的了。
- 微软收购Mojang后,用C++基于移动版将其重写了,放到了win10应用商城里。有Java正版key的用户可以到Minecraft官网上激活win10应用商店版。有兴趣的可以对比一下,在win10版和Java版上都开一个默认存档,进入世界,简单移动鼠标转换下视角,你就会感受到天壤之别。(话说网易和微软做了PY交易,把MC盒子包装了下美其名曰国服版,然后win10应用商店版在中文区下架了……之前购买/激活了的老用户还可以用,没购买/激活的新用户,只能改系统语言跨区购买了)
- 再来个很残忍的对比——Minecraft之后,市面上兴起的类似设计的沙盘类游戏,除了泰拉瑞亚还是像素风,其他全特么是真·3D,而不是马赛克世界。
- 听说巨硬接手后1.8开始,许多问题大有改观,微软爸爸赛高!
综上所述,每一个mod作者上辈子都是折翼的天使,这辈子都是走向烈士之路的壮士!
还缺人的互联网公司,赶紧联系他们,这是最好的996员工!
说起来,这种厂家写一个开放性/自由度极高的框架扔那儿,让社区帮忙推上神坛的操作,有点莫名眼熟呢……我绝不是在暗示某b开头的大厂(逃
——————————————
联动一个看过源码的专业回答: