我正在开发我自己的程序生成器并完成了它。 这是我的做法, 一开始就生成整个世界, 将生成位置和方 block 位置的信息存储到数组和数据结构中
现在很明显,我必须遍历所有数组,以呈现/更新内容, 这是在制造问题, 我尝试通过应用一个条件来处理这个问题,即如果有任何对象可见,则只渲染更新,否则不更新,但这并没有太大的区别。
我的 TILE_SIZE 是 1 个世界单位
所以当我的世界大小时 a) 500 x 500,fps 为 60 b)2000 到 2000 年,fps 为 50 c)5000 x 5000 fps 进一步下降等等
如果我能知道 Terraria 是如何做的,或者它是如何做的,那真的会有帮助谢谢。
最佳答案
I have to loop through all the arrays, to render/update stuff
您不必那样做。
对于渲染内容,您实际上只需要考虑靠近玩家的方 block 。这是一些代码(x
,y
是玩家坐标,width
,height
是你的世界的维度, render(x, y)
是渲染功能的占位符,为简单起见,我假设玩家可以在每个方向看到 100 个方 block :
for (int i = Math.max(x-100, 0); i ≤ Math.min(x+100, width); i++) {
for (int j = Math.max(y-100, 0); j ≤ Math.min(y+100, height); j++) {
render(i, j);
}
}
更新的过程也可以简化:
对于npc你只需要检查它周围的几个方 block 。
对于方 block 更新(液体流动,沙子掉落,腐化扩散,......)实际上有两种可能性:
- 每次更新时迭代数组的不同部分:
方 block 更新不必那么频繁。对于流体流动,在每次更新中仅每 50 个 block 更新一次可能就足够了。 - 您可以将可能需要更新的 block 存储在
ArrayList
中(我建议只存储坐标,而不是 block 本身)。
然后,当调用更新函数时,您将遍历该列表并检查该 block 是否真的需要更新。如果是这种情况,您将 block 邻居添加到列表中,然后将在下一次迭代中更新。
确保从列表中删除您刚刚更新的 block 并避免添加重复项!
虽然第二种方法通常更快(通常列表仅由玩家操作决定,即使玩家决定排干整个海洋,整个列表也可能占用不到整个世界的 ¹⁄2₀)。
但是第一种方法肯定更容易实现,并且如果出于某种原因您有大量 block 更新,则速度会更快。
关于java - terraria 为何拥有如此大的世界并且仍然具有丝般流畅的 fps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62416952/