Автоматизируем процесс замера производительности в играх

Оглавление

Программист - это человек, который сначала долго думает, чтобы потом ничего не делать.

Вступление

Проблема тестирования производительности в играх не нова. Встроенные бенчмарки присутствуют не во всех играх, а среди тех немногих продуктов, где они есть – существуют те, которые, в общем-то, малопригодны, поскольку не отражают реальной картины происходящего и мало сопоставимы с непосредственно игровым процессом.

В таком случае для авторов статей остаётся два варианта:

  • Тестировать железо в редко-обновляемом и небольшом тестовом пакете, состоящем либо только из игр, в которых присутствует возможность легко и без лишних усилий получить результаты, либо с минимумом ручных тестов.
  • Тестировать вручную, при помощи таких утилит, как Fraps. Тут уже требуется сноровка и концентрация, вдобавок затрачивается немалое количество времени.

Казалось бы, что тут ещё думать, остаётся только принимать ситуацию такой, какая она есть. Но как там говорил Эйнштейн? "Все с детства знают, что то-то и то-то невозможно. Но всегда находится невежда, который этого не знает. Он-то и делает открытие".

Тема данного материала - попытка избавиться от человеческого фактора при исследовании производительности в играх с помощью скриптового языка программирования AutoHotkey. А еще - шаг в сторону унификации методики тестирования, с возможностью перепроверки результатов читателями. Ну и, разумеется, непосредственно автоматизация процесса тестирования.

Перед тем, как приступить к разбору конкретно взятых игр – пара слов об AutoHotkey.

AutoHotkey

Официальный сайт, где можно скачать программу. А вот документация на русском языке.





AutoHotkey - это свободная утилита под Windows с открытыми исходными кодами. Популярна среди любителей онлайн-шутеров, часто используется ими в качестве инструмента для создания макросов.

Сприпты под AutoHotkey пишутся в виде текстовых файлов с последовательностью команд, итоговый файл сохраняется с расширением .ahk, выполняется при открытии. Научить за пять минут я никого не смогу, кому интересно – все ссылки даны выше.

Суть автоматизации процесса тестирования сведена к программированию и к выполнению последовательности команд. Последняя включает в себя запуск игры, загрузку сохранения, несколько проходов тестовой сцены, а после – выход из игры. При правильно написанных скриптах остается только собирать итоговые цифры.

Для тех, кто не желает знакомиться с документацией, постараюсь максимально подробно комментировать получившийся код по каждой игре.

Тестовый стенд

Тестирование производилось на следующей конфигурации:

  • Материнская плата: MSI P55-GD65, bios 1.9;
  • Процессор: Intel Core i5-760 @ 3,5 ГГц (166,6x21);
  • Система охлаждения: Zalman CNPS10X Performa (120*120*25, ~1200 об/мин);
  • Термоинтерфейс: Xilence Silver Tim;
  • Оперативная память: Corsair CMX4GX3M2A1600C7 2*2 Гбайт DDR3-1600 (7-8-7-20, 1,65 В) @ 1666 МГц 7-8-7-20-1Т;
  • Видеокарта: NVIDIA GeForce GTX 295 1792 Мбайт 576/1242/1000 МГц;
  • Жесткий диск: Western Digital Caviar Blue (WD500AAKS), 500 Гбайт;
  • Блок питания: Corsair CMPSU-750HX (750 Вт);
  • Корпус: Открытый тестовый стенд.

Программное обеспечение

  • Операционная система: Windows 7 Ultimate, build 7600.16385 RTM, x64;
  • Драйвер видеокарты: nVidia ForceWare 260.99 WHQL;
  • Дополнительное ПО: AutoHotkey 1.0.48.05; FRAPS 3.2.3, build 11797.

Методика тестирования

