Comment faire une boucle d'affichage du rendu 3d ou 2d

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 602 fois - Téléchargée 14 fois

Contenu du snippet

Dans tous les programmes créant une scène graphique, il y'a la mise en place d'une boucle principale, qui tourne en permanence quelle que soit l'action de l'utilisateur. Mais si la fenêtre du rendu du graphique est réduite, ou masquée par un autre programme, il est inutile de continuer à la rafraîchir, puisque l'utilisateur ne la voit pas. Car dans ce cas, on prend des ressources qui seraient utiles aux autres programmes.
J'ai vu plusieurs procédés pour arrêter temporairement la boucle, en utilisant un timer, ou en paramétrant une pause avec la seule subroutine "sleep", ou carrément en stoppant la boucle de rendu pour la réinitialiser lorsque la fenêtre revient au premier plan.
le DoEvents lance le système dans une boucle à vide pour voir si un autre processus a besoin de ressources aussi. Mais dans le cas ou le jeu est en pause, le DoEvents s'exécute plusieurs milliers de fois par seconde, monopolisant aussi les ressources. D'où la mise en place d'un retard qui le fait s'exécuter une seule fois par seconde.
A terme, j'ai établi cette façon de gérer la boucle, pour rester simple.

Source / Exemple :


Public bActif As Boolean
' Cette variable va nous permette de rendre active la boucle et de déterminer
' si le programme exécute le rendu. ' Lancement du rendu dans le Sub form_load() par exemple:
'    bActif = True

Public Declare Function GetActiveWindow Lib "user32" () As Long
'Cette fonction donne le hWnd de la fenêtre actuellement active à l'écran. Si la fenêtre du jeu est différente 
'(elle est cachée), inutile de la rafraîchir pour économiser les ressources du système.

Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
'pause en milli-secondes

Sub Main()

	-----------------------------------------------------------------------------------------
	Ici mettre les opérations qui ne s'exécutent qu'une fois au bébut, comme Init3D(),
	remplissage des matrices, initialisation de la caméra ...
	-----------------------------------------------------------------------------------------

	Form1.Show	'présentation de la feuille

	' Ici, on met la boucle principale du jeu.

	While bActif

    	d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFF000000, 1#, 0 'on efface

	-----------------------------------------------------------------------------------------
	Ici mettre les calculs en temps réel, qui ne s'arrêtent pas même si la fenêtre n'est pas
	visible, et qui sont fonction du passage du temps dans le jeu.
	-----------------------------------------------------------------------------------------

If GetActiveWindow = FEtudeDX8.hWnd Then 'Ici on teste si notre fenetre est affichée
	'si la page n'est pas visible, inutile de la recalculer pour économiser les
	'ressources de l'ordinateur.
  
'- Création de la scène -
 
	d3dDevice.BeginScene

	-----------------------------------------------------------------------------------------
	mettre ici tout ce qui concerne le rendu comme d3dDevice.SetTexture
	-----------------------------------------------------------------------------------------
    	
	d3dDevice.EndScene
    
	'- On affiche la scène: -
	d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0  ' Equivaut la fonction Flip dans DirectX 7

Else
        'si la fenêtre n'est pas visible, pas de rendu.
	sleep (1000) 'retard 1 seconde
End If
          
        DoEvents    ' Le système va exécuter des tâches en attente... (Ne pas l'effacer sous peine de blocages...)
   
    Wend

        ' IMPORTANT : avant de fermer le programme, il faut absolument décharger
        '  les objets de la mémoire :
        
        Set d3d = Nothing       ' on décharge l'objet principal Direct3D
        Set d3dDevice = Nothing ' -- -------- ------- contenant le plan de la scène
        Set d3dVB = Nothing     ' -- -------- ------- stockant les vecteurs
        Set dx = Nothing        ' -- -------- ------- Direct X

    End     'on arrête le programme

End Sub

Conclusion :


Ainsi, on peut économiser les ressources au moment des rendus inutiles, tout en gardant l'écoulement du temps dans le jeu, que l'utilisateur regarde la fenêtre ou pas.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

au hasard je dirais que ton expérience du .net est quasi inexistante Dje_Jay ^^
Je te remercie de m'avoir fais sourire en fin de journée

Blague a part ... "le bon coté de la force" dépend du matériel que tu cible et du client, pas de la fausse bonne volonté d'un développeur qui crois que l’état de l'art est quelque chose de viable ou que ce soit

Méfie toi de ton ego quand tu lances des phrases pareilles un jour ça te retombera dessus

J'ai fait l'effort de ne pas citer de Techno disons spécifique mais juste ... 90% des existantes.
Je n'ai précisé aucun langage pour les utiliser. Je ne sais pas ou t'as été chercher cette idée de .Net (a mes yeux, la seule 3D viable en DotNet reste au Travers de XNA / WPF 3D, à condition de ne pas developpez un DeadSpace / Crysis / SC2 avec; bien qu'on puisse pas mal chargé l'application à l'heure actuelle)

maintenant vu qu'on est sur un site "Graphfr", je te propose DJE_DAY de nous faire pars de ton expérience de Jedi du "bon" coté de la force et de nous présenté un WorkFlow de ta boucle de rendu 3D ainsi que les explications de tes choix.
Threading, User Input, GUI, Shader Dynamique ...
Je ne demande qu'a apprendre je pense que tes futures explications me prouveront que j'ai tord, te permettant ainsi de pouvoir lire mes excuses.
Messages postés
58
Date d'inscription
mercredi 17 décembre 2003
Statut
Membre
Dernière intervention
16 février 2011
2
Effectivement VB6... Le problème avec $crosoft, c'est qu'un produit trop vieux n'est pas maintenu.(Bonjours failles de sécurités et autres bugs persistants / ou simplement l'installation sur les nouveaux OS -> CF: CAPICOM sur W7)...

Néanmoins, je suis d'accord avec Demalain concernant .NET... Je ne sais pas s'il est possible de compiler Natif avec VB.NET, mais ça me fait toujours marrer de voir un bête truc qui ouvre un fichier pour le lire qui prend presque 30Mb de mémoire...

Un conseil : Passes sous Gambas(ou mieux : C) et OpenGL ...
«Choisi le bon coté de la force Luke!»

Vade retro aux produits fermés!
Messages postés
5
Date d'inscription
jeudi 23 décembre 2010
Statut
Membre
Dernière intervention
2 octobre 2014

Bonjour Tebeco, oui, 11 ans de retard. Mais j'ai les critères suivants: je reste sous XP SP3. Donc maximum avec DirectX 9.0c. Ensuite VB. Pour moi, le .NET est un autre langage. Donc je reste sous VB6, avec DirectX 8.1 maximum. Comme je ne développe pas des jeux dernière mouture, ça suffit largement. Mais bien sûr, on peut être d'un avis différent. Peut-être plus tard je passerais aux dernières versions. Par contre pour l'algorithme de la boucle, il y'a d'autres procédés, mais celui-là semble convenir, non ?
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

d'ailleurs je rebondis sur ...
classé sous :
VB6 (11 ans de retard)
Dx8 ... (on est a la version 11 et sous Xp c'est du Dx 9.0c a la rigueur pour assuré un minimum de compatibilité et interop XNA / WPF / Direct2D / DirectWrite)

un poil déçu a la fois de troué un contenu vide qui aurait pu aider pas mal de gens ainsi que de m'apercevoir des techno utilisé
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

c'est moi ou y a ... rien ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.