Ik ben bezig met het ontwikkelen van een 3D-RPG-engine en tot nu toe verliep alles voorspoedig. Ik heb het spel in een Linux omgeving ontwikkeld en heb SDL gebruikt om het portable te houden, omdat ik het zowieso nog naar Windows moest porten. Dat porten heb ik nu dus gedaan, en het was gewoon een kwestie van re-compilen, en alles ging goed op één (zichtbaar) ding na.
Het programma draait prima in Windows (in de zin dat hij niet vast loopt), alleen alle tetures die ik gebruik worden helemaal NIET weergegeven, op de plek waar normaal een texture zou moeten zitten staat nu gewoon een lege, witte quad. Na een tijdje debuggen kwam ik er achter dat als de textures in de hoofd-thread ingeladen werden dat ze dan met glGenTextures 'namen' vanaf 1 aangewezen kregen en dat ze in de andere thread namen vanaf 49 aan gewezen kregen.
Op een of andere manier werkten de 49+ textures niet als ze gerenderd werden, maar de 1+ textures wel, dus als work-a-round heb ik alle textures nog los in de hoofdthread ingeladen, en daarna de 49+ textures vervangen door de andere textures. Alles zag er weer goed uit, maar dit kon natuurlijk niet de goede oplossing zijn, want mijn design hangt er van af dat de textures ingeladen worden vanuit een script, wat weer in die andere thread draait. Voor dit scripting systeem maak ik gebruik van GameMonkey.
Hierna ben ik wat verder gaan onderzoeken, met name met de OpenGL debugger 'gDEBugger'. Dit programma geeft me aan dat de fout wordt veroorzaakt door een thread die probeert te schrijven in een gebied waar hij niet mag schrijven:
Nu is mijn vraag: waarom mag ik dit soort dingen wél doen in Linux, maar waarom niet in Windows? als ik het in Linux onder Valgrind/GDB draai krijg ik helemaal geen fouten, en Windows-GDB zegt ook dat alles goed verloopt. Ook zou ik graag willen weten wàt ik precies verkeerd doe, en of iemand een oplossing heeft
Nu nog ff een verloop van mijn programma:
(het programma geeft een exception tijdens het opzetten van de 2e thread in Windows, maar tezij je het in gDEBugger draait loopt het niet vast, alles loopt gewoon door, maar dan met blanke textures)
Het programma draait prima in Windows (in de zin dat hij niet vast loopt), alleen alle tetures die ik gebruik worden helemaal NIET weergegeven, op de plek waar normaal een texture zou moeten zitten staat nu gewoon een lege, witte quad. Na een tijdje debuggen kwam ik er achter dat als de textures in de hoofd-thread ingeladen werden dat ze dan met glGenTextures 'namen' vanaf 1 aangewezen kregen en dat ze in de andere thread namen vanaf 49 aan gewezen kregen.
Op een of andere manier werkten de 49+ textures niet als ze gerenderd werden, maar de 1+ textures wel, dus als work-a-round heb ik alle textures nog los in de hoofdthread ingeladen, en daarna de 49+ textures vervangen door de andere textures. Alles zag er weer goed uit, maar dit kon natuurlijk niet de goede oplossing zijn, want mijn design hangt er van af dat de textures ingeladen worden vanuit een script, wat weer in die andere thread draait. Voor dit scripting systeem maak ik gebruik van GameMonkey.
Hierna ben ik wat verder gaan onderzoeken, met name met de OpenGL debugger 'gDEBugger'. Dit programma geeft me aan dat de fout wordt veroorzaakt door een thread die probeert te schrijven in een gebied waar hij niet mag schrijven:
code:
1
2
3
4
5
| Process event - Exception: Reason: Access violation Address: 0x4088af Details: The thread tried to read from or write to a virtual address to which it does not have access |
Nu is mijn vraag: waarom mag ik dit soort dingen wél doen in Linux, maar waarom niet in Windows? als ik het in Linux onder Valgrind/GDB draai krijg ik helemaal geen fouten, en Windows-GDB zegt ook dat alles goed verloopt. Ook zou ik graag willen weten wàt ik precies verkeerd doe, en of iemand een oplossing heeft
Nu nog ff een verloop van mijn programma:
code:
1
2
3
4
5
6
7
| -main() functie
-SDL wordt opgezet
-instantie van class word aangemaakt die instanties van (bijna) alle andere game-classen bevat
-nieuwe thread wordt opgezet, waar een GameMonkey-VM op loopt. Deze laadt een hoofdscipt
-In dit script worden interne functies aangeroepen om een level te laden, textures, collisision detection spul etc.
-dit script zelf raakt ook in een loop: hier worden game-gerelateerde dingen gedaan
-hier na beland hij in de main-loop: input etc en op het laatst worden alle textures naar het scherm gerenderd. |
(het programma geeft een exception tijdens het opzetten van de 2e thread in Windows, maar tezij je het in gDEBugger draait loopt het niet vast, alles loopt gewoon door, maar dan met blanke textures)