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

6 декабря 2010, понедельник 06:02
Ivan_FCB для раздела Лаборатория

Оглавление

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

Вступление

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

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

  • Тестировать железо в редко-обновляемом и небольшом тестовом пакете, состоящем либо только из игр, в которых присутствует возможность легко и без лишних усилий получить результаты, либо с минимумом ручных тестов.
  • Тестировать вручную, при помощи таких утилит, как 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 ;

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} ;

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

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

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

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

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

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

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

Arcania: Gothic 4


Min | Avg FPS

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

  • Тест 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 ;

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} ;

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

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

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

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

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

Battlefield Bad Company 2


Min | Avg FPS

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

  • Тест 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 в рамках одного цикла тестирования и отсутствие каких-либо отличий между тремя разными циклами. Для всех тестов показаны максимально-близкие цифры. А с учётом того, что замер производительности происходит автоматически – ну просто цены таким результатам нет.

Borderlands

Не теряющая популярности игра, полюбившаяся многим.

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

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

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

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} ;

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

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

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

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

  • Разрешение: 1920x1080;
  • Анизотропная фильтрация: 16x;
  • Динамические тени: On;
  • Следы от пуль: On;
  • Качество листвы: High;
  • Качество текстур High;
  • Детализация игры: High;
  • Окклюзия: Off;
  • Bloom: On;
  • Глубина резкости: On;
  • Отражение света: On.

Borderlands


Min | Avg FPS

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

  • Тест 1: Min FPS 90 | AVG FPS 113,6135
  • Тест 2: Min FPS 92 | AVG FPS 115,3015
  • Тест 3: Min FPS 89 | AVG FPS 111,741

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

Call of Duty: Black Ops

Игра вышла недавно и, хотя понравилась не всем, все же смогла пробиться к вершинам чарта продаж проектов сервиса 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} ;

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

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

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

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

  • Разрешение: 1920x1080;
  • Сглаживание: 4х;
  • Синхронизация кадров: Нет;
  • Фильтрация текстур: Трилинейная;
  • Анизотропная фильтрация: 16x;
  • Качество текстур: Макс;
  • Тени: Да;
  • Следы пуль: Да;
  • Число трупов: Большое;

Call of Duty Black Ops


Min | Avg FPS

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

  • Тест 1: Min FPS 55,5 | AVG FPS 65,955
  • Тест 2: Min FPS 56,5 | AVG FPS 67,0845
  • Тест 3: Min FPS 56 | AVG FPS 67,06

Не идеально, конечно, но точности полученных цифр хватит, чтобы использовать данную тестовую сцену.

Dragon Age Origins

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

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

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

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

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} ;

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

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

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

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

  • Разрешение: 1920х1080;
  • Детализация графики: Очень высоко;
  • Сглаживание: 4х;
  • Детализация текстур: Высоко;
  • Эффекты кадрового буфера: Включены;

Dragon Age Origins


Min | Avg FPS

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

  • Тест 1: Min FPS 43 | AVG FPS 54,978
  • Тест 2: Min FPS 43 | AVG FPS 55,199
  • Тест 3: Min FPS 43 | AVG FPS 55,3145

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

Medal of Honor (2010)

Не всем игра понравилась, но как-никак это очередной 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;

Вертикальная синхронизация: Выкл;

Качество: Выс;

Качество текстур: Выс;

Качество окружающего мира: Выс;

Качество теней: Выс;

Сглаживание: Вкл.

Medal of Honor (2010)


Min | Avg FPS

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

  • Тест 1: Min FPS 63 | AVG FPS 105,473
  • Тест 2: Min FPS 63 | AVG FPS 106,1815
  • Тест 3: Min FPS 62 | AVG FPS 105,8255

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

Metro 2033

В особом представлении игра не нуждается. Одна из наиболее требовательных к производительности графических адаптеров игра, если не самая-самая. Да, в 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} ;

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

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

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

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

  • Разрешение: 1920*1080;
  • Качество: High;
  • DirectX: DX10;
  • Сглаживание: AAA;
  • Фильтрация текстур: AF16x;
  • Продвинутый PhysX: Вкл.

Metro 2033


Min | Avg FPS

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

  • Тест 1: Min FPS 29 | AVG FPS 44,558
  • Тест 2: Min FPS 29 | AVG FPS 44,7035
  • Тест 3: Min FPS 29 | AVG FPS 45,051

Очень даже неплохо.

S.T.A.L.K.E.R.: Call of Pripyat

Ещё одна известная своими требованиями к системе игра. В ней, как и в Metro 2033, есть собственный тест измерения производительности. Однако, он, во-первых, очень долгий, а во-вторых, во встроенном бенчмарке проблематично получить повторяющиеся результаты. Так что лучше тестировать производительность в игре.

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

  • Управление в меню частично осуществляется мышкой. Это плохо, так как скрипт становится привязанным к одному разрешению экрана, а для других разрешений придётся менять код. Тут он оптимизирован под разрешение 1920x1080.
  • Как и в случае с 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++ ;

} ;

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

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

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

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

  • Тип рендера: Ул. полное освещение (DX10);
  • Установки качества: Максимальные;
  • Разрешение: 1920х1080.

S.T.A.L.K.E.R.: Call of Pripyat


Min | Avg FPS

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

  • Тест 1: Min FPS 56,5 | AVG FPS 72,923
  • Тест 2: Min FPS 56,5 | AVG FPS 72,9105
  • Тест 3: Min FPS 57 | AVG FPS 72,9305

И комментировать-то особо нечего.

Заключение

Вот и закончен сей труд. Так как размер статьи превысил все стандартные лимиты – особо много писать в заключении не стану.

Вот архив со всеми скриптами и сохранениями для протестированных игр. Если кому-то интересно, то вот архив со всеми исходными данными по замерам производительности. Для особо пытливых – включая frametimes.csv файлы.

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

Продолжение следует...

Конев Иван aka Ivan_FCB

Теги