Ik heb nog niet erg veel ervaring met DirectX, maar ben momenteel aan de hand van DirectX 9 in C++ een soort slideshow programmaatje aan het proberen schrijven.
De reden om het in DirectX te doen is zodat er van de hardware gebruik kan gemaakt worden voor transparantie-effecten, en misschien later experimenteren met pixel shaders of iets dergelijks.
Het is me op dit moment gelukt om een jpg in te laden als texture (tegenwoordig blijken grote textures en groottes die geen macht van 2 zijn geen probleem meer te zijn) en ze te tonen en transparantie toe te passen om tussen de foto's te faden.
Ook de kwaliteit heb ik door mipmap's te genereren en filters in te stellen goed gekregen.
Mijn probleem zit 'm op dit moment in het inladen van nieuwe foto's terwijl een animatie op de vorige foto eventueel nog bezig is.
Dit in dezelfde thread doen als het renderen zorgt voor een vrij grote pauze van enkele seconden.
Ik heb dus geprobeerd om het laden in een 2de thread the doen. Op het eerste zicht leek dit vrij goed te gaan, maar er zijn nog 2 probleempjes aan.
Ten eerste loopt die thread soms vast, ik denk in de functie D3DXCreateTextureFromFileEx. Ik heb niet kunnen vinden of deze functies al dan niet thread-safe zijn, dus mogelijk is de reden hiervan dat tegelijkertijd de andere thread bezig was met het renderen.
Het tweede probleem is dat ondanks dat deze functie gebeurd in een andere thread, er na het laden alsnog een korte pauze optreed.
Door met MessageBox'en een aantal breaks te plaatsen, ben ik er achter gekomen dat deze pauze optreed op het moment dat de pauze optreed op het moment dat de nieuwe texture voor de eerste keer geselecteerd word om te tekenen.
Door naar het geheugengebruik van mijn programma te kijken, vond ik ook dat er nadat de texture geladen was vrij veel geheugen gebruikt werd, maar het moment daarna, wanneer de texture getekend werd het geheugengebruik sterk daalde.
Ik vermoed dus dat D3DXCreateTextureFromFileEx het bestand laad, decompresseert en de mipmap's aanmaakt in het gewone geheugen, en dat pas op het moment van het eerste gebruik van de texture verplaatst word naar het videogeheugen.
Ik heb al geprobeerd om ook dat eerste tekenen eens te doen in de 2de thread, maar daar leek het geen effect te hebben, en de pauze bleef dus zichtbaar.
Heeft iemand misschien een idee hoe ik dit zou kunnen oplossen?
De reden om het in DirectX te doen is zodat er van de hardware gebruik kan gemaakt worden voor transparantie-effecten, en misschien later experimenteren met pixel shaders of iets dergelijks.
Het is me op dit moment gelukt om een jpg in te laden als texture (tegenwoordig blijken grote textures en groottes die geen macht van 2 zijn geen probleem meer te zijn) en ze te tonen en transparantie toe te passen om tussen de foto's te faden.
Ook de kwaliteit heb ik door mipmap's te genereren en filters in te stellen goed gekregen.
Mijn probleem zit 'm op dit moment in het inladen van nieuwe foto's terwijl een animatie op de vorige foto eventueel nog bezig is.
Dit in dezelfde thread doen als het renderen zorgt voor een vrij grote pauze van enkele seconden.
Ik heb dus geprobeerd om het laden in een 2de thread the doen. Op het eerste zicht leek dit vrij goed te gaan, maar er zijn nog 2 probleempjes aan.
Ten eerste loopt die thread soms vast, ik denk in de functie D3DXCreateTextureFromFileEx. Ik heb niet kunnen vinden of deze functies al dan niet thread-safe zijn, dus mogelijk is de reden hiervan dat tegelijkertijd de andere thread bezig was met het renderen.
Het tweede probleem is dat ondanks dat deze functie gebeurd in een andere thread, er na het laden alsnog een korte pauze optreed.
Door met MessageBox'en een aantal breaks te plaatsen, ben ik er achter gekomen dat deze pauze optreed op het moment dat de pauze optreed op het moment dat de nieuwe texture voor de eerste keer geselecteerd word om te tekenen.
Door naar het geheugengebruik van mijn programma te kijken, vond ik ook dat er nadat de texture geladen was vrij veel geheugen gebruikt werd, maar het moment daarna, wanneer de texture getekend werd het geheugengebruik sterk daalde.
Ik vermoed dus dat D3DXCreateTextureFromFileEx het bestand laad, decompresseert en de mipmap's aanmaakt in het gewone geheugen, en dat pas op het moment van het eerste gebruik van de texture verplaatst word naar het videogeheugen.
Ik heb al geprobeerd om ook dat eerste tekenen eens te doen in de 2de thread, maar daar leek het geen effect te hebben, en de pauze bleef dus zichtbaar.
Heeft iemand misschien een idee hoe ik dit zou kunnen oplossen?