Прямая запись в изображение на экране монитора.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Zhelezka, 7 ноя 2008.

  1. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    1)Что быстрее: SetDIBitsToDevice, CreateDIBitmap, StretchDIBits
    Мне кажется первый
    2)Где можно найти простейший пример на использование SetDIBitsToDevice, CreateDIBitmap, StretchDIBits
    3)
    Код (Text):
    1. int SetDIBitsToDevice(
    2.   __in  HDC hdc,
    3.   __in  int XDest,
    4.   __in  int YDest,
    5.   __in  DWORD dwWidth,
    6.   __in  DWORD dwHeight,
    7.   __in  int XSrc,
    8.   __in  int YSrc,
    9.   __in  UINT uStartScan, - что значит вот этот параметр
    10. (Номеp стpоки pазвеpтки DIB, соответствующей пеpвой стpоке pазвеpтки в Bits. - для меня это непонятно)
    11.   __in  UINT cScanLines, - что значит вот этот параметр
    12. (NumScans: Число стpок pазвеpтки DIB в Bits. - И это тоже непонятно)
    13.   __in  const VOID *lpvBits,
    14.   __in  const BITMAPINFO *lpbmi,
    15.   __in  UINT fuColorUse
    16. );
    *Мне важно только две вещи:
    1)Чтобы напрямую рисовать в BITMAP своими функциями
    2)Как можно выше скорость отрисовки на экран
    ...маштабирование и т. д. мне не нужно
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Zhelezka
    Когда-то тестил - SetDIBitsToDevice и StretchDIBits по скорости практически одинаковы (если не использовать масштабирование и преобразование глубины цвета). Более того копирование происходит аппаратно с минимальным участием процессора. Кстати преобразование глубины цвета алгоритм нетривиальный и имхо проще заюзать системную возможность, чем заморачиваться с небольшим ускорением за счёт его собственной реализации.
    А CreateDIBitmap конечно в твоём случае излишество, хотя и не принципиально.
    И не бойся экспериментировать с "загадочными параметрами" :)) Они означают возможность копировать не всё изображение сразу, а разбить его на "полосы" от uStartScan до cScanLines, это чтобы например в несколько заходов (кадров) уложиться в обратный ход луча по кадру или сделать "хитрую синхронизацию", например если знаешь, что сейчас луч на строке 237, то можно либо дождаться пока он пройдёт кадр до конца (не лучший вариант) а можно скопировать ту часть экрана которую он уже прошёл, а затем добить оставшуюся. Узнать положение луча можно через DX7 (в более старших интерфейсах другая модель доступа), впрочем для начала это не нужно - это только чтобы уменьшить мерцание при быстром движении картинки.
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Zhelezka
    Может быть glDrawPixels?
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    ГЫ
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'windows.inc'
    5.  
    6. section '' code readable writeable executable
    7. start:xor    esi,esi
    8.       invoke GetDC,esi
    9.       mov    edi,eax
    10.       invoke GetSystemMetrics,SM_CYSCREEN
    11.       mov    ebx,eax
    12.       invoke GetSystemMetrics,SM_CXSCREEN
    13.       invoke StretchBlt,edi,esi,esi,eax,ebx,edi,esi,esi,eax,ebx,NOTSRCCOPY
    14.       ret
    15.  
    16. section '' import data readable
    17.  
    18.   library user,'USER32.DLL',\
    19.           gdi,'GDI32.DLL'
    20.  
    21.   import user,\
    22.          GetSystemMetrics,'GetSystemMetrics',\
    23.          GetDC,'GetDC'
    24.  
    25.   import gdi,\
    26.          StretchBlt,'StretchBlt'
     
  5. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    delete...