新闻中心
您所在位置: 主页 > 新闻中心 > 公司新闻
《我的世界》(Minecraft)是否优化很差?如果是,为什么?
时间:2024-06-04 17:41点击量:


谢邀。如果题主指的是Java版的话:首先游戏基于JVM这事,就已经让性能降低一截了(当然如果MC当初不是Java写的,也成就不了现在这个全球最畅销游戏之一的身份);其次MC代码一直用的是非常陈旧的固定渲染管线,连vbo都是14年才加进去的(如果我没记错),显卡性能能发挥到多少,这个不得而知(当然Mod的话另说);最后就游戏逻辑方面,目前按照Spigot/Paper等服务器的优化程度来看,MC的游戏逻辑本身,也有很大的优化空间。总而言之,MC这游戏如果从头写,性能肯定有机会有很大的提升,不过历史遗留这东西,你我都懂。

基岩版就是从头写过的MC,性能怎么样我就不得而知了,我也没认真玩过,这里暂且抛个砖吧。

确实如此。

用Java写游戏是第一错误——虽然可以跨平台,但是效果并不大,游戏业界就没几个拿Java写游戏的,OpenGL的开发生态也远不如DX;然后受JVM的影响,一般的显卡优化手段不管用(要手动开启高性能处理器运行JVM),底层上就很有问题。

MC本身的代码也并不好看,下个forge反混淆一下(或者说配置一下forge开发环境)就可以看到究竟是什么样子,方法混乱,充满了硬编码,质量究竟如何知乎上已有分析——举一个别的例子,一般服务器会禁用高频红石,因为卡服实在是太厉害,而rftools和红石工程等mod的红石钟就没有卡的。

多线程优化是一直以来的顽疾,optifine有所改善但是bug繁多,还有foamfix,betterfps之类优化mod和sponge/spigot服务端的优化撑着,MC的帧率才没倒架,甚至在1.7.10时出现严重的光照计算bug,没fastcraft简直玩不下去——一个销量史上第二的游戏,优化居然靠mod,至于mojang为什么不收这些代码?因为要改的地方太多了。

当然,代码还是其次,人懒才是最重要的。或许以前的mojang只是一个小小的没啥理想的工作室,但是既然收了微软爸爸的25亿美刀,总该有点25亿的觉悟吧?除了吃MC老本,我是没看到mojang有多么积极进取,直到最近的1.13更新,才把lwjgl换成3,而且特性照旧。

别跟我说代码不能激进的变动,你MC哪次更新mod不重新更新一回的?

  • 有句话叫“过早的优化是万恶之源”
  • 如果优化意味着波及社区,那么宁可不优化
  • 优化并不是Minecraft玩家的痛点,创造空间才是
  • 消费得起正版的配置应该不会太差
  • 优化太好,后来的山寨/同类游戏怎么打江山,沙盒蛋糕怎么变大?
  • 嗯今天天气真不错,想到一个新特性的灵感了,发个推

谢邀。

结论:现在的最新正式版来说(1.12.2)优化的确很差,但是没差得太离谱

原因:《我的世界》(Minecraft)大红大紫的成为现象级游戏的时候,Mojang仍然以小工作室的方式和人手在维护、更新。

其实优化问题需要从客户端和服务端来说。

对于客户端,最基本的顶点缓冲是在1.8以后才加入的,曾经为了学写Mod反编译看过部分客户端的代码,一些明明可以复用的对象,非要重新new,印象更深刻的就是频繁出现的硬编码和一堆可以用System.arraycopy替代的数组拷贝实现。

我倒是不觉得是JVM导致整个游戏帧数不高,相反的在足够优化的情况下,老爷机在1080P下跑50~60FPS还是没有问题的。毕竟Optfine模组大部分代码都是为了实现自定义材质(CIT)、动态光源、内置光源等等,优化并不是非常激进。例如它自己实现一个IntegerCache(4096),实现一个区块渲染状态的缓存,限制单tick区块渲染数量,用查表法替代默认的sin和cos数学方法,把渲染的任务分摊避免突发性的卡顿等等。然而即便如此也带来了至少10~20FPS的帧数提升(根据电脑配置)。说明优化的空间还是很大的。

对于服务端,其实客户端的逻辑部分就是启动了一个内置的服务端。一些优化方法没有采用还算可以洗地,毕竟牵一发而动全身。如果改动太大,第三方服务端(Paper/Spigot)都要大改,基于NMS的插件肯定需要重写部分代码,而对Mod的影响之大则更不必说。

多线程的问题已经被提到无数次了,Mojang几乎是被第三方服务端推着走的。如果没记错,最早是Spigot把网络架构切换到Netty的,也是Spigot实现了异步多线程的聊天和区块加载(区块加载线程数量根据在线人数决定,默认为2个线程)。

至于区块生成、实体(Entity/Tiles)运算等加起来占比超过60%的部分,多线程的实现国内外都没用一个可靠的方案。主要问题是,要么需要大改服务端,导致第三方的插件需要主动适配才可以兼容;要么就是会破坏“游戏机制”或者导致一些线程安全、执行顺序问题,例如Pathfinder实现多线程,会导致一些奇怪的实体行为,甚至直接让诸如村民播种种子的行为失效。

目前看到最好的设想是基于区域来做多线程,例如一个玩家的视距内没有其他的玩家,这个玩家视距内区域则可以被安全的处于独立的线程运算,所有的结果都Post回主线程调度,再触发API的call event被其他的插件监听,既可以多线程又可以兼容现有的大部分插件,还没有显著的线程安全问题(第三方插件不需要为了线程安全问题重构代码,不过这里吐槽下,不少监听“AsyncPlayerChatEvent”的插件居然直接调用诸如getBlock().getType()的代码,或者用非线程安全的容器保存数据并且在这个方法下读写,殊不知这个event是被异步触发的,需要考虑线程安全问题)。(出处:Regionized Entity (and Tile) Ticking · Issue #1001 · PaperMC/Paper

目前1.13算是从内部代码到游戏内容的巨大更新,彻底没有了TypeId和一些Magic Vaule,插件和Mod都影响很大,不知道官方是否会借此机会优化一下逻辑运算部分的性能(目前快照已经处于已经完成所有游戏内容,开始着手修复Bug和优化的状态)。

确实差,上四路泰坦居然还是马赛克……

平台注册入口