Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизGDIsurface Найти похожие ветки
← →
miek © (2004-02-26 19:08) [0]Архи-важный вопрос! Свойство DirectDraw.GDISurface - возвращает поверхность, находящуюся в видеопамяти, или собственный фрейм-буфер Windows (в системной памяти)?
← →
Sapersky © (2004-02-27 11:45) [1]Какое ещё GDISurface? Да ещё свойство (у COM-интерфейса)?
Есть метод FliptoGDISurface - в полноэкранном режиме он переключает (делает Flip) на первый буфер (первичную поверхность), чтобы GDI, который не имеет об этой буферизации представления, рисовал окна куда надо. Т.е. используется для вывода окон в полноэкранном режиме - например, диалога ввода пароля в скринсейвере.
Вообще тут недавно в "играх" была ссылка на книгу С.Трухильо - см. туда.
← →
miek © (2004-02-27 17:08) [2]Метод GetGDISurface, а я имел в виду не совсем интерфейс, а уже обертку DDRaw.pas, что почти одно и то же.
То есть, GDI точно не имеет своего фрейм-буфера?
← →
Sapersky © (2004-02-28 18:31) [3]Про тот, что в системной памяти (если он есть) - не знаю. Что касается видеопамяти, то здесь GDI и DirectDraw, видимо, используют один и тот же буфер - первичную поверхность.
В полноэкранном режиме ПП и бэкбуфер постоянно меняются местами, о чём GDI не знает. GetGDISurface возвращает ту поверхность, которую GDI считает первичной - хотя реально это может быть бэкбуфер, и тогда художеств GDI видно не будет. Но для предотвращения таких случаев проще воспользоваться FliptoGDISurface, так что зачем существует GetGDISurface - не очень-то понятно (работает она именно так, проверял). Чтобы можно было нарисовать окно строго в заднем буфере (а вдруг понадобится :))?
← →
miek © (2004-02-28 23:22) [4]Жаль, а я уж было подумал, что GDI-ориентированные программы можно ускорить - взял себе указатель на фрейм-буфер и пиши в скан-линии напрямую.
← →
Petro (2004-03-02 10:01) [5]Обрисую ситуацию.
Пишет 2 программиста - П1 и П2.
П1 Создаёт плоскость DirectDraw через COM объект и получает интерфейс -=================================================
IDirectDrawSurface = interface(IUnknown)
["{6C14DB81-A733-11CE-A521-0020AF0BE560}"]
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface):
HRESULT; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HRESULT; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface;
const lpSrcRect: TRect; dwFlags: DWORD; lpDDBltFx: PDDBLTFX): // csc changed from const to pointer on last param
HRESULT; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HRESULT; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface;
const lpSrcRect: TRect; dwTrans: DWORD): HRESULT; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface): HRESULT; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: LPDDENUMSURFACESCALLBACK): HRESULT; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: LPDDENUMSURFACESCALLBACK): HRESULT; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface;
dwFlags: DWORD): HRESULT; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface): HRESULT; stdcall;
function GetBltStatus(dwFlags: DWORD): HRESULT; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps): HRESULT; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HRESULT;
stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HRESULT;
stdcall;
function GetDC(var lphDC: HDC): HRESULT; stdcall;
function GetFlipStatus(dwFlags: DWORD): HRESULT; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HRESULT; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HRESULT;
stdcall;
function GetPixelFormat(var lpDDPixelFormat: DDPIXELFORMAT): HRESULT;
stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc): HRESULT;
stdcall;
function Initialize(lpDD: IDirectDraw;
const lpDDSurfaceDesc: TDDSurfaceDesc): HRESULT; stdcall;
function IsLost: HRESULT; stdcall;
function Lock(lpDestRect: PRect; var lpDDSurfaceDesc: TDDSurfaceDesc;
dwFlags: DWORD; hEvent: THandle): HRESULT; stdcall;
function ReleaseDC(hDC: HDC): HRESULT; stdcall;
function Restore: HRESULT; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HRESULT; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey):
HRESULT; stdcall;
function SetOverlayPosition(lX, lY: Longint): HRESULT; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HRESULT; stdcall;
function Unlock(lpSurfaceData: Pointer): HRESULT; stdcall;
function UpdateOverlay(const lpSrcRect: TRect;
lpDDDestSurface: IDirectDrawSurface; const lpDestRect: TRect;
dwFlags: DWORD; const lpDDOverlayFx: DDOVERLAYFX ): HRESULT; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HRESULT; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface): HRESULT; stdcall;
end;
===================================
В интерфейсе есть GetDC, который он передаёт П2 для того, чтобы он в своём объекте (пусть это будет другой COM объект - СОМрисования).
-----------------------------------------------------
ЗЫ. На самом деле ещё сложнее. Рисовать надо в несколько слоёв - потоками. И поэтому создаются несколько плоскостей DirectX и рисуются в потоках. В промежутках - по частям они склеиваются в одну и показываются пользователю.
--------------------------------------------------------
П2 передаётся _HDC и чем он рисует? Тем же API на DC что я описал выше.
Чем ещё "ниже" можно рисовать на DC. Единственное - рисовать в память и выбрасыват на DC. Но неуверен, т.к. здесь DC (IDirectDrawSurface) тоже вероятно в памяти.
==============================
Чем ещё можно быстро рисовать ВЕКТОР на DC, полученной от Интерфейса DirectDraw?
Ускорит ли получение GetCompatibleDC и рисование на неё и затем выброс в _HDC?
Вся ветка моей темы в форуме на С++
http://www.dev.vitgroup.com/modules.php?op=modload&name=phpBB_14&file=index&action=viewtopic&topic=2166
← →
miek © (2004-03-03 19:25) [6]Я с этим делом разобрался немного, и теперь пишу так: создал вторичную
поверхность, залочил ее, получил указатель на память, разлочил и работаю с
ней напрямую как с обычным спрайтом, создав вокруг этого указателя регион
SpriteUtils-2. Когда уже надо отрисовать, делаю BltFast со вторичной поверхности
в первичку. Получается быстро, рисование примитивов получаю даром, но слегка глючно (пока).
← →
Sapersky © (2004-03-04 12:13) [7]залочил ее, получил указатель на память, разлочил и работаю с ней напрямую
C разлоченной? И работает? Разве что если в системной памяти - и то Win может её сдвинуть. Можно запретить PageLock/PageUnLock"ом - хотя это для DMA и вообще не рекомендуется (так написано в документации, сам не пробовал). Не проще ли лочить и рисовать? Или я неправильно понял?
← →
miek © (2004-03-04 19:14) [8]И работает!!! И самое интересное, что И ДОЛЖЕН РАБОТАТЬ! Недавно статью откопал, так просто прозрение настало. И НИЧЕГО винда сдвинуть не может, пока сурфейс в системной памяти лежит.
>Не проще ли лочить и рисовать? Или я неправильно понял
Да в принципе правильно, только я еще и разлочиваю перед рисованием, ибо нефиг.
← →
Sapersky © (2004-03-04 23:44) [9]"Нефиг" - аргумент довольно сомнительный :)
Насколько я понимаю, блиттинг, особенно из системной памяти - процесс не мгновенный. Равно как и заполнение поверхности при непосредственном доступе. Поэтому нужна синхронизация, чтобы одно не началось во время другого; этим и занимается Lock/Unlock. Вроде как критические секции и прочие синхронизаторы в multi-thread приложениях.
Хотя можно всё-таки ссылку на статью... интереса ради :)
← →
miek © (2004-03-05 16:54) [10]Статья лежит на gamedev.ru, ищется гуглем по строке
Daniel+Kastenholz
← →
Sapersky © (2004-03-05 17:33) [11]Это огрызок на форуме? Ну, посмотрел... как справедливо заметили там, статья старовата - 1999 год. ТОГДА оно, может, и было верным (когда видеокарты были в основном PCI и не умели аппаратный блит системная-видео). Сейчас же... впрочем, одна вещь не изменилась - DirectDraw действительно медленный. По сравнению c Direct3D :) (при большом кол-ве спрайтов и наличии ускорителя).
← →
miek © (2004-03-05 20:38) [12]Одна важная вещь там есть - если поверхность в системной памяти, то никто ее никуда без нас не передвинет. (Разве что поставить DONOTPERSIST)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c