Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с back буфером в direct3d


SSW ©   (2008-02-12 20:48:00) 

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

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

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

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


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

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


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

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


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

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


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

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


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

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

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


SSW   (2008-02-13 13:58:00) [6]

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


Sapersky   (2008-02-13 13:42:00) [7]

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


SSW   (2008-02-13 13:39:00) [8]

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


Sapersky   (2008-02-13 13:32:00) [9]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо