Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1260988667
Дмитрий
2009-12-16 21:37
2010.02.14
Заполнение массива из графика


8-1202896327
XProger
2008-02-13 12:52
2010.02.14
FM синтезатор


1-1237192368
Kolan
2009-03-16 11:32
2010.02.14
Дополнение перечисления


2-1260801136
serhiyiv
2009-12-14 17:32
2010.02.14
FREE TBITMAP


4-1228932250
alextim
2008-12-10 21:04
2010.02.14
Ошибки страницы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский