java - terraria 为何拥有如此大的世界并且仍然具有丝般流畅的 fps?

标签 java libgdx game-development tile procedural-generation

我正在开发我自己的程序生成器并完成了它。 这是我的做法, 一开始就生成整个世界, 将生成位置和方 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 。这是一些代码(xy 是玩家坐标,widthheight 是你的世界的维度, 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 更新(液体流动,沙子掉落,腐化扩散,......)实际上有两种可能性:

  1. 每次更新时迭代数组的不同部分:
    方 block 更新不必那么频繁。对于流体流动,在每次更新中仅每 50 个 block 更新一次可能就足够了。
  2. 您可以将可能需要更新的 block 存储在 ArrayList 中(我建议只存储坐标,而不是 block 本身)。
    然后,当调用更新函数时,您将遍历该列表并检查该 block 是否真的需要更新。如果是这种情况,您将 block 邻居添加到列表中,然后将在下一次迭代中更新。
    确保从列表中删除您刚刚更新的 block 并避免添加重复项!

虽然第二种方法通常更快(通常列表仅由玩家操作决定,即使玩家决定排干整个海洋,整个列表也可能占用不到整个世界的 ¹⁄2₀)。

但是第一种方法肯定更容易实现,并且如果出于某种原因您有大量 block 更新,则速度会更快。

关于java - terraria 为何拥有如此大的世界并且仍然具有丝般流畅的 fps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62416952/

相关文章:

java - 选择新生成的密码后,密码不会更新

ios - 如何将广告合并到 libGDX 中

c# - 与地面上的 "dirt"碰撞时放慢播放器

Java拆分字符串表现

Java Robot类按土耳其字母(Ö, ö, Ş, ş, Ü, ü, Ğ, ğ, İ, ı, Ç, ç, Ə, ə)?

java - libGDX:使用着色器的图像外发光

java - 如何修复 "Couldn' t 为目标 : Linux, 64 位加载共享库 'libgdx64.so'”

ios - 允许 SpriteKit 中的触摸传播

c# - Unity/C# 中的三角形

java servlet 转发 cookie