GetFrontBufferData в видеопамять, а не в системную память

Используя DirectX 9, я хочу захватить то, что находится на экране, и отобразить его уменьшенную версию в своей программе.

Чтобы захватить его, я нашел и использую GetFrontBufferData. Однако это работает путем записи на поверхность, определенную в системной памяти (D3DPOOL_SYSTEMMEM). Это приводит к тому, что мне приходится затем передавать снимок экрана обратно в видеопамять, чтобы я мог его нарисовать.

Как вы можете себе представить, эта ненужная передача из (видеопамять -> системная память -> видеопамять) приводит к тому, что моя программа сильно тормозит.

Есть ли способ сохранить изображение в переднем буфере и поместить его на поверхность в видеопамяти?

Этот вопрос является ответвлением моего недавнего вопроса: Захват и рисование снимка экрана с помощью DirectX


person Tim    schedule 04.04.2011    source источник
comment
Вы хотите отобразить его PIP? Потому что ваш PIP будет частью буфера кадров. Я не думаю, что есть более быстрый способ получить доступ к буферу кадров, поместить в него PIP, а затем не отображать PIP внутри PIP и т. д.   -  person Stephen Chung    schedule 05.04.2011
comment
Я хочу, чтобы он отображал картинку в картинке. Я хочу получить копию данных переднего буфера (обрезать ее до области, на которой я хочу сосредоточиться), а затем нарисовать ее в заднем буфере. Не отображать пункт в области пунктов не входило в требования. Меня развлекал эффект бесконечного коридора, но для моего конечного продукта отображаемая область точек будет подмножеством всего экрана, которое не будет охватывать область точек.   -  person Tim    schedule 05.04.2011
comment
В таком случае, что мешает вам 1) отрисовать сцену в буфер кадра, 2) отрендерить то же самое (или подмножество) на поверхность RenderTarget, 3) отрисовать поверхность в буфер кадра?   -  person Stephen Chung    schedule 05.04.2011
comment
Потому что я не создаю сцену, которую хочу заснять? Я захватываю область, которая находится за пределами моего приложения. Я ценю ваше время и помощь.   -  person Tim    schedule 05.04.2011
comment
Хмммм... в таком случае, я не думаю, что есть более простой способ сделать это, чем вы уже делаете это прямо сейчас.   -  person Stephen Chung    schedule 05.04.2011
comment
Да, это мое исследование появилось ... Кажется, в более ранней версии DirectX вы могли получить прямой доступ к FrontBuffer через указатель на него, но они отошли от этой идеи и сделали его более безопасным.   -  person Tim    schedule 05.04.2011
comment
Не совсем. Это связано с тем, что графические процессоры стали усложняться, а такие вещи, как автоматический сглаживание и мультисэмплинг, затрудняют определение формата кадрового буфера, потому что он может даже не иметь того же количества пикселей, что и программа.   -  person Stephen Chung    schedule 05.04.2011