В играх, используемых в качестве тестовых приложений, выставлялось разрешение 1920х1080. Соответственно, присутствует оптимизация только под него, хотя в большинстве игр полученные скрипты должны работать и при других разрешениях. Настройки графики в играх не менялись, оставшись теми же, что и в недавнем материале по сравнению производительности процессоров.

Для анализа повторяемости результатов во всех играх проводились по три замера производительности. Каждый из них состоял из четырех запусков одной и той же сцены. Между замерами тестовой стенд перезагружался.





Автоматизированные измерения осуществлялись с помощью утилиты Fraps, в них участвовали следующие игры:

  • Arcania: Gothic 4 (1.0);
  • Battlefield Bad Company 2 (1.0.1);
  • Borderlands (1.2);
  • Call of Duty: Black Ops (1.0);
  • Dragon Age Origins (1.0.9353);
  • Medal of Honor (2010) (1.0.75);
  • Metro 2033 (1.0.0.1);
  • S.T.A.L.K.E.R.: Call of Pripyat (1.6).

(В скобках указана версия .exe файла игры).

Все скрипты и необходимые сохранения для игр прикреплены общим архивом в конце статьи.

Автоматизация процесса и рассмотрение погрешности измерений

На самом деле статья начинается здесь. Теория была дана выше, настало время приступить к практике. Начну по алфавиту.

Arcania: Gothic 4

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

Особенности, которые следует учитывать:

  • Игра позволяет загрузить уровень, не прибегая к использованию мыши, скрипт должен подойти к любому разрешению экрана. Это хорошо.
  • Надо учесть, что время загрузки уровня – величина непостоянная. Выбор сцены в таком случае обусловлен отсутствием действий в игре сразу после загрузки уровня, а также возможностью начать замер только через несколько секунд после загрузки сохранения, без влияния на итоговый результат.

Последовательность действий:

Run, arcania.exe ;Запуск игры. Если .ahk файл скрипта не находится в одной папке с .exe файлом игры, то в этой строке необходимо указать полный путь к файлу.





Sleep 20000 ;Время паузы в миллисекундах. Лучше ставить с запасом. Может быть больше на слабых конфигурациях.

i=0 ;Инициализация переменной, которая понадобится в дальнейшем.

Loop 5 ;Команда, реализующая пятикратное повторение операций, заключённых в фигурные скобки.

