Что может вызвать снижение частоты кадров при обновлении видеокарты? - PullRequest
3 голосов
/ 11 сентября 2008

У нас есть приложение DirectX с двумя экранами, которое ранее работало с постоянной частотой 60 кадров в секунду (частота синхронизации мониторов), используя NVIDIA 8400GS (256 МБ). Однако, когда мы обменяли карту на одну с 512 МБ ОЗУ, частота кадров изо всех сил пыталась получить более 40 FPS. (Это становится настолько высоким, потому что мы используем тройную буферизацию.) Две карты от одного производителя (PNY). При прочих равных условиях это приложение для Windows XP Embedded, и мы начали с нового образа для каждой карты. Номер версии драйвера: 169.21.

Приложение все 2D. И.Е. просто куча текстурированных четырехугольников и куча предварительно отрендеренной графики (отсюда и необходимость обновления памяти карты). У нас также есть сжатые анимации, которые процессор декодирует на лету - это связано с блокировкой текстуры. Блокировки занимают вечность, но я также пытался иметь отдельную текстуру системной памяти для обновления ЦП, а затем обновлять визуализированную текстуру, используя метод UpdateTexture устройства. Нет общей разницы в производительности.

Несмотря на то, что я прочитал все часто задаваемые вопросы, которые я могу найти в Интернете о производительности DirectX, это все еще первый раз, когда я работал над проектом DirectX, поэтому любые тайные знания, которые у вас есть, были бы полезны. :)

Еще одна вещь, пока я нахожусь на эту тему; при вызове Present в цепочках подкачки кажется, что DirectX ожидает завершения подарка, несмотря на то, что я использую D3DPRESENT_DONOTWAIT в обоих параметрах присутствия (PresentationInterval) и флагах самого вызова. Поскольку это приложение с двумя экранами, это проблема, так как два монитора, кажется, не заблокированы, я работаю над этим, выполняя вызовы Present через пул потоков. Что может быть основной причиной этого?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

Карты одинаковы (обе GeForce 8400GS), и отличаются только размеры памяти? Довольно часто с разным объемом памяти приходят немного разные тактовые частоты (т. Е. Ваша карта с большим объемом памяти может использовать более медленную память!).

Итак, первое, что нужно проверить, - это частоты ядра и памяти GPU, используя что-то вроде GPU-Z .

1 голос
/ 11 сентября 2008

Это простой тест, чтобы увидеть, является ли блокировка поверхности проблемой, просто закомментируйте обновление текстуры и посмотрите, вернется ли частота кадров к 60 Гц. К сожалению, запись на заблокированную поверхность и обновление ресурса убивает производительность, всегда так. Вы используете mipmaps с текстурами? Я знаю, что в DX9 добавлена ​​автоматическая генерация мипмапов, на их создание может потребоваться много времени. Если вы постоянно блокируете один и тот же ресурс в каждом кадре, вы также можете попытаться создать пул текстур, вроде тройной буферизации, за исключением текстур. Вы позволите рендеру использовать одну текстуру, и при следующем обновлении вы выберете следующую доступную текстуру в пуле, которая не используется для рендеринга. Если, конечно, ваша память не ограничена или вы не используете только анимированную текстуру.

...