Форум: "Media";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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 вся ветка
Форум: "Media";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c