Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 1637|回复: 7

[模组资料] 雪崩式的灾难:严重滞后的世界生成

[复制链接]
酒石酸菌 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3511
钻石
性别
保密
注册时间
2017-4-22
查看详细资料
发表于 2018-6-2 21:12:37 | 显示全部楼层 |阅读模式
翻译作品发布
译文题目: 雪崩式的灾难:严重滞后的世界生成
原文题目: Investigating extreme Worldgen lag
译文地址: -
原文地址: https://www.reddit.com/r/feedthebeast/comments/5x0twz/investigating_extreme_worldgen_lag/
最后更新: 2017-05-02

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 酒石酸菌 于 2018-6-2 21:26 编辑

雪崩式的灾难:严重滞后的世界生成

这篇文章来自于 2017 年 5 月 2 号 mezz 发布在 r/feedthebeast 上面的一篇帖子,很遗憾昨天我才看到它,并了解了新版本 forge 新增加的提示功能的来源故事。我对其进行了翻译和演绎,让大家了解到更多有趣的故事。部分内容可能有出入,还请多批评指正。

mezz 是一名具有多年开发经验模组作者,他制作了赫赫有名的 JEI,参与了林业模组的维护,同时还是 Forge 团队的一员。
      原帖链接:https://www.reddit.com/r/feedthebeast/comments/5x0twz/investigating_extreme_worldgen_lag/


==问题==

一些具有开拓性思维的整合作者早早地把脚步伸入了 1.11.2 的世界。然而在这里,他们却遇到了极为严重的服务器滞后,还有漫长的地图生成等待。1.11.2 版本的 All The Mods 2 整合中甚至附带了这么一句警告:

新世界的生成可能会等待 5 分钟左右才能加载好,我们仍然在研究这个问题。

这是下图的例子,Rorax 击打了一头牛,然后就像服务器时间停滞了一样,这只牛居然在空中卡顿住好几秒钟。这究竟是发生了什么?


                               
登录/注册后可看大图


==分析==

寻找问题的最好办法就是使用 Java VisualVM(或者其他类似的 Java 性能分析工具),在游戏发生严重滞后时,对其进行分析。通过性能分析似乎并没有发现什么模组异常的占用了计算,就像是世界生成本来就应该那么慢。

世界生成先是生成一个基础的区块,而后在其上点缀上树木,矿石之类的东西。这些生成会促使区块加载。分析器分析进一步发现,许多模组实际上会加载更多的区块,并持续重复的使这个过程更长。

当一个结构(比如说树)跨区块生成时,它会同时加载所跨的几个区块。普通情况下,这种事件发送概率很小,随机生成的树木只会有很小几率会跨区块生成。然后如果有足够多的模组重复这个过程,情况将会变得极为糟糕。

加载一个区块,也许会连锁式的加载10个区块!实际上可能比这个更加糟糕!从而带来极为严重的滞后!

这是一个原版生成,可以看到,只有一小部分区块是被额外加载了的:


                               
登录/注册后可看大图


这是使用了未修复版本的 All The Mods 2 整合,并在相同种子情况下生成的结果:


                               
登录/注册后可看大图


上图中红色部分是图一的区块加载范围,对其进行比较,可以看到居然相隔几百区块远的地方也被加载了,这势必会造成极为严重的世界生成滞后!


==原因==

Minecraft 的世界生成似乎比很多模组作者所期望的还要古怪(我想大多数人应该已经不会为此感到惊讶了)。

模组作者想法很简单,一个区块加载了,它们的模组就开始在其上生成点什么东西,然而这种想法就大错特错了。这是一个原版的世界生成,可以看到地图边缘并没有树木生成,更没有失控生成的区块,树生成的边缘似乎都有一个框来框住它们。


                               
登录/注册后可看大图


当一个区块的 +X,+Z 和 +XZ 方向均加载时,才会进行区块的进一步装饰性生成。原版运用这种思维,使得树木总是在区块的中间生成,这大大减小了额外区块的生成。下图是这种判断生成的具体图示:


                               
登录/注册后可看大图


可是很多模组作者喜欢自己造轮子,而不是使用原版的方法。简单的在一个 16X16 的范围内随机获取一个坐标进行生成。但是这有几率溢出到 -X 和 -Z 方向,导致加载更多的区块(上图红色箭头所指方向)

正确的方法应该尝试在 (-8, +8) 范围内生成,这样生成总是会在最中间,溢出区块的几率很小。


                               
登录/注册后可看大图


==解决效果==

在过去的几周,我与几个模组作者合作解决这个问题,但是有时候很难解释清楚,这也是我为什么发表这篇文章的原因。随着几个模组相关修复版本的更新,All The Mods 2 整合的生成开始从 5 分钟下降到了 15 秒。


==我可以做些什么?==

如果你是模组作者,请检查是否是你的模组造成了如此严重的滞后,只需要使用原版的 WorldGenMinable 类即可,它内置了偏移相关的计算。如果你自己造了轮子,请注意生成的偏移是否正确。

如果你是玩家,尝试移除一部分模组,看看生成滞后是否还存在。如果确实是模组问题,请向其作者反馈。


==后记(译者添加)==

在新版本的 Forge 中添加了世界边缘生成判定,如下图所示,如果你看到了类似的错误提示,请向该模组作者反馈。


                               
登录/注册后可看大图


评分

参与人数 12人气 +20 金粒 +36 贡献 +1 收起 理由
tianyuexiao + 1 神乎其技,不服不行!
gooding300 + 1 MCBBS有你更精彩~
zide888@qq.com + 2 MCBBS有你更精彩~
乙烯_中国 + 1 MCBBS有你更精彩~
耗子 + 2 MCBBS有你更精彩~
bluesadi + 2 + 10 MCBBS有你更精彩~
袋里的鲨 + 2 MCBBS有你更精彩~
a6809936 + 2 期待出暂停生成后状态保存和读档的解析0.0.
没糖的葫芦 + 2 举起法杖敲死异教徒
玄素 + 3 MCBBS有你更精彩~
WO! + 2 + 16 神乎其技,不服不行!
萝卜冲刺 + 1 + 10 MCBBS有你更精彩~

查看全部评分

风扇滑翔翼 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
4093
钻石
性别
保密
注册时间
2016-7-26
查看详细资料
发表于 2018-6-2 21:29:07 | 显示全部楼层
本帖最后由 风扇滑翔翼 于 2018-6-2 21:31 编辑

很好的帖子 还有 所有MOD放一个包里不会出事吗
MOD生成的东西远比你想象的复杂 遗迹 大型矿脉 诸如此类
回复

使用道具 举报

WO! 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
4981
钻石
性别
保密
注册时间
2014-8-16
查看详细资料
发表于 2018-6-2 21:47:52 | 显示全部楼层
本帖最后由 WO! 于 2018-6-2 21:50 编辑

看来这种世界生成问题只能从模组上解决
回复

使用道具 举报

酒石酸菌 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3511
钻石
性别
保密
注册时间
2017-4-22
查看详细资料
 楼主| 发表于 2018-6-5 18:26:33 | 显示全部楼层
风扇滑翔翼 发表于 2018-6-2 21:29
很好的帖子 还有 所有MOD放一个包里不会出事吗
MOD生成的东西远比你想象的复杂 遗迹 大型矿脉 诸如此类 ...

大多数情况并不会出问题,因为是 forge 统一调度的
回复

使用道具 举报

耗子 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
10120
钻石
性别
保密
注册时间
2012-2-18
查看详细资料
发表于 2018-6-6 12:55:30 | 显示全部楼层
我希望这个帖子能发在编程开发板而不是翻译&Wiki板。
回复

使用道具 举报

酒石酸菌 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3511
钻石
性别
保密
注册时间
2017-4-22
查看详细资料
 楼主| 发表于 2018-6-6 13:29:17 | 显示全部楼层
耗子 发表于 2018-6-6 12:55
我希望这个帖子能发在编程开发板而不是翻译&Wiki板。

这个如何修改呢?还是说重发一遍?
回复

使用道具 举报

酒石酸菌 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3511
钻石
性别
保密
注册时间
2017-4-22
查看详细资料
 楼主| 发表于 2018-6-6 13:29:47 | 显示全部楼层
耗子 发表于 2018-6-6 12:55
我希望这个帖子能发在编程开发板而不是翻译&Wiki板。

这个如何修改呢?还是说重发一遍?

评分

参与人数 1金粒 +10 收起 理由
耗子 + 10 重发吧

查看全部评分

回复

使用道具 举报

sjb的夜游神 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
10
钻石
性别
保密
注册时间
2019-7-30
查看详细资料
发表于 2019-7-30 16:29:11 | 显示全部楼层
灰常有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-8-21 09:13 , Processed in 0.039808 second(s), Total 18, Slave 15 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表