与游戏性能有关的改进新版本的 Java 引入了 ZGC 和 ShenandoahGC,并且默认 GC 改成了 G1。
对于一个中后期服务端来说,两个新 GC 有了更多手段来应付 MC 无处不在的内存泄漏,能尽量减少 Full GC 的发生。(具体性能测试待补)
2. 更好的 JIT
C2 被改进了,并且有了 Graal 的新选择。
3. 更好的世界生成(java.util.Random)性能
直接使用 JMH 进行测试,测试代码如下:
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 2)
@Measurement(iterations = 8, time = 5, timeUnit = TimeUnit.SECONDS)
@Threads(2)
@Fork(1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class RandomBenchmark {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(8 * 1_000);
@Benchmark
public void benchmarkJavaRandom() {
byteBuf.clear();
Random random = new Random();
for (int i = 0; i < 1_000; i++) {
byteBuf.putLong(random.nextLong());
}
}
}
使用一个 direct byte buffer 的原因是直接使用 random.nextLong() 可能会被 JIT 优化掉,并且可以模拟随机数据的内存存放过程。
使用 i5-3380M + G1GC 进行跑分,
在 Oracle JDK 1.8.0_281 版本的测试中,最终结果如图。
在 AdoptOpenJDK HotSpot OpenJDK 11.0.10 版本的测试中,最终结果如图。
经过我们的对比,Java 11 相对于 Java 8 的 64 位随机数生成提升了 420% 的性能!
这甚至可以解释为什么旧版 MC 的世界生成如此之慢了。
应用前景
Minecraft 1.13+ 都可以直接使用 Java 9 以上的版本启动。我们也使用了一些内部实现让 Java 15 成功运行了 Minecraft 1.12.2(请不要私信或留言交流有关内容!可以自行探索)
这里批判一下 Forge,Forge 尽管可以用 Java 11 启动了,然而一直不推广和支持。而 Fabric 对于高版本 Java 的支持一直很到位。
我们希望通过 JVM 的性能提升以及(未来可能的)多线程优化,Minecraft 可以焕发第二春。