尝试优化落沙模拟,我正在实施 noita 开发人员在他们的GDC 演讲中谈到的优化。在 10:45 左右,他们谈论了如何使用脏矩形。我已经开始尝试实施类似的系统。
目前,我能够创建一个覆盖需要更新的粒子的脏矩形。每次将有效粒子(粒子不是空气或像墙一样的固体)设置在块内时,我都会这样做,我调用一个函数来更新脏矩形,将放置的粒子位置作为参数。从那里,我可以很容易地从这个位置计算矩形的新最小值/最大值。
这是更新矩形的代码:
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 中可以看出,问题是我目前无法缩小脏矩形。我可以做一些事情,例如检测何时在脏矩形的边界边缘上用空气/固体粒子擦除/替换粒子,但我不确定从那里做什么。