Конференция "Media" » Проблема с back буфером в direct3d
 
  • SSW (12.02.08 20:48) [0]
    Необходимо сохранить содержимое back буфера в direct3d,
    делаю так:

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

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

    А по идее копирование должно быть мгновенным...
    Почему такое происходит и как от этого избавится?
  • SSW (13.02.08 06:15) [1]
    Ну неужели никто ничего не подскажет???
  • Sapersky (13.02.08 13:32) [2]
    Что значит "сохранить"? Просто запомнить для какого-нибудь спецэффекта или перегнать в системную память (GetBackBuffer именно это и делает) для сохранения?
  • SSW (13.02.08 13:39) [3]
    Именно "перегнать" в системную память.
    Копирование то происходит - только уж очень медленно
  • Sapersky (13.02.08 13:42) [4]
    Это нормально.
    Отчасти из-за того, что все видео-шины (особенно AGP) оптимизированы на передачу "туда", но не "обратно". Отчасти из-за тормознутости конкретно GetBackBuffer (по моему опыту, банальный BitBlt быстрее).
  • SSW (13.02.08 13:58) [5]
    В DX9 сделать получилось через GetRenderTargetData (результат тотже, работает очень быстро, получается что шина здесь не причем), а в DX8.1 не получается - а надо именно в 8-ой версии сделать.
  • Sapersky (13.02.08 14:09) [6]
    Очень быстро это конкретно сколько? Попробуй сравнить с BitBlt.
    Кстати, относительно GetRenderTargetData MS пишет:
    This method will fail if the render target is multisampled.

    Насчёт других методов в DX8 не знаю. Есть ещё GetFrontBuffer, но она, насколько помню, такая же тормозная. Я в конечном итоге пришёл к использованию для таких вещей BitBlt.
  • SSW (13.02.08 14:18) [7]
    GetFrontBuffer в DX8 тоже быстро работает, но возвращает буфер всего экрана, а не только окна.
    А BitBlt из буфера Direct3D никак не сделать...
  • Sapersky (13.02.08 14:30) [8]
    Handle окна разве неизвестен?
  • SSW (13.02.08 14:34) [9]
    Дело в том, что во время работы программы, это окно частично перекрыто другими окнами, и если делать скриншот при помощи BitBlt, то окно будет не полностью сохранено.
    А GetBackBuffer и GetRenderTargetData возвращают исходное изображение, т. е. не перекрытое другими окнами.
  • Sapersky (13.02.08 15:29) [10]
    Можно попробовать выводить всё в дополнительный render target и делать GetFrontBuffer с него... хотя не знаю, может, всё равно будет копироваться экран. Или тормозить будет как GetBackBuffer.
 
Конференция "Media" » Проблема с back буфером в direct3d
Есть новые Нет новых   [134431   +14][b:0][p:0]