2017-09-12 5 views
0

J'ai récemment commencé à apprendre la programmation DirectX en C++ et j'ai rencontré un problème mineur. Le fait est que mon exercice me demande de changer les couleurs d'une application DirectX de l'une à l'autre. J'ai une fonction qui fait que:Mettre un délai entre les images dans DirectX

void render_frame(void) 
{ 
    // start the random generator 
    srand(time(NULL)); 

    // clear the window to random color 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand() % 255, rand() % 255, rand() % 255), 1.0f, 0); 

    // begin/end/display scene 
    d3ddev->BeginScene(); 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

Il fonctionne, mais il est en fonction du temps de retard() et je me demande s'il y a une meilleure contrepartie dans la bibliothèque Direct3D. Par exemple, si je pouvais appeler cette fonction pour la couleur et un retard spécifique dans la chaîne comme ceci:

void render_frame_red(void); 
delay(1000); 
void render_frame_blue(void); 
delay(1000); 

Je sais que Sleep() fonction existe dans la bibliothèque standard, mais il gèle littéralement ma fenêtre d'application (je peux » t interagir avec lui pendant le délai). Peut-être que je peux régler le temps à différents tickrate afin qu'il se mette à jour aussi souvent que je le veux? Je sais que c'est une petite chose et je comprendrais probablement plus tard mon parcours avec la programmation 3D, mais cela ne me ferait pas de mal si j'en savais plus sur le fonctionnement de DirectX.

+0

N'appelez jamais srand() une seule fois dans un programme. –

+0

Oui, c'est mon mauvais. Je l'appelle habituellement au début de ma fonction main() (WinMain() dans ce cas). – RPAnimation

+0

@NeilButterworth En fait une fois dans un fil. Ou même utiliser ':: std :: random_device'. En ce qui concerne les questions, DirectX ne s'occupe pas du tout de l'heure. Toutes les fonctionnalités associées existent maintenant dans DXGI (voir [IDXGISwapChain] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb174569 (v = vs.85) .aspx)) et les temporisateurs système. – VTT

Répondre

0

Le modèle général de Direct3D est de rendre les trames "aussi vite que possible", puis les opérations basées sur le temps dans votre programme traitent de l'animation. Le dessin traditionnel de type GDI ne peint que sur demande, ce que vous pouvez faire avec Direct3D, mais cela rend les choses plus difficiles. En d'autres termes, utilisez l'horloge au lieu du nombre de trames pour contrôler l'animation et les effets. Pour une bonne solution de temporisation pour le rendu Direct3D, voir this blog post.

BTW, ne pas investir votre temps dans l'héritage d'apprentissage Direct3D 9 qui repose en grande partie sur le code de soutien du DirectX SDK et nécessite désapprouvée l'DirectSetup héritage à déployer la bibliothèque d'aide ancienne D3DX9 (voir MSDN). Utilisez DirectX 11. Voir DirectX Tool Kit.

+0

Quelle est la principale différence entre ces deux? Je sais que DirectX SDK n'est plus mis à jour, mais ne sont pas ceux basés sur les mêmes racines? (syntaxe, communication avec GPU, technologies etc.) Est-ce que les développeurs contemporains utilisent DirectX Tool Kit pour faire leurs jeux? Je sais que je pose des questions sans fondement, mais je dois être sûr avant de laisser tomber mes études de SDK obsolète. – RPAnimation

+0

@RPAnimation 'DirectX SDK' est mis à jour fréquemment, mais il fait partie de' Windows SDK'. Ce 'DirectX SDK 'séparé est un SDK hérité obsolète. 'DirectX Tool Kit' est un pack de bibliothèques de support pour simplifier le développement (et il est également mis à jour assez fréquemment). – VTT

+0

Il existe des dizaines de messages sur l'état du SDK DirectX sur mon blog sur différents sujets. Commencez avec le lien MSDN ci-dessus pour le contexte, puis regardez [le blog] (https://blogs.msdn.microsoft.com/chuckw/tag/dxsdk/). La plupart des développeurs de jeux utilisent soit un moteur de jeu existant (qui utilise DirectX 11/12), soit ils connaissent déjà suffisamment DirectX pour écrire leur propre moteur. J'ai indiqué _DirectX Tool Kit_ comme un moyen accessible d'apprendre DirectX 11 en C++ basé sur des bibliothèques open-source, supportées, qui évite l'utilisation du SDX DirectX obsolète. La plupart des autres tutoriels en ligne sont obsolètes à cet égard. –