Hej! Hur utför du trådningen? Eller snarare, vilken tråd ritar? Tack för boktipset!OpenGL, win32 och trådar
Jag håller på att skriva en rendreringsmotor i MS Visual C++. Jag har genererat en tråd som jag kallar gamepanel som tar ett nyligen öppnat fönster (HWND) som argument och skapar en GL-rendreringskontext. Därefter placerar sig tråden i en loop där den försöker hålla konstant UPS givet en variabel FPS. Problemet är nu att den enda respons jag får från OpenGL är när jag kör kommandot glClear(GL_COLOR_BUFFER_BIT). Alla glBegin(xx) ... glEnd() glFinish() verkar bli helt ignorerade.
Finns det någon som känner igen det här problemet? Kan det ha med trådningen att göra?Sv: OpenGL, win32 och trådar
Ett OpenGL-context kan bara vara current i en tråd åt gången (däremot så kan den skapas i en tråd och användas i en anna tråd).
Och hur har du gjort synkroniseringen med Windows-fönstret? Ritar du efter ett DRAW-meddelande eller ritar du litet när som helst?
Att låta en generell tråd som inte är GUI-tråden driva OpenGL kan nog vara svårt att få till (jag tror inte ens att det går) eftersom du ändå måste synkronisera med GUI-tråden vid ritning. Det är betydligt bättre att lägga beräkningar (datainläsningar, analyser, AI osv) i andra trådar och låta GUI-tråden styra uppdateringen (se dock tilll att du trådsäkrar access mot de datastrukturer som de andra trådarna använder).
Tips om bra bok : "3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics" (se http://www.adlibris.se/shop/product.asp?isbn=1558605932 ), bra bok som går igenom allt plus att du får komplett källkod för hela renderingsmotorn. Mycket bra inspirationskälla med bra motiveringar till designbeslut.
En sista fråga: varför gör du en egen motor? Om det är för hobbybruk så är det nog OK (utmärkt övning), men är det för kommersiellt bruk så kommer du förmodligen aldrig att tjäna in den investeringen. Använd Open Scene graph eller liknande istället.
/AndreasSv:OpenGL, win32 och trådar
Jag har lagt en SwapBuffers i samma tråd som tillverkar Rendering Context. Enligt vad jag läste så går det att ha flera parallella trådar som var och en har en DC som de själva har konstruerat. Det blir eventuellt lite odefinierat vilken ordning de skriver i dock.
Jag anropar swapbuffers enligt följande mall:
gameUpdate
gameRender
paintScreen (tvingande, swapbufffer, eller via meddelande till windows kernel)
Därefter mäter jag hur lång tid operationerna tog att utföra. Jag försöker få Updates Per Second (UPS) att vara konstant, samtidigt att jag försöker få _variabla_ Frames Per Second (FPS) att vara så nära en angiven övre konstant som möjligt.
Tråden gör en sleep i ett antal millisekunder för att kompensera för snabba värden på FPS och ett antal "FPS skips" för att kompensera för låga UPS.
Jag skriver en egen motor för att uppdatera mina c++-kunskaper som halkat efter lite, så min motor blir en kopia av ett projekt jag gjort tidigare i java. Motorn behöver inte bli ett kommerciellt gångbart API, men vara tillräckligt bra för att mina matematiska tricks framställs i god dager. ;-)
Dessutom behöver jag detaljkunskaper för att kunna applicera ideerna i slutna system som inte har förutsättningarna för Open Scene graph.
Jag gjorde ett experiment (fel) där jag la Render Context i en annan tråd och då fungerade inte glClear heller. Nu kan jag dock sätta bakgrundsfärg via glClear, men ändå inte rita något.