2013-08-20 3 views
1

Я недавно смотрел PIX для Windows в приложении с использованием Direct3D 9 для рендеринга. Я заметил, что первые операции данного фрейма на объектах рендеринга или текстурах, которые их обертывают, как представляется, занимают очень много времени. Система работает под управлением Windows 7 и не выходит из графической памяти. Таким образом, не должно происходить обморок. Интересно то, что операции на 16-битных поверхностях с плавающей точкой занимают примерно вдвое больше времени, чем на 8-битных целочисленных поверхностях.Задержки вызовов API Direct3D 9

У любого есть какие-либо объяснения этому явлению?

-Timo

ответ

0

Если первая операция занимает много времени, но последующие операции не делают, это звучит как JIT (точно в срок) выпуска компиляции. Вы не указали, какой язык/фрейм вы используете, но если это что-то, что скомпилировано во время выполнения (.NET, Java и т. Д.), Вы будете испытывать задержку в первый раз, когда вы запустите немного кода, который вы не будете в дальнейшем итераций.

Что касается 16-бит, занимающего в два раза больше, чем 8-бит, трудно сказать, что действительно происходит под капотом. Было бы совершенно нелепо полагать, что 16-разрядные операции с плавающей запятой могут занимать в два раза больше, чем 8-битные фиксированные ширины.

+1

Это чистый C++, поэтому не задействовано JIT. Также время, которое занимает операция, очень длинное, о чем сообщает PIX как 898916352 для 8-битного целевого случая визуализации. –

+0

Даже без JIT, если они инициализируют вещи в первый раз (справочные таблицы, случайные числа и т. Д.), Вы можете получить удар производительности. Или, может быть, они вынимают кусок памяти в первый раз, что им не нужно делать при последующих вызовах. Просто пытаясь объяснить это, хотя это может быть реальной проблемой, так что ждите некоторых других ответов и посмотрите, видели ли кто-либо еще эти проблемы. –

+0

Что странно в том, что это происходит каждый кадр ... –

0

В D3D9 архитектура драйвера такова, что ресурсы должны быть проверены, когда они используются. Это увеличивает накладные расходы многих вызовов API и является частью причины, по которой вы должны оптимизировать работу с меньшим количеством вызовов API.

Кроме того, на старых платформах Windows (например, Windows XP) драйвер D3D был полностью в режиме ядра, поэтому вызовы API вызывали режим переключения режима пользователя в режим ядра (это не так в Windows Vista , 7 или 8, которые имеют интерфейс пользовательского режима, такой как OpenGL).

В D3D10 ресурсы проверяются только при их создании. Вероятно, потому что D3D10 накладывается поверх WDDM, что сделало переход из полного режима ядра в частично исполняемый режим D3D пользовательского режима. В WDDM, если сбой выполнения D3D, это не вызовет панику ядра (BSOD), поэтому проверка не так важна. Вы не должны быть почти параноиком об этом, когда работаете в пользовательском режиме.


Теперь, что касается производительности между 8-битовым целочисленным и 16-битным fp, этого действительно следует ожидать. Не так много, потому что одно целое, а другое - FP (графические процессоры великолепны с FP), но потому, что он вдвое больше другого. У графических процессоров много пропускной способности памяти, но вы все равно можете повысить производительность, просто используя наименьший тип данных.

+0

Да, я также думал, что могу обвинить его в проверке ресурсов, но то, что я беспокою, действительно ли драйверу нужно проверить каждый текст в текстуре: Теперь, что касается производительности между 8-битным целочисленным и 16-битным fp, это действительно следует ожидать ». Это звучит немного странно. Я бы понял это для сжатых ресурсов, но несжатых целей рендеринга ... –

+0

@ TimoHeinäpurola: Нет, на самом деле у вас есть это в обратном направлении. Графические процессоры имеют лучшую производительность со сжатыми текстурами, чем без сжатия. Сжатие текстуры является убыточным, поэтому оно не имеет высоких вычислительных затрат. Он предназначен исключительно для уменьшения пропускной способности памяти за счет качества изображения.Это пропускная способность памяти, которая является источником штрафа за производительность между 8-битной текстурой и 16-битной текстурой, вы читаете/записываете в два раза больше данных. –