{

Sleep 1000 ; Необязательная пауза, но пусть будет.

Send {down down} ; К этому моменту в игре открывается главное меню. Зажатие стрелки вниз.

Sleep 80 ; Пауза 80 миллисекунд. Стрелка вниз зажата.

Send {down up} ; Отпускание стрелки вниз. Вообще, можно обойтись и простой командой формата Send {down}, указав в начале скрипта задержку на нажатие клавиш и время их зажатия. Но игра глючная, сработать может не всегда. Так надёжней.

Sleep 500 ; Небольшая пауза.

Send {Enter down} ; Далее, по аналогии с прошлой командой на 80 миллисекунд зажимается клавиша Enter, после чего совершается переход в меню загрузки сохранений.





Sleep 80

Send {Enter up}

Sleep 1000 ; Пауза после нажатия Enter’а. Она необходима, чтобы переход в меню загрузки сохранений осуществился до начала следующего действия.

Send {down down} ; Переход на строку вниз, аккурат на кнопку «загрузка».

Sleep 80

Send {down up}

Sleep 500

Send {Enter down} ; Начинается загрузка сохранения.

Sleep 80

Send {Enter up}

Sleep 1000

if (i<>0) ; Переменная i была введена ранее. Здесь она используется в операторе условия, и если она не равна нулю, что характерно для второго и последующих запусков теста – произойдёт действие, заключённое в фигурные скобки. В данном случае – будет дополнительно нажат Enter, ибо между запусками тестовой сцены перехода в главное меню не будет и для загрузки сохранения из меню паузы потребуется подтверждение.

{

Send {Enter down}

Sleep 80

Send {Enter up}

}

if (i==0) ; Ещё один оператор условия. Актуален для i=0. Так как фигурных скобок нет – оператор условия выполняется только для последующей строки, а в данном случае - вносит дополнительные 20 секунд паузы, необходимых для первой загрузки уровня. На слабых конфигурациях это число может быть выше.

Sleep 20000

Sleep 9000 ; Пауза – время загрузки уровня.

if (i>0) ; Оператор условия, который включает в себя всю тестовую сцену. Как можно заметить – проход тестовой сцены не осуществляется для первого запуска. Иначе это внесёт сильные погрешности в итоговый результат, ибо при первом запуске игра тормозит.

{

Send {F10} ; Горячая клавиша Fraps’а для снятия скриншота. Нужна, чтобы удостовериться в том, что замер производительности начнётся там, где надо. Если не сидеть перед монитором, а заняться на время тестирования своими делами и потом собирать результаты – эти скриншоты пригодятся.

Sleep 500

Send {F11} ; Горячая клавиша Fraps’а для начала замера производительности. Отсюда и далее запрограммирована последовательность действий, приводящих персонажа игры к прохождению определённого маршрута.

Sleep 2000

Send {d down}

Sleep 6000

Send {d up}

Sleep 1500

Send {w down}

Sleep 10000

Send {w up}

Sleep 2000

Send {s down}

Sleep 5000

Send {space down}

Sleep 100

Send {space up}

Sleep 1500

Send {Rclick down}

Sleep 500

Send {space down}

Sleep 100

Send {space up}

Send {Rclick up}

Sleep 7000

Send {s up}

Sleep 1000

Send {F11} ; Окончание замера производительности.

Sleep 500

Send {F10} ;Ещё один скриншот, теперь по окончанию замера производительности. Цель та же, данный снимок позволит убедиться, что сцена пройдена именно по заданному маршруту.

} ;Закрытие оператора условия, окончание тестовой сцены.

Sleep 1000

Send {Esc down} ;Выход в меню паузы. Опять-таки через зажатие клавиши на временной промежуток, а не просто через нажатие. Для надёжности.

Sleep 60

Send {Esc up}

Sleep 1000

Send {down down} ;Переход на строчку вниз.

Sleep 80

Send {down up}

i++ ;Переменная счётчика цикла увеличивается на единицу.

} ;Переход на следующую итерацию/окончание цикла. Переход в главное меню не осуществлён, ибо не нужен, поскольку необходимые далее для загрузки уровня действия из данной позиции курсора совпадают с оными из главного меню. За исключением дополнительного нажатия Enter’а, о котором было оговорено ранее.

Sleep 500 ;Отсюда и далее выход в главное меню. Для этого осуществлён переход на три строки вниз и последующее нажатие Enter.

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {Enter down}

Sleep 80

Send {Enter up}

Sleep 500

Send {Enter down} ;Игра требует подтверждения, чтобы выйти в меню. Для этого необходимо нажать Enter ещё раз.

Sleep 80

Send {Enter up}

Sleep 4000 ;Пауза, к этому моменту переход в главное меню будет осуществлён.

Send {down down} ;Отсюда и далее – пятикратное нажатие клавиши вниз, и последующее нажатие Enter – выход из игры.

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {down down}

Sleep 80

Send {down up}

Sleep 500

Send {Enter down}

Sleep 80

Send {Enter up} ;Собственно на этом все, скрипт для Gothic 4 окончен.

Ниже - ролик, демонстрирующий работу скрипта::

Дополнительно - скриншоты начала и окончания замера производительности:

450x253  20 KB. Big one: 1920x1080  283 KB

450x253  17 KB. Big one: 1920x1080  254 KB

Итак, всё необходимое для замера производительности есть, теперь остаётся только получить результаты.

Настройки графики малоинтересны при данной тематике, но всё же:

  • Разрешение экрана: 1920x1080;
  • Быстродействие: Высоко;
  • Качество теней: Высоко;
  • Тени: Мир и геометрия;
  • Динамичные тени: Мир и геометрия;
  • Качество текстур: Средне;
  • Качество SSAO: Высоко;
  • Качество света: Высоко;
  • Качество персонажей: Высоко;
  • Качество мира: Высоко;
  • Качество частиц: Высоко;
  • Радиус обзора: 100%.

Дополнительные настройки:

  • Экспозиция;
  • Блики;
  • Детализация лиц;
  • Постобработка.

Arcania: Gothic 4


Min | Avg FPS


Включите JavaScript, чтобы видеть графики

Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:

  • Тест 1: Min FPS 41,5 | AVG FPS 52,486
  • Тест 2: Min FPS 40 | AVG FPS 52,432
  • Тест 3: Min FPS 40,5 | AVG FPS 52,479

Как видно, разброса по минимальному FPS избежать проблематично, это значение зависит от множества факторов, включая и непосредственно глючность игры. Максимальный разброс цифр достигает 1,5 FPS, что в данном случае около 4%. Хотелось бы большего, но такая погрешность вполне приемлема. А вот по AVG FPS получены на удивление точные результаты, с минимальными погрешностями. Хорошее начало.


Battlefield Bad Company 2

Популярная игра, оставленная разработчиками (на горе всей пишущей братии) без встроенного теста производительности.

Особенности, которые следует учитывать:

  • Всё управление в меню осуществляется только мышкой. Это плохо, ведь скрипт становится привязанным к одному разрешению экрана, а для других придётся менять код. Но это как-нибудь потом, а пока используется 1920x1080.
  • В выбранной тестовой сцене после загрузки уровня нам показывают видеоролик, который можно пропустить. Это позволяет задать одну и ту же точку начала тестовой сцены независимо от времени её загрузки.

Последовательность действий:

SetKeyDelay [, 20, 20] ;Установка задержки и времени зажатия клавиш в миллисекундах. Местами необходимо, но, как правило, лучше всё делать вручную.

SetDefaultMouseSpeed, 30 ;Так как переход по меню будет осуществляться при помощи мыши – необходимо задать скорость её перемещения. Иначе перемещение будет не плавным, а мгновенным, и действие может не сработать.

run, BFBC2Game.exe ;Уже знакомая команда запуска .exe файла игры.

Sleep 14000 ;Пауза. Значение может быть выше на слабых системах.

Send {Esc down} ;Тут идёт показ вступительной рекламы, дабы не тратить зря время, её можно пропустить нажатием Escape.

Sleep 60

Send {Esc up}

Sleep 12000 ;До перехода в главное меню следует подождать.

i=0 ;Переменная понадобится в дальнейшем.

Loop 4 ;Задаётся четырёхкратное выполнение действий, заключённых в фигурные скобки.

{

SendEvent {Click 800, 130} ;Клик по кнопке меню «Индивидуальная».

Sleep 2000

SendEvent {Click 800, 245} ;Выбор подпункта «Моя компания».

Sleep 1500

SendEvent {Click 300, 670} ;Клик по выбору миссии. В данном случае это: «7.Тяжелый металл».

Sleep 1000

SendEvent {Click 1150, 940} ;Клик по меню «Начать».

Sleep 2000

SendEvent {Click 400, 600} ;Клик по выбору уровня сложности. Здесь - «Легкий».

Sleep 1000

SendEvent {Click 1600, 880} ;Клик по кнопке «Начать». С этого момента начинается процесс загрузки уровня.

Sleep 500

if (i==0) ;Оператор условия. Для первого запуска тестовой сцены добавляет к длительности паузы пять секунд. Большего, как правило, не требуется, хотя для слабых ПК, возможно, придётся это значение увеличить.

{

Sleep 5000

i++

}

Sleep 15000 ;Игра грузится не так долго, но наличие после загрузки уровня вступительного видеоролика позволяет значительно перестраховаться.

Send {Space down} ;Нажатие пробела. Приводит к пропуску вступления, после чего начинается собственно тестирование.

Sleep 60

Send {Space up}

Sleep 3000

Send {F10} ;Хотя, в отличии от Gothic 4, здесь в силу объективных причин точка начала замера будет одна и та же – лишним скриншот не будет. Удалить его потом не сложно.

Sleep 500

Send {F11} ;Начало замера производительности и тестовой сцены. Суть сцены сводится к прохождению на танке тестового отрезка и к попытке уничтожить выстрелом из орудия уезжающий от него автомобиль.

Sleep 460

Send c ;Нажатие клавиши «c». Подразумевает смену камеры между положениями «Вид сверху» и «Вид из кабины».

Sleep 200

Send {down down}

Sleep 1000

Send {down up}

Sleep 1000

Send {w down}

Sleep 7000

Send {a down}

Sleep 500

Send {a up}

Sleep 4000

Send {a down}

Sleep 950

Send {a up}

Sleep 1000

Send {d down}

Sleep 200

Send {d up}

Send {down down}

Send {down up}

Sleep 10000

Send c

Send {a down}

Sleep 900

Send {a up}

Sleep 500

Send {w up}

Send {down down}

Sleep 10

Send {down up}

Send {LButton down}

sleep 60

Send {LButton up}

Sleep 1500

Send {w down}

Sleep 1000

Send {d down}

Sleep 930

Send {d up}

Send {up down}

Sleep 10

Send {up up}

Send {LButton down}

sleep 60

Send {LButton up}

Sleep 2000

Send c

Sleep 500

Send {w up}

Sleep 4000

Send {F11} ;Окончание замера производительности.

Sleep 500

Send {F10} ;Ещё один скриншот. По сравнению с первым – более полезен.

Sleep 1000

Send {Esc down} ;Выход в меню паузы

Sleep 60

Send {Esc up}

Sleep 2000

SendEvent {Click 1800, 130} ;Клик по меню «Выйти».

Sleep 2000

SendEvent {Click 800, 645} ;Подтверждение выхода. Осуществляется переход в главное меню.

Sleep 3000 ;Пауза. Переход в главное меню осуществлён.

} ;Переход на следующую итерацию/окончание цикла.

SendEvent {Click 1800, 130} ;Клик по меню «Выйти».

Sleep 2000

SendEvent {Click 800, 645} ;Подтверждение выхода. Осуществляется выход из игры.

Ниже - ролик, демонстрирующий работу скрипта::

Дополнительно - скриншоты начала и окончания замера производительности:

450x253  15 KB. Big one: 1920x1080  231 KB

450x253  16 KB. Big one: 1920x1080  264 KB

Перейду непосредственно к результатам:

Настройки графики:

  • Разрешение: 1920*1080;
  • Уровень детализации: Выс;
  • Качество текстур: Выс;
  • Качество теней: Выс;
  • Качество эффектов: Выс;
  • Сглаживание: 4x;
  • Анизотропный фильтр: 16x;
  • Вертикальная синхронизация: Выкл;
  • HBAO: Вкл.

Battlefield Bad Company 2


Min | Avg FPS


Включите JavaScript, чтобы видеть графики

Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:

  • Тест 1: Min FPS 52 | AVG FPS 76,122
  • Тест 2: Min FPS 52 | AVG FPS 76,0215
  • Тест 3: Min FPS 52 | AVG FPS 76,4105

Солидный разброс по Min FPS в рамках одного цикла тестирования и отсутствие каких-либо отличий между тремя разными циклами. Для всех тестов показаны максимально-близкие цифры. А с учётом того, что замер производительности происходит автоматически – ну просто цены таким результатам нет.

Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Страницы материала
Страница 1 из 3
Оценитe материал
рейтинг: 4.4 из 5
голосов: 72

Теги

Комментарии 643 Правила



Возможно вас заинтересует

Популярные новости

Сейчас обсуждают