Что может вызвать снижение частоты кадров при обновлении видеокарты?
Вопрос
У нас есть двухэкранное приложение DirectX, которое ранее работало со стабильной частотой 60 кадров в секунду (частота синхронизации мониторов) с использованием NVIDIA 8400GS (256 МБ).Однако, когда мы заменили карту на карту с 512 МБ ОЗУ, частота кадров с трудом превысила 40 кадров в секунду.(Он становится таким высоким только потому, что мы используем тройную буферизацию.) Обе карты от одного производителя (PNY).При прочих равных условиях это приложение Windows XP Embedded, и мы начали с нового образа для каждой карты.Номер версии драйвера — 169.21.
Приложение полностью 2D.И.Е.просто куча текстурированных четырехугольников и куча предварительно отрендеренной графики (следовательно, необходимо обновить память карты).У нас также есть сжатые анимации, которые ЦП декодирует на лету — для этого используется блокировка текстур.Блокировки занимают вечность, но я также попробовал создать отдельную текстуру системной памяти для обновления ЦП, а затем обновить визуализированную текстуру с помощью метода UpdateTexture устройства.В целом разницы в производительности нет.
Хотя я прочитал все часто задаваемые вопросы о производительности DirectX, которые смог найти в Интернете, я по-прежнему впервые работаю над проектом DirectX, поэтому любые тайные знания, которые у вас есть, будут полезны.:)
Еще кое-что, пока я говорю об этой теме;при вызове Present в цепочках обмена кажется, что DirectX ждет завершения настоящего, независимо от того, что я использую D3DPRESENT_DONOTWAIT как в текущих параметрах (PresentationInterval), так и в флагах самого вызова.Поскольку это приложение с двумя экранами, это проблема, поскольку два монитора не синхронизированы по генлоку. Я работаю над этим, запуская вызовы Present через пул потоков.Что может быть основной причиной этого?
Решение
Карты абсолютно одинаковые (обе GeForce 8400GS), и отличаются только объемом памяти?Довольно часто при разных объемах памяти возникают немного разные тактовые частоты (т.е.ваша карта с большим объемом памяти может использовать более медленную память!).
Поэтому первое, что нужно проверить, это тактовую частоту ядра графического процессора и памяти, используя что-то вроде ГПУ-З.
Другие советы
Проверить, является ли проблема блокировкой поверхности, можно легко: просто закомментируйте обновление текстуры и посмотрите, вернется ли частота кадров к 60 Гц.К сожалению, запись на заблокированную поверхность и обновление ресурса всегда снижают производительность.Используете ли вы MIP-карты с текстурами?Я знаю, что в DX9 добавлено автоматическое создание MIP-карт, и их создание может занять много времени.Если вы постоянно блокируете один и тот же ресурс в каждом кадре, вы также можете попробовать создать пул текстур, что-то вроде тройной буферизации, за исключением текстур.Вы разрешаете рендерингу использовать одну текстуру, а при следующем обновлении вы выбираете следующую доступную текстуру в пуле, которая не используется для рендеринга.Если, конечно, ваша память не ограничена или вы просто делаете различия с анимированной текстурой.