[DirectDraw] IDirectDrawSurface::Flip i wielowątkowość

0

Mam w programie podwójnie buforowany IDirectDrawSurface (lpDDSPrimary i lpDDSBack). Główny wątek programu odpowiedzialny jest za Flip'owanie powierzchni timerem (interval=20 czyli mniej wiecej [raczej mniej niż wiecej ;)] 50 FPS ) obsługując WM_TIMER w pętli komunikatów.

Tworzonych jest również wiele wątków pobocznych, każdy z nich co jakiś krótki czas bedzie używać IDirectDrawSurface do rysowania czegośtam na lpDDSBack używając metody dostępu IDirectDrawSurface::GetDC.
GetDC zakłada lock na powierzchnie wchodząc w sekcje krytyczną Win16 lock (MSDN), a ilość wątków może być bardzo duża, zatem na lpDDSBack bedzie często założony lock.

I teraz nie wiem jak sie zachowa lpDDSPrimary->Flip w głównym wątku, gdy na lpDDSBack bedzie założony lock. Czy lock mu przeszkodzi w flip'owaniu ? Jeśli tak, to czy Flip z flagą DDFLIP_WAIT poczeka, aż lpDDSBack bedzie wolny ?
Chodzi mi o to czy częsty lock na lpDDSBack spowoduje spadek FPS, i jeśli tak, to jak sie przed tym uchronić ? Czy da sie uzyskać taki efekt, że gdy na lpDDSBack założony jest lock przez któryś z wąteków pobocznych, a wątek głowny chce wykonać Flip, to poczeka on aż lock zostanie zwolniony przez wątek poboczny i od razu uzyska dostep do lpDDSBack, po czym po wykonanym Flip'ie zezwoli na założenie lock'a kolejnemu czekającemu wątkowi ?

0

flaga mowi chyba sama za siebie jak bys ustawil DDFLIP_DONOTWAIT to by nie czekala tylko wykonywala operacje nie zawazajac na to czy wystapil blad czy nie jesli ustawisz DDFLIP_WAIT metoda bedzie probowala podmienic powierzchnie dopoki nie osiagnie sukcesu. Dwa stosuj lock jak najrzadziej poniewaz dosyc mocno wplywa na wydajnosc i powinno sie stosowac lock aby wszystko narysowac co ma byc narysowane i dopiero wtedy zwolnic dlatego rozwaz ze uzywanei go w wielu watkach nie jest az tak dobrym pomyslem w ogole co Ty robisz ze musisz go w watkach uzywac?
Nie korzystaj z WM_TIMER jako glownej petli poniewaz ma kiepska wydajnosc w grach sie takiego rozwiazania nie stosuje poczytaj sobie ten artykul na msdn stary ale przedstawione rozwiazanie gdzie umiescic glowna petle gry jest nadal stosowane: http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_dos2win.asp

BTW: co ma DirectDraw do C/C++?;]

0

Mój program przeprowadza pewną symulacje, tworząc wiele (np.300) obiektów posiadającyhc własne wpólrzedne i własny wątek, który jest odpowiedzialny za przemiesczczanie obiektu (zmiane współrzednych) i wyświetlenie pozycji (kropki o wpółrzednych obiektu). Ma ktoś jakiś pomysł na wyświetlanie tych kropek ?

0

ok no to niech bedzie ze te kropkoi beda przemieszczane w watkach ale po co masz dodatkoiwo w watkach je wyswietlac nie lepij to w glownej petli zrobic a w watkach tylko wspolrzedne modyfikowac?;] zauwaz ze w glownej petli zrobisdz to tylko raz za jednym zamachem przerysujesz wszystkie i lacznie tylko jeden lock bedziesz potrzebowal zawsze tez mozesz zastosowac mechanizm zeby przerysowtywal tylko te kropki ktore zmienily swoja pozycje

0

No tak [sciana] !!! A ja biedny sie męcze.
Nooo, teraz BltBatch i wszytko idzie jak trzeba.
Co do timera to było tylko tak na razie. Użyje QueryPerformanceCounter.

1 użytkowników online, w tym zalogowanych: 0, gości: 1