Пятничные факты #333 — Прокрутка местности

опубликовал posila

Здравствуйте,
На этой неделе мы выпустили 0.18.4, все то же самое, больше исправлений, больше ошибок, больше изменений. На данном этапе развития происходит не так много интересного, мы просто дорабатываем то, что имеем.

Незначительная оптимизация рендера местности posila

Всего за пару дней до релиза 0.18.0 у меня случилось прозрение о проблеме рендера ландшафта, которая беспокоила меня очень долго. При рендере ландшафта мы повторно используем текстуру из предыдущего кадра. Как это всегда делалось, мы рендерили текстуру в новое положение, заполняли пробел и затем копировали конечный результат обратно в текстуру для повторного использования в следующем кадре. Так что меня беспокоило по этому поводу? Эта простая операция приведет к растеризации пикселей на 2 экрана. Хотя это не является проблемой, по крайней мере, для половины приличных графических процессоров за последнее десятилетие, это значительная рабочая нагрузка для интегрированных графических процессоров, которые в целом имеют на порядок меньшую пропускную способность памяти, чем выделенные графические процессоры. Это также может быть плохо для старых бюджетных графических процессоров.

Одним из ярких примеров является Intel HD Graphics 3000 — интегрированный графический процессор на архитектуре CPU Sandy Bridge. Когда вы стоите на месте и местность может быть повторно использована без смещения, потребуется всего 2 миллисекунды, чтобы скопировать ее в игровой вид. Но когда вы начали двигаться, время прорисовки рельефа графическим процессором может доходить до 5 миллисекунд. И это только в разрешении 1600×900. Даже не 1080p. Итак, меня беспокоило, что мы тратили почти 1/3 времени кадра (16,66 мс) на рендер ландшафта, когда движку нужно сделать гораздо больше для рендера остальной части игры (для сравнения GeForce GTX 750Ti или Radeon R7 360 будет делать то же самое за 0,5 мс при 1080p).

Я понял, что могу «прокрутить» текстуру буфера. Если я запомнил смещение верхнего левого угла, я могу отменить его прокрутку до вида игры, а затем вместо того, чтобы копировать всю местность обратно в буфер, мы можем просто отрегулировать смещение и обновить измененные части. Таким образом, количество скопированных пикселей пропорционально тому, сколько прокручивается ландшафт. Это так просто, что я расстроен, что не понял этого много лет назад.

Большинство людей не могли бы заметить эту оптимизацию, так как большинство людей в настоящее время делают неоптимальную вещь за доли миллисекунды. Но все же я был очень счастлив, что наконец-то смог устранить эту неэффективность. Современные интегрированные графические процессоры также значительно быстрее, и хотя рендеринг игры для них может оказаться не такой сложной задачей, они все же совместно используют некоторые ресурсы с ЦП — будь то последний уровень кэш-памяти или процессорный кулер, поэтому интегрированнаяGPU может привести к замедлению работы процессора.

Однако момент, который я хотел проиллюстрировать в этом посте, заключается в том, насколько широк диапазон графических процессоров. Люди видят 2D-игру и ожидают, что смогут играть в нее практически на чем угодно. Если мы хотим оправдать эти ожидания, мы должны наложить на себя множество ограничений, потому что «все» также включает в себя на пару порядков более медленный GPU, чем в среднем сегодняшнем игровом компьютере. Процессоры стали намного быстрее и в последнее десятилетие, но в основном из-за увеличения количества ядер и добавления более широких единиц векторного вычисления. Они не стали намного быстрее при выполнении последовательного кода, который, к сожалению, является большей частью игрового кода Factorio. Так что, если вы играете в игру на ноутбуке с Core 2 Duo и GeForce 320M, вы столкнетесь с проблемами частоты кадров из-за слабого графического процессора намного раньше, чем замедление работы ИБП из-за старого процессора.

Примечание: Вы можете спросить, почему мы в первую очередь беспокоимся о кэшировании ландшафта, а не просто перерисовываем его с нуля каждый кадр. Короткий ответ — потому что рендеринг Factorio на местности безумен из-за его сложных правил перехода по клеткам, и перерисовывать его каждый кадр просто недостаточно быстро.

Обсудить на форуме

Comments: