В данной статье вы найдете несколько советов, как повысить FPS в вашей игре. Включение FPS in caption (FPS в заголовке) в свойствах приложения покажет текущее значение FPS в заголовок окна — для полноэкранных игр придется писать свой счетчик (его описание и объяснение можно прочитать в статье Ticks).
Понятие оптимизации
Игры должны использовать режим V-synced (вертикальная синхронизация) в свойствах приложения. Это предотвращает разрыв, повышает качество отображения. В этом режиме, когда дисплей заканчивает рендеринг, система ждет до следующей вертикальной синхронизации монитора. Общие темпы обновления в диапазоне от 60 Гц до 85 Гц.
Настройка игры в режиме Unlimited (безлимитный) позволит вам увидеть насколько быстро ваша игра может запускаться — система не ждет загрузок, работает на полную 100% мощность. Часто FPS очень высок, до нескольких сотен в секунду. В идеале ваша игра будет достигать примерно 100 fps — это означает, что она работает достаточно быстро для достижения V-Sync (верт. синхронизации) на всех мониторах. Если количество кадров падает ниже V-sync, игра начнет прерываться — разрывов не будет, но просто некоторые кадры будут пропускаться, потому что система будет еще занята проработкой последнего кадра.
С хорошо сделанной игрой, геймлей будет иметь одинаковую скорость, как в режиме V-Sync (верт. синхронизация), так и в Unlimited (безлимитный).
Если какие-то части вашей игры очень быстро загружаются в безлимитном режиме, прочитайте статью о TimeDelta, чтобы решить данную проблему, так как это важная часть профессионально сделанной игры.
Параллельность CPU и GPU
В Construct события и другие общие задачи выполняются CPU (центральным процессором) вашего компьютера. Аппаратное ускорение отображения DirectX 9 посылает команды к GPU (графическому движку), отдельному, специально созданному процессору для рендеринга. В Construct, GPU занят рендерингом предыдущего кадра, в то время как CPU запускает события и генерирует список команд для отображения следующего кадра.
Важный момент, что CPU и GPU всегда работают в одно и то же время. Это означает, что время, необходимое для выполнения того или иного кадра это то, что выполняется дольше – рисование или выполнение событий. 90% игр требуется больше времени, чтобы прорисовать картинку, нежели обработать события, поэтому, как правило, сами игровые события не влияют на производительность.
Частое заблуждение состоит в том, что можно улучшить FPS путем устранения лишних событий или использования разных комбинаций событий, чтобы сделать то же, но быстрее. Пока практика показывает, что это зачастую никак не влияет на увеличение FPS.
Полное описание, как CPU и GPU параллельно работают и как определить, что из них быстрее, читайте в статье Ticks.
Оптимизация рендеринга
Как мы установили выше, очень важно оптимизировать рендеринг в вашей игре. Данный раздел содержит советы о том, как этого добиться.
Текстуры
Общее правило, говорит о том, что GPU является гораздо более эффективным в рендеринге, если рендерит одну и ту же вещь несколько раз, чем рисует разные объекты. Например, спрайты с одной и той же текстурой рисуются более быстро, если между ними нет объектов по оси Z. Construct рендерит все объекты от конца к началу. 500 объектов с одной текстурой в прилежащем Z- порядке будут рисоваться очень эффективно, но если еще 500 объектов будут чередоваться с различной текстурой (т.е. отрисовка объекта A, объекта B, объекта А, объекта B. ..) , то рендеринг окажется менее быстрым и эффективным.
Это важно для эффектов частиц, особенно для частиц, которые используют разные текстуры. Самый простой способ обеспечить надлежащий Z порядок в том, чтобы поставить все объекты с одной и той же текстурой на один, их собственный слой.
Текстуры и VRAM
Большинство (фактически, почти все) видеокарты помещают текстуры в памяти на поверхность размером кратную двум (т.е. 32x32, 64x64, 128x128 и т.д.). Это означает, что изображения размером 257x257 запросят память под поверхность 512x512. Если текстура уменьшена до 256x256, то она сможет занять такую же ячейку 256х256, и будет использовать в 4 раза меньше памяти (512x512 = 262144 пикселей, 256x256 = 65536 пикселей). Имейте в виду, однако, что это оптимизации важна в крайних обстоятельствах, как, например, при очень больших текстурах с размером чуть выше границы, или с большим количеством текстур.
Пиксельные шейдеры
Используйте эффекты шейдеров 2.0
Шейдеры часто нагружают GPU. Любые пиксельные шейдеры с пометкой PS 0.0 не требуют и не нуждаются в дополнительном «железе» и очень быстро обрабатываются. Использование эффектов PS 0.0 вместо PS 1.1 может улучшить быстродействие во многих случаях.
Избегайте излишних эффектов
Шейдеры часто влияют на эффективность, и использование шейдеров на кнопки, фон, декорации и все остальное, что является статическим, — трата времени рендеринга, потому что Construct перерисовывает весь экран каждый кадр, независимо от того, двигалось что-либо или нет.
Используйте слои, чтобы оптимизировать большое количество объектов
Иногда применение пиксельных шейдеров ко многим объектам может быть более эффективно, если использовать слои. Если вы применяете эффект к слою и помещаете на него все объекты, то шейдеры прорабатывают только одну большую область. Это может существенно повысить производительность: рендеринг полноэкранного блюра на 500 объектах может быть значительно быстрее, чем рендеринг 500 индивидуальных размытий по каждому на объект.
Bumpmapping vs. Heightmapping
Шейдер Bump mapping (рельефное текстурирование), который использует обычные Maps, быстрее, чем шейдер Height mapping (высотное текстурирование), потому что Height mapping сначала конвертирует их в нормальные карты (maps), а потом перерабатывает их (bump maps). Никакой конвертации не делается при Bump mapping, поэтому он быстрей. Однако нормальные карты не могут быть повернуты, так что вы можете предпочесть Height mapping в некоторых случаях. Более подробную информацию вы можете прочитать в статье Bumpmapping.
Используйте дополнительное программное обеспечение для обработки изображений, например GIMP, чтобы сделать нужное изображение и поместить его в игру, не применяя какие-либо эффекты в Construct. Конечный результат будет выглядеть идентично, а проработается гораздо быстрей.
В дополнение. Многие эффекты могут быть очень интенсивными и перегруженными, особенно размытие (blur). Постарайтесь делать его не в программе, когда это возможно.
Tiled Background (Копированный фон)
Объект Tiled background (Копированный фон) быстрей рендерит текстуры размером кратные двум, т.е. 16x16, 32x32, 64x64, 128x128 и т.д. Использование текстур данного размера также приводит к более гладкому скроллингу, в то время как текстуры других размеров могут выдавать видимые артефакты, особенно на границе текстур.
Экспериментируйте!
Поиграйте с параметрами и посмотрите, что лучше. Вы можете использовать слои или техники, аналогичные перечисленным здесь, чтобы достигнуть того же результата, но с большей производительностью. Зачастую это является удовлетворительным результатом.
