Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.025 c
1-1084176269
BillyJeans
2004-05-10 12:04
2004.05.23
как определить какая из клавиш мышки нажата над TMenuItem?


1-1083842513
Term
2004-05-06 15:21
2004.05.23
Хочу сделать в своей проге аналог панели задач


8-1074694574
alexey2004
2004-01-21 17:16
2004.05.23
OpenGL или DirectX?


7-1082133906
snoup
2004-04-16 20:45
2004.05.23
Poluchenie informacii o kontaktah iz Windows Address Book?


1-1084032791
SergeyM
2004-05-08 20:13
2004.05.23
String to Char





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский