3

尝试优化落沙模拟,我正在实施 noita 开发人员在他们的GDC 演讲中谈到的优化。在 10:45 左右,他们谈论了如何使用脏矩形。我已经开始尝试实施类似的系统。

目前,我能够创建一个覆盖需要更新的粒子的脏矩形。每次将有效粒子(粒子不是空气或像墙一样的固体)设置在块内时,我都会这样做,我调用一个函数来更新脏矩形,将放置的粒子位置作为参数。从那里,我可以很容易地从这个位置计算矩形的新最小值/最大值。

这是该工作的 GIF。 随着粒子更新,脏矩形扩展

这是更新矩形的代码:

public void UpdateDirtyRect(int2 newPos)
{
    minX = Math.Min(minX, newPos.x);
    minY = Math.Min(minY, newPos.y);
    maxX = Math.Max(maxX, newPos.x);
    maxY = Math.Max(maxY, newPos.y);

    dirtyrect = .(.(minX, minY), .(maxX, maxY));
    //Inflate by two pixels. Not doing this will cause the rect to not change size as particles update
    dirtyrect=dirtyrect.Inflate(2);
}

从 gif 中可以看出,问题是我目前无法缩小脏矩形。我可以做一些事情,例如检测何时在脏矩形的边界边缘上用空气/固体粒子擦除/替换粒子,但我不确定从那里做什么。

4

1 回答 1

0

这是一种可能对您有用的方法。

  1. 保持由前一帧更新的脏矩形。

  2. 计算仅更新一帧的脏矩形。

  3. 将这两个矩形组合成一个包含它们的矩形。

  4. 使用步骤 3 中的矩形更新屏幕。

  5. 用您在步骤 2 中计算的框替换前一个框架矩形。不是您在步骤 3 中计算的组合框,这样做会导致您描述的相同问题。

于 2021-03-04T17:37:24.593 回答