DrPepper Problem/ru

Проблема Доктора Пеппера - серьёзная проблема производительности в игре Super Mario Bros. X, возникающая из-за отключения системы индексирования блоков, спровоцированной горизональным движением слоёв. Проблема впервые исследована разработчиком Rednaxela в мае 2018го года, и потом, независимо, была исследована Wohlstand-ом в мае 2021го года во время отладки TheXTech на одноплатном компьютере Orange Pi PC.

Название
Проблема была названа в честь уровня "Dr.Pepper Pyramid" из эпизода "2k15 Summer Takeover" для SMBX, где собственно и была исследована проблема.

Описание проблемы
Проблема производительности возникает чаще всего на старых и/или непроизводительных устройствах пользователя (например, мобильные устройства, одноплатные компьютеры, или старое оборудование). Причина самой проблемы кроется в особенностях алгоритма ускорения поиска блоков на игровой сцене. Ухудшение производительности возникает из-за полного отключения индексированного поиска в случае использования горизонтально движущихся слоёв.

Алгоритм ускорения поиска блоков в SMBX
Данный алгоритм требует, чтобы все блоки были сортированы в массиве и сгруппированы по позиции X, и затем сортированы по Y внутри выделенной группы. Индексы начала и конца границ заносятся в два массива, чьи индексы эквивалентны частному X и 32. Во время поиска блоков, отбираются левая и правая границы по X, а затем в выбранном диапазоне производится поиск блоков и проверка возможных коллизий. Данный алгоритм является неэффективным в вертикальных секциях, потому что в цикл попадают все блоки по всей высоте.

Возникновение замедления
Поскольку в игре реализована система движущихся групп (слоёв) элементов, в т.ч. блоков, возникла необходимость свободного перемещения блоков по сцене без повреждения возможности поиска перемещённых блоков. При перемещении блоков по вертикали (по Y) проблемы не возникает, поскольку все блоки по прежнему находятся в одной и той же группе X. Как только группа начинает передвигаться по горизонтали (то есть, по X), возникла необходимость пересортировать массив блоков и обновить индексные таблицы, иначе блоки перестанут быть видимыми для поиска. Однако, автор SMBX-игры вместо того, чтобы реализовать безопасную пересортировку массива блоков после перемещения группы, полностью отключает поиск по индексу как только любой движущийся слой перемещяет любой из блоков по X, тем самым запуская в действие именную "проблему Доктора Пеппера". Из-за этого, игра начинает каждый цикл физики и отрисовки обрабатывать все блоки, находящиеся на уровне, значительно увеличивая нагрузку. При наличии мощного процессора, падение производительности игры остаётся незаметным. Однако, в случае одноплатных компьютеров, мобильных устройтв и старого оборудования, проблема вызывает очень сильное видимое замедление всего игрового процесса.

Решение проблемы
Для того, чтобы полностью решить проблему, на базе TheXTech разработчиком ds-sloth была реализована новая система индексации блоков, использующая квадратное дерево, которое позволяет свободно перемещать любые блоки на нём расположенные без необходимости выполнять какие-либо перестройки.

Интересный факт
Redigit уже сразу предупредил об этой проблеме в своём анонсе бета-выпуска SMBX 1.2:

"Прочтите, это важно: Используя слои для горизонтального движения блоков (направо или налево) отключает единственную лучшую оптимизацию системы обнаружения столкновений в игре. Игра ЗАМЕДЛИТСЯ, если это будет сделано на уровне с большим количеством блоков и НИП. Не говорите о том, что я вас не предупреждал.

Оригинал на английском:

Read This, It's Important: Using layers to move blocks horizontally (left or right) disables the single best collision detection optimization in the game. You WILL have slow downs if you do this in a level with a large number of blocks and NPCs. Don't say I didn't warn you."

Однако, со временем, это было забыто, и люди не знали об этом.

Движки, подверженные проблеме

 * Оригинальная игра Super Mario Bros. X
 * Super Mario Bros. X2
 * TheXTech до версии 1.3.6

См. Также

 * Задача на GitHub, ссылающаяся на проблему
 * Сравнение до и после исправления проблемы