Уменьшение грязного прямоугольника
Пытаюсь оптимизировать симуляцию падающего песка, и я реализую оптимизацию, о которой разработчики 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);
}
Проблема, как видно на гифке, в том, что в настоящее время у меня нет возможности уменьшить грязный прямоугольник. Я могу делать несколько вещей, например определять, когда частица стирается / заменяется воздухом / твердой частицей на граничном крае грязного прямоугольника, но я не уверен, что оттуда делать.
1 ответ
Вот один из подходов, который может сработать для вас.
Обновите грязный прямоугольник в предыдущем кадре.
Вычислите грязный прямоугольник, обновленный только одним кадром.
Объедините эти два прямоугольника в один, содержащий их обоих.
Используйте прямоугольник из шага 3, чтобы обновить экран.
Замените прямоугольник предыдущего кадра тем, который вы вычислили на шаге 2. Это не тот комбинированный прямоугольник, который вы вычислили на шаге 3, это вызовет ту же проблему, которую вы описываете.