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

Medal of Honor (2010)

Не всем игра понравилась, но как-никак это очередной Medal of Honor, и обходить стороной данную игру ценителям жанра не стоит.

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

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

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

реклама

SetKeyDelay [, 30, 30] ;Установка задержки и времени зажатия клавиш в миллисекундах. На сей раз больше, чем обычно. При 20, 20 могут возникнуть проблемы.

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++ ;Увеличение переменной i на единицу.

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

Send {left} ;Переход к меню «Выход».

Sleep 1000

Send {Enter} ;Клик по выбранному меню.

Sleep 1000

Send {left} ;Переход к кнопке подтверждения выхода.

Sleep 1000

Send {Enter} ;Подтверждение выхода.

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

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

450x253  6 KB. Big one: 1920x1080  66 KB

450x253  6 KB. Big one: 1920x1080  81 KB

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

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

Разрешение: 1920х1080;

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

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

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

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

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

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


Medal of Honor (2010)


Min | Avg FPS


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

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

  • Тест 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} ;Выбор уровня, здесь - «Глава7 - Башня».

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++ ;Увеличение переменной j на единицу.

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

Sleep 30000

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

Send {F10} ;Скриншот.

Sleep 1000

} ;Точка выхода из оператора условия, внутри которого происходил замер производительности. Последующие строки актуальны для любых значений переменной i.

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++ ;Увеличение переменной i на единицу.

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

Sleep 2000

Send {Enter} ;Переход к главному меню.

Sleep 3000

Send {up}

Sleep 800

Send {up} ;Выбор меню «Выйти».

Sleep 800

Send {Enter} ;Клик по выбранному меню.

Sleep 800

Send {Enter} ;Подтверждение выхода.

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

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

450x253  7 KB. Big one: 1920x1080  89 KB

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

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

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

Metro 2033


Min | Avg FPS


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

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

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

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) ;Но только не для первой загрузки уровня, которая длится нааааааамного дольше. Добавляется дополнительные 50 секунд паузы.

Sleep 50000

Send {enter down} ;Осуществление перехода к выбранному уровню.

Sleep 100

Send {enter up}

Send {enter down} ;При первой загрузке иногда не нажимается с первого раза, так что и второе нажатие Enter’а не помешает.

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++ ;Увеличение переменной i на единицу.

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

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

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

450x253  10 KB. Big one: 1920x1080  171 KB

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

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

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

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


Min | Avg FPS


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

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

  • Тест 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
Страницы материала
Страница 3 из 3
Оценитe материал
рейтинг: 4.4 из 5
голосов: 72

Теги

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



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

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

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