Войти
ПрограммированиеФорумГрафика

Direct3D - тормоза с чтением из видеопамяти.

#0
16:43, 3 янв 2007

Мне нужно читать каждый кадр из видеокарты в ОЗУ. Раньше писал это на Опенгл, сейчас надо переписать на Директ3Д. На Опенгл делал так: создавал FBO - рендер в него и glReadbuffer из него. 
На Direct3d9 : 

surface. old : Idirect3dSurface.

pDevice.CreateRenderTarget(720,576,D3DFMT_A8R8G8B8,D3DMULTISAMPLE_NONE,0,true,surface,0); //Создаю к девайсу рендер тагет:

pdevice.getrendertarget(0,old); // получаю старую тагет.

pDevice.SetRenderTarget(0,surface);

pDevice.Clear(0,nil,D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,0),0,0);

...... // здесь рисую.

Потом
surface.lockRect(r1,@r,D3DLOCK_READONLY);
// СорyMemory из R1.pbits в ОЗУ.
Surface.UnLock.

Работает примерно в 14 раз медленнее, чем на ОГЛ =(. На директ3д пишу буквально пару дней, мож где накосячил).
Помогите, пожалуйста! )

#1
17:06, 3 янв 2007

drv47
Попробуй вместо создания одной lockable RT surface сделать одну нелокабельную RT в видеопамяти и одну поверхность с D3DPOOL_SYSTEMMEM, без D3DUSAGE_RENDERTARGET и с теми же размерами и пиксель-форматом. Для забирания данных можно будет использовать IDirect3DDevice9::GetRenderTargetData(), а для непосредственного доступа - локать поверхность в системной памяти.

>surface.lockRect(r1,@r,D3DLOCK_READONLY);
>// СорyMemory из R1.pbits в ОЗУ.
>Surface.UnLock.

Вот тут немного не так понимаешь, что происходит. Само копирование из видеопамяти в ОЗУ выполняется во время вызова LockRect() в область, специально отведенную драйвером и/или директом. CopyMemory просто копирует данные из одной области памяти в другую.

#2
17:26, 3 янв 2007

Wraith
Спасибо, попробую!

======================================================================================
Вот тут немного не так понимаешь, что происходит. Само копирование из видеопамяти в ОЗУ выполняется во время вызова LockRect() в область, специально отведенную драйвером и/или директом. CopyMemory просто копирует данные из одной области памяти в другую.
======================================================================================

Хм.. Когда я убираю CopyMemory, и просто по таймеру лочу/анлочу поверхность, то работает очень быстро. Но стоит попытаться скопировать эту выделенную память в свой буфер как происходят тормоза =(  Отсюда, я сделал вывод, что происходит не копирование в буфер в оперативку, а MemoryMapping из железа.
Сделал:
surface.lockRect(r1,@r,D3DLOCK_READONLY);
Surface.UnLock.
СорyMemory из R1.pbits в ОЗУ.

- Все равно такие же тормоза. А если убрать Copymemory то тормозов нету =(

#3
17:41, 3 янв 2007

Wraith
Спасибо тебе огромное! =)
Проблема решена. Сделал как ты говорил - через 2 поверхности.

ПрограммированиеФорумГрафика

Тема в архиве.