2016-11-25 8 views
1

Я использую Desktop Duplication для копирования содержимого экрана в растровое изображение в памяти. Я получаю текстуру рабочего стола, а затем создаю промежуточную текстуру, используйте CopyResource, чтобы скопировать рабочую текстуру в промежуточную текстуру, наконец, позвонить ID3D11DeviceContext::Map, чтобы получить доступ к промежуточным фрагментам текстуры и скопировать их. Практически таким же способом, как описано здесь: https://stackoverflow.com/a/27283837/825318ID3D11DeviceContext :: Map slow performance

Проблема заключается в том, что Map вызов занимает много времени - для больших разрешений экрана, такие как 4K это может занять до 100 мс на один вызов, который является неприемлемо высоким, как мне нужно для обеспечения скорости 30 кадров в секунду.

Есть ли способ быстрее получить содержимое текстуры? Если нет, есть ли способ предоставить свой собственный указатель адресного картографирования, чтобы система копировала данные текстуры там? Спасибо

+1

Документация [ID3D11DeviceContext :: Map] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff476457 (v = vs.85) .aspx) говорит о снижении производительности и предлагает соответствующие стратегии и конец страницы. Один из них - использовать volatile pointer. –

+0

Спасибо, однако это относится только к поверхностям только для записи, в то время как моя задача - считывать данные с поверхности. – Isso

ответ

3

Скорее всего, операция Map ожидает завершения копирования CopyResource. Вы можете использовать GPUView, чтобы проверить это. Если это так, то рекомендуемым решением является принятие задержки в пользу частоты кадров. Способ справиться с этим, чтобы сохранить по крайней мере 3 стадирования текстуры и поворот между ними следующим образом:

кадр # 1 - начать копировать ресурс для постановки текстуры # 1

кадр # 2 - начать копировать ресурс постановка текстуры # 2

кадр # 3 - начать копировать ресурс для постановки текстуры # 3 и карта постановки текстуры # 1 для доступа к данным

кадр # 4 - начать копировать ресурс для постановки текстуры # 1 (старое содержимое должно уже сохраняться) и текстурирование текстуры # 2 для доступа к данным

Таким образом, вы можете сохранить 30 FPS, но ввести задержку ~ 130 мс, приемлемую для большинства приложений.

+0

Спасибо! К сожалению, мне нужна минимальная латентность, поэтому ваше решение на самом деле не решает мою проблему, однако это умный подход, и GPUView кажется очень полезной утилитой. Таким образом, я награждаю вам щедрость. – Isso

+1

Если вы хотите минимальную задержку, вам в основном нужно синхронизировать CPU с графическим процессором, чтобы гарантировать, что текстура будет прочитана, как только она будет скопирована. Это означает, что графический процессор и процессор не будут работать параллельно, и это именно то, что вы видели в своем исходном вопросе. Если мне что-то не хватает, пожалуйста, дайте мне знать, что вы пытаетесь удовлетворить два противоположных требования. – moradin

 Смежные вопросы

  • Нет связанных вопросов^_^