Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.14;
Скачать: CL | DM;

Вниз

Проблема с back буфером в direct3d   Найти похожие ветки 

 
SSW   (2008-02-12 20:48) [0]

Необходимо сохранить содержимое back буфера в direct3d,
делаю так:

Device3D.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, Buf);
Buf.LockRect(R, NIL, 0);
{...сохранение буфера...}
Buf.UnlockRect;

Все работает, но возникают такие тонкости:
- копирование области из буфера в другую область памяти занимает 200-300 мс;
- таже самая операция на старом ноутбуке с интегрированной видеокартой занимает 100-150 мс.

А по идее копирование должно быть мгновенным...
Почему такое происходит и как от этого избавится?


 
SSW   (2008-02-13 06:15) [1]

Ну неужели никто ничего не подскажет???


 
Sapersky   (2008-02-13 13:32) [2]

Что значит "сохранить"? Просто запомнить для какого-нибудь спецэффекта или перегнать в системную память (GetBackBuffer именно это и делает) для сохранения?


 
SSW   (2008-02-13 13:39) [3]

Именно "перегнать" в системную память.
Копирование то происходит - только уж очень медленно


 
Sapersky   (2008-02-13 13:42) [4]

Это нормально.
Отчасти из-за того, что все видео-шины (особенно AGP) оптимизированы на передачу "туда", но не "обратно". Отчасти из-за тормознутости конкретно GetBackBuffer (по моему опыту, банальный BitBlt быстрее).


 
SSW   (2008-02-13 13:58) [5]

В DX9 сделать получилось через GetRenderTargetData (результат тотже, работает очень быстро, получается что шина здесь не причем), а в DX8.1 не получается - а надо именно в 8-ой версии сделать.


 
Sapersky   (2008-02-13 14:09) [6]

Очень быстро это конкретно сколько? Попробуй сравнить с BitBlt.
Кстати, относительно GetRenderTargetData MS пишет:
This method will fail if the render target is multisampled.

Насчёт других методов в DX8 не знаю. Есть ещё GetFrontBuffer, но она, насколько помню, такая же тормозная. Я в конечном итоге пришёл к использованию для таких вещей BitBlt.


 
SSW   (2008-02-13 14:18) [7]

GetFrontBuffer в DX8 тоже быстро работает, но возвращает буфер всего экрана, а не только окна.
А BitBlt из буфера Direct3D никак не сделать...


 
Sapersky   (2008-02-13 14:30) [8]

Handle окна разве неизвестен?


 
SSW   (2008-02-13 14:34) [9]

Дело в том, что во время работы программы, это окно частично перекрыто другими окнами, и если делать скриншот при помощи BitBlt, то окно будет не полностью сохранено.
А GetBackBuffer и GetRenderTargetData возвращают исходное изображение, т. е. не перекрытое другими окнами.


 
Sapersky   (2008-02-13 15:29) [10]

Можно попробовать выводить всё в дополнительный render target и делать GetFrontBuffer с него... хотя не знаю, может, всё равно будет копироваться экран. Или тормозить будет как GetBackBuffer.



Страницы: 1 вся ветка

Текущий архив: 2010.02.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1260441991
oldman
2009-12-10 13:46
2010.02.14
Я вирус поймал или система глючит или я не понимаю?


2-1260986848
Михаил Левшов
2009-12-16 21:07
2010.02.14
Как очистить все окошки редактирования на форме (TEdit)


1-1237819822
Marfusha
2009-03-23 17:50
2010.02.14
Запуск макроса OpenOffice из Delphi


2-1260723444
Дмитрий
2009-12-13 19:57
2010.02.14
Отображение информации из базы данных


15-1260309385
GanibalLector
2009-12-09 00:56
2010.02.14
PortMon