Периодическая проблема с производительностью графического процессора - PullRequest
2 голосов
/ 21 мая 2010

У меня есть приложение WinForms, которое использует XNA для анимации 3D-моделей в элементе управления. Приложение работало месяцами, но в последнее время я начал испытывать периодические паузы в анимации. Отправляясь расследовать, что происходит, я установил следующие факты:

  1. Это происходит только на моей машине, другие машины работают нормально
  2. Удаление всего из моего цикла рендеринга не решает проблему

В 2. На самом деле я не удалил всего , я ограничил свой цикл, чтобы установить область просмотра на моем GraphicsDevice, а затем выполнить GraphicsDevice.Present.

Пытаясь копать дальше, я запустил PIX, чтобы получить некоторую статистику. Скриншоты двух прогонов PIX можно посмотреть здесь (Run6) и здесь (Run14) . Run6 использует мой оригинальный цикл рендеринга, а Run14 использует простой цикл Present.

PIX говорит мне, что графический процессор периодически делает что-то , и я предполагаю, что это вызывает паузы. Что может быть причиной этого? Или как мне узнать, что на самом деле делает GPU?

Обновление: , поскольку я обычно полагаю, что мой код совершенен (кто смеется?) Я начал новый проект XNA с нуля, чтобы увидеть, демонстрирует ли он такое же поведение. Итак, запустив новый проект Windows Game XNA 3.1 и запустив PIX, я получаю на этой шкале . Те же периодические паузы. Таким образом, проблема должна быть ниже в стеке, в XNA или Direct3D.

Итак, PIX показывает, что графический процессор работает над чем-то, я вижу список вызовов DX, выполненных в каждом кадре, а расчеты синхронизации показывают, что пауза возникает во время (или после) вызова IDirect3DDevice9::Present.

Обновление 2: Я ранее установил и удалил XNA 4.0 CTP на проблемном компьютере. Я не могу быть уверен, что это связано, но я подумал, что переустановка битов XNA Game Studio 3.1 может изменить ситуацию. Оказывается, это так.

Основной вопрос остается тем же (и щедрость все еще работает): что может повлиять на XNA 3.1 (или DirectX), чтобы заставить его вести себя так, и есть ли какой-либо инструмент для ведения журнала / трассировки для уровня DirectX и / или GPU что может пролить свет на то, что происходит?

Примечание: Я использую XNA 3.1 на двухъядерной машине Windows 7 x64 с 8 ГБ ОЗУ.

Примечание 2: также разместил этот вопрос на форумах XNA Creators здесь .

Ответы [ 4 ]

1 голос
/ 28 мая 2010

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

  1. Запустите трассировку, сделайте это с повышенными привилегиями.

    xperf -on BASE + LATENCY -stackWalk Profile

  2. Подождите достаточно времени, чтобы убедиться, что проблема обнаружена.

  3. Остановите трассировку и откройте ее вот так.

    xperf -d trace.etl
    xperfview trace.etl

  4. Анализируйте, просматривая графики и справочные таблицы с определенными интервалами, и посмотрите, сможете ли вы найти что-то, связанное с проблемой, наибольшие шансы найти ее будут в разделе DPC и прерывания. Но это может быть что-то странное в разделе ЦП или ввода / вывода. Удачи!

Также больше информации о Xperf и о том, как его получить , надеюсь, это даст результаты.


Если нет, вы можете попробовать GPUView , который был использован для улучшений в DWM,
он также включен рядом с Xperf с Windows Performance Toolkit, так что вы можете легко попробовать оба!

log v

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

log

gpuview merged.etl

В случае, если gpuview не хватает памяти, вы можете попробовать добавить "/ limit 3" или удалить v.

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

1 голос
/ 21 мая 2010

Хм ... похоже, что это происходит на GPU, однако это звучит как проблема с сборкой мусора в процессоре. Можете ли вы запустить CLR profiler и посмотреть, видите ли вы какие-либо всплески активности GC, которые можно соотнести с замедлением?

Я согласен, что это звучит маловероятно, поскольку вы можете ясно видеть это в PIX, но это может дать подсказку относительно причины.

0 голосов
/ 28 мая 2010

Это похоже на проблему vsync или GPU в последних событиях. Поскольку возвращение к другой версии исправило это, и «узкое место» находится в IDirect3DDevice9::Present, давайте перейдем к предыдущему варианту.

Я не знаком с XNA, поэтому я не знаю, какая часть работы D3D раскрыта, но знаете ли вы, на что установлены ваши PresentationParameters?

В частности, попробуйте установить для эффекта свопинга значение Discard.

0 голосов
/ 26 мая 2010

Если это происходит только на вашей машине, то это могут быть драйверы? Простите за скептицизм, но ведь это 64-битная машина: D

...