Что может вызвать снижение частоты кадров при обновлении видеокарты?

StackOverflow https://stackoverflow.com/questions/56424

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top