Проблема тестирования производительности в играх не нова. Встроенные бенчмарки присутствуют не во всех играх, а среди тех немногих продуктов, где они есть – существуют те, которые, в общем-то, малопригодны, поскольку не отражают реальной картины происходящего и мало сопоставимы с непосредственно игровым процессом.
В таком случае для авторов статей остаётся два варианта:
Казалось бы, что тут ещё думать, остаётся только принимать ситуацию такой, какая она есть. Но как там говорил Эйнштейн? "Все с детства знают, что то-то и то-то невозможно. Но всегда находится невежда, который этого не знает. Он-то и делает открытие".
Тема данного материала - попытка избавиться от человеческого фактора при исследовании производительности в играх с помощью скриптового языка программирования AutoHotkey. А еще - шаг в сторону унификации методики тестирования, с возможностью перепроверки результатов читателями. Ну и, разумеется, непосредственно автоматизация процесса тестирования.
Перед тем, как приступить к разбору конкретно взятых игр – пара слов об AutoHotkey.
AutoHotkey - это свободная утилита под Windows с открытыми исходными кодами. Популярна среди любителей онлайн-шутеров, часто используется ими в качестве инструмента для создания макросов.
Сприпты под AutoHotkey пишутся в виде текстовых файлов с последовательностью команд, итоговый файл сохраняется с расширением .ahk, выполняется при открытии. Научить за пять минут я никого не смогу, кому интересно – все ссылки даны выше.
Суть автоматизации процесса тестирования сведена к программированию и к выполнению последовательности команд. Последняя включает в себя запуск игры, загрузку сохранения, несколько проходов тестовой сцены, а после – выход из игры. При правильно написанных скриптах остается только собирать итоговые цифры.
Для тех, кто не желает знакомиться с документацией, постараюсь максимально подробно комментировать получившийся код по каждой игре.
Тестирование производилось на следующей конфигурации:
В играх, используемых в качестве тестовых приложений, выставлялось разрешение 1920х1080. Соответственно, присутствует оптимизация только под него, хотя в большинстве игр полученные скрипты должны работать и при других разрешениях. Настройки графики в играх не менялись, оставшись теми же, что и в недавнем материале по сравнению производительности процессоров.
Для анализа повторяемости результатов во всех играх проводились по три замера производительности. Каждый из них состоял из четырех запусков одной и той же сцены. Между замерами тестовой стенд перезагружался.
Автоматизированные измерения осуществлялись с помощью утилиты Fraps, в них участвовали следующие игры:
(В скобках указана версия .exe файла игры).
Все скрипты и необходимые сохранения для игр прикреплены общим архивом в конце статьи.
На самом деле статья начинается здесь.
Для многих эта игра не оправдала надежд, но все же снискала популярность среди игроков. Требования к аппаратному обеспечению у игры большие, обеспечен высокий интерес к тестированию производительности в ней.
Особенности, которые следует учитывать:
Последовательность действий:
| Run, arcania.exe ; Sleep 20000 ; i=0 ; Loop 5 ; { Sleep 1000 ; Send {down down} ; Sleep 80 ; Send {down up} ; Sleep 500 ; Send {Enter down} ; Sleep 80 Send {Enter up} Sleep 1000 ; Send {down down} ; Sleep 80 Send {down up} Sleep 500 Send {Enter down} ; Sleep 80 Send {Enter up} Sleep 1000 if (i<>0) ; { Send {Enter down} Sleep 80 Send {Enter up} } if (i==0) ; Sleep 20000 Sleep 9000 ; if (i>0) ; { Send {F10} ; Sleep 500 Send {F11} ; 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++ ; } ; 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} Sleep 500 Send {Enter down} ; Sleep 80 Send {Enter up} Sleep 4000 ; 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 {down down} Sleep 80 Send {down up} Sleep 500 Send {Enter down} Sleep 80 Send {Enter up} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Итак, всё необходимое для замера производительности есть, теперь остаётся только получить результаты.
Настройки графики малоинтересны при данной тематике, но всё же:
Дополнительные настройки:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Как видно, разброса по минимальному FPS избежать проблематично, это значение зависит от множества факторов, включая и непосредственно глючность игры. Максимальный разброс цифр достигает 1,5 FPS, что в данном случае около 4%. Хотелось бы большего, но такая погрешность вполне приемлема. А вот по AVG FPS получены на удивление точные результаты, с минимальными погрешностями. Хорошее начало.
Популярная игра, оставленная разработчиками (на горе всей пишущей братии) без встроенного теста производительности.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 20, 20] ; SetDefaultMouseSpeed, 30 ; run, BFBC2Game.exe ; Sleep 14000 ; Send {Esc down} ; 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} ; 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} ; Sleep 500 Send {F11} ; Sleep 460 Send 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} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Солидный разброс по Min FPS в рамках одного цикла тестирования и отсутствие каких-либо отличий между тремя разными циклами. Для всех тестов показаны максимально-близкие цифры. А с учётом того, что замер производительности происходит автоматически – ну просто цены таким результатам нет.
Не теряющая популярности игра, полюбившаяся многим.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 20, 20] ; run, Borderlands.exe ; Sleep 30000 ; Send {Enter} ; Sleep 3000 Loop 4 ; { Send {Enter} ; Sleep 1500 Send {Enter} ; Sleep 13000 ; Send {F10} ; Sleep 1000 Send {F11} ; Sleep 1000 Send {d down} Sleep 250 Send {d up} Send {Shift down} Sleep 100 Send {w down} Sleep 5000 Send {w up} Send {Shift up} Send {s down} Sleep 5000 Send {s up} Sleep 1000 Send {Shift down} Send {w down} Sleep 2500 Send {Space down} Sleep 500 Send {Space up} Sleep 2000 Send {Shift up} Send {right down} Sleep 800 Send {right up} Sleep 1200 Send {w up} Sleep 500 Send {s down} Sleep 1000 Loop 10 { Send {a down} Sleep 500 Send {a up} Send {d down} Sleep 500 Send {d up} } Send {s up} Sleep 1000 Sleep 1000 Send {Space} Sleep 3000 Send {F11} ; Sleep 1000 Send {F10} ; Sleep 1000 Send {Esc} ; Sleep 1000 Send {up} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {up} ; Sleep 500 Send {Enter} ; Sleep 8000 ; } ; Send {up} ; Sleep 500 Send {Enter} ; Sleep 500 Send {up} ; Sleep 500 Send {Enter} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Да, разброс результатов получился высоковатым, однако находится в пределах четырёх процентов и результаты могут быть применимы для оценки производительности железа.
Игра вышла недавно и, хотя понравилась не всем, все же смогла пробиться к вершинам чарта продаж проектов сервиса Steam. Такой продукт обойти стороной сложно.
Особенности, которые следует учитывать:
Код получился местами сложный для восприятия неподготовленному человеку, так как содержит большое количество операторов условия и пару циклов, поэтому для упрощения восприятия немного структурирован.
Последовательность действий:
| SetKeyDelay [, 20, 20] ; run, BlackOps.exe ; Sleep 16000 ; Send {LButton down} ; sleep 500 Send {LButton up} Sleep 3000 Send {Enter} ; Sleep 2000 ; i=0 ; Loop 5 ; { Send {Enter} ; Sleep 3500 Send {Down down} ; Sleep 60 Send {Down up} Sleep 500 if (i>0) ; { Send {Down down} Sleep 60 Send {Down up} Sleep 500 } Send {Enter} ; Sleep 2000 Send {Up} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {Up} ; Sleep 500 if (i>0) ; { Send {down} Sleep 500 } Send {Enter} ; If (i==0) ; { Sleep 50000 Send {LButton down} ; sleep 500 Send {LButton up} Sleep 24000 ; If (i>0) ; { Sleep 18000 ; Send {LButton down} ; sleep 500 Send {LButton up} Sleep 23500 ; Send {F10} ; Sleep 500 Send {F11} ; Sleep 5000 Send {w down} Sleep 3000 Send {LButton down} Send {w up} Sleep 500 Send {d down} Sleep 150 Send {RButton down} Sleep 100 Send {RButton up} Send {d up} Sleep 1000 Send {w up} Send {RButton down} Sleep 100 Send {RButton up} sleep 2000 Send {LButton up} Send {w down} Sleep 350 Send {w up} Sleep 400 Send {RButton down} Sleep 100 Send {RButton up} Send {s down} Sleep 550 Send {LButton down} sleep 3000 Send {LButton up} Send {s up} Loop 7 ; { Send {d down} Send {LButton down} Sleep 3000 Send {d up} Send {a down} Sleep 3100 Send {a up} Send {LButton up} Sleep 1000 Send {w down} Sleep 100 Send {w up} } ; Sleep 1000 Send {F11} ; Sleep 500 Send {F10} ; Sleep 1000 } ; Send {Esc} ; Sleep 2000 Send {up} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {up} ; Sleep 500 Send {Enter} ; Sleep 7000 ; Send {LButton down} ; sleep 500 Send {LButton up} Sleep 1000 i++ ; } ; Sleep 1000 ; Send {up} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {up} ; Sleep 500 Send {Enter} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Не идеально, конечно, но точности полученных цифр хватит, чтобы использовать данную тестовую сцену.
Популярная игра жанра RPG, сильно требовательна к вычислительным мощностям, в первую очередь - к процессорам.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 20, 20] ; SetDefaultMouseSpeed, 30 ; Run, daorigins.exe ; Sleep 16000 ; Send {Esc down} ; Sleep 60 Send {Esc up} Sleep 500 Send {Esc down} ; Sleep 60 Send {ESC up} Sleep 1000 i=0 ; SendEvent {Click 1835, 750} ; Loop 5 ; { Sleep 1500 ; SendEvent {Click 1170, 800} ; If (i==0) ; Sleep 40000 If (i>0) ; { Sleep 6000 ; Send {F10} ; Sleep 500 Send {F11} ; Send {w down} Sleep 16760 Send {w up} Sleep 5540 Send {s down} Sleep 16600 Send {s up} Sleep 500 Send {F11} ; Sleep 500 Send {F10} ; Sleep 500 } ; Send {Esc down} ; Sleep 60 Send {Esc up} Sleep 1000 SendEvent {Click 950, 500} ; Sleep 1000 i++ ; } ; Sleep 1000 Send {Esc down} ; Sleep 60 Send {ESC up} Sleep 1500 SendEvent {Click 960, 700} ; Sleep 1500 SendEvent {Click 900, 555} ; Sleep 1500 ; SendEvent {Click 1850, 950} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Даже комментировать особо нечего, повторяемость результатов близка к идеальной.
Не всем игра понравилась, но как-никак это очередной Medal of Honor, и обходить стороной данную игру ценителям жанра не стоит.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 30, 30] ; run, moh.exe ; Sleep 46000 ; i=0 ; Loop 5 ; { Send {up} ; Sleep 500 Send {up} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {down} ; Sleep 500 Send {down} Sleep 500 Send {left} Sleep 500 Send {Enter} Sleep 500 Send {down} Sleep 500 Send {down} Sleep 500 Send {Enter} ; Sleep 500 Send {left} ; Sleep 500 Send {Enter} ; Sleep 2000 Send {down} ; Sleep 500 Send {Enter} ; If (i==0) ; Sleep 10000 If (i>0) ; { Sleep 6000 ; Send {F10} ; Sleep 1000 Send {F11} ; Sleep 105500 Send {F11} ; Sleep 1000 Send {F10} ; Sleep 1000 } Send {Esc} ; Sleep 1000 Send {up} Sleep 500 Send {up} ; Sleep 500 Send {Enter} ; Sleep 1000 Send {left} ; Sleep 500 Send {Enter} ; Sleep 5000 i++ ; } ; Send {left} ; Sleep 1000 Send {Enter} ; Sleep 1000 Send {left} ; Sleep 1000 Send {Enter} ;
|
Дополнительно - скриншоты начала и окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Разрешение: 1920х1080;
Вертикальная синхронизация: Выкл;
Качество: Выс;
Качество текстур: Выс;
Качество окружающего мира: Выс;
Качество теней: Выс;
Сглаживание: Вкл.
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
При смежных запусках тестовой сцены наблюдается разброс значений по Min FPS, однако между тремя запусками четырёхкратного теста разница в результатах минимальна.
В особом представлении игра не нуждается. Одна из наиболее требовательных к производительности графических адаптеров игра, если не самая-самая. Да, в Metro2033 есть готовое средство измерения производительности, но этот бенчмарк создаёт нагрузку, нетипичную для игрового процесса, что ставит под сомнение результаты. Конечно, производительность лучше мерить непосредственно в игре, что и произойдет ниже.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 20, 20] ; Run, metro2033.exe ; Sleep 24500 ; Send {enter} ; i=0 ; Loop 5 ; { j=0 ; Sleep 1800 Send {enter} ; Sleep 2500 Send {up} ; Sleep 800 Send {up} Sleep 800 Send {up} Sleep 800 Send {Enter} ; Sleep 3000 Send {up} ; Sleep 800 Send {up} Sleep 800 Send {Enter} ; Sleep 800 Send {Enter} ; Sleep 800 Send {Enter} ; Sleep 8000 ; Send {enter} ; If (i==0) ; Sleep 10000 If (i>0) ; { Sleep 2000 Send {3} Send {F11} ; Sleep 1000 Send {g down} Sleep 1200 Send {g up} Sleep 200 Send {w down} Sleep 1000 Send {w up} Sleep 2500 Send {s down} Sleep 1000 Send {s up} Sleep 2500 Send {d down} Sleep 1000 Send {d up} Sleep 2500 Send {a down} Sleep 1000 Send {a up} Send {w down} Sleep 1000 Send {w up} Send {s down} Sleep 1000 Send {s up} Send {d down} Sleep 1000 Send {d up} Send {a down} Sleep 1000 Send {a up} Sleep 2500 Send {a down} Sleep 1000 Send {a up} Sleep 1000 Send {w down} Sleep 1000 Send {w up} Send {left down} Sleep 1300 Send {left up} Send {s down} Sleep 1200 Send {s up} Sleep 1500 Send {w down} Sleep 1300 Send {w up} Sleep 300 Send {d down} Send {w down} Sleep 1000 Send {d up} Sleep 1300 Send {w up} Sleep 300 Send {d down} Sleep 1000 Send {q} Send {d up} Sleep 2200 Send {s down} Sleep 1000 Send {s up} Sleep 500 Send {s down} Sleep 1000 Send {s up} Loop 8 ; { Send {w down} Send {a down} Sleep 500 Send {w up} Send {a up} Send {Right down} Send {Space down} Sleep 300 Send {Space up} Send {Right up} Send {s down} Send {d down} Sleep 500 Send {s up} Send {d up} If ((j==2)|(j==5)) ; Send {q} j++ ; } ; Sleep 30000 Send {F11} ; Send {F10} ; Sleep 1000 } ; Send {Escape} ; Sleep 3500 Send {up} Sleep 800 Send {up} ; Sleep 800 Send {Enter} ; Sleep 800 Send {left} ; Sleep 800 Send {Enter} ; Sleep 3000 i++ ; } ; Sleep 2000 Send {Enter} ; Sleep 3000 Send {up} Sleep 800 Send {up} ; Sleep 800 Send {Enter} ; Sleep 800 Send {Enter} ;
|
Дополнительно - скриншот точки окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
Очень даже неплохо.
Ещё одна известная своими требованиями к системе игра. В ней, как и в Metro 2033, есть собственный тест измерения производительности. Однако, он, во-первых, очень долгий, а во-вторых, во встроенном бенчмарке проблематично получить повторяющиеся результаты. Так что лучше тестировать производительность в игре.
Особенности, которые следует учитывать:
Последовательность действий:
| SetKeyDelay [, 20, 20] ; SetDefaultMouseSpeed, 30 ; run, Stalker-COP.exe ; Sleep 35000 ; Send {esc} ; Sleep 2000 Send {esc} Sleep 2000 Send {esc} Sleep 2000 Send {esc} i=0 ; loop 6 ; { Sleep 4000 Send {down} ; Sleep 200 Send {enter} ; Sleep 500 ; SendEvent {Click 383, 670} ; Sleep 200 Send {enter} ; Sleep 14000 ; If (i==0) ; Sleep 50000 Send {enter down} ; Sleep 100 Send {enter up} Send {enter down} ; Sleep 100 Send {enter up} Sleep 9000 If ((i==0)|(i==1)) ; { Sleep 6000 Send {w down} Sleep 1000 Send {Space} Sleep 4000 Send {d down} Sleep 1000 Send {Space} Sleep 500 Send {a down} Sleep 500 Send {a up} Sleep 4000 Send {w up} Send {d up} Sleep 4000 } ; if (i>1) ; { Send {F11} ; Sleep 1000 Send {w down} Sleep 100 Send {x} Sleep 6900 Send {x} Send {l} Send {d down} Sleep 350 Send {d up} Sleep 4000 Send {d down} Sleep 350 Send {d up} Sleep 8000 Send {d down} Sleep 350 Send {d up} Sleep 2000 Send {l} Sleep 10000 Send {w up} Sleep 8000 Send {w down} Send {a down} Sleep 100 Send {x} sleep 5000 Send {x} Send {space} Send {a up} Sleep 3000 Send {w up} Send {s down} Sleep 4000 Send {s up} Sleep 1000 Send {F11} ; Send {F10} ; Sleep 1000 } Send {esc} ; Sleep 2000 Loop 6 ; { Send {down} Sleep 500 } ; if (i==5) ; { Send {down} Sleep 500 } Send {Enter} ; Sleep 1000 Send {Enter} ; Sleep 3000 i++ ; } ;
|
Дополнительно - скриншот точки окончания замера производительности:
Перейду непосредственно к результатам:
Настройки графики:
Если отбросить по два крайних результата и усреднить пару оставшихся, то получится следующая картина:
И комментировать-то особо нечего.
Вот и закончен сей труд. Так как размер статьи превысил все стандартные лимиты – особо много писать в заключении не стану.
Вот архив со всеми скриптами и сохранениями для протестированных игр. Если кому-то интересно, то вот архив со всеми исходными данными по замерам производительности. Для особо пытливых – включая frametimes.csv файлы.
Подводя итоги написанному, можно сказать, что автоматизации замера производительности достичь не так уж и сложно, как это может показаться на первый взгляд. Основная часть пути пройдена, остались лишь мелкие штрихи в области оптимизации кода, а также в реализации алгоритмов смены разрешения экрана и оптимизация скриптов под различные разрешения.
Продолжение следует...