IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Tutoriel DirectX 11 : Mise en place de l'ossature du code de travail et première fenêtre


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut Tutoriel DirectX 11 : Mise en place de l'ossature du code de travail et première fenêtre
    Bonjour,

    La rubrique 2D/3D/Jeux a le plaisir de vous apporter le second tutoriel de la série de tutoriels sur DirectX 11.
    Ce second tutoriel va vous guider pas à pas dans la construction d'un code pour travailler. De plus, grâce à ce code, vous allez pouvoir ouvrir votre première fenêtre DirectX 11, première étape essentielle dans la construction d'une application 3D.


    Bonne lecture.


    La rubrique 2D/3D/Jeux recherche des traducteurs (anglais -> français) afin de continuer la traduction de cette série de tutoriels sur DirectX 11. Devenez une rock star en traduisant et offrant à la communauté les meilleurs tutoriels DirectX 11. Contactez-moi si vous êtes intéressé (par message privé ou à la suite de ce message).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut Sympa
    Bonjour.

    Bonne idée de traduire ces tutoriaux DX11, ils sont très complets et abordent de nombreux concepts 3D.

    Une petite coquille dans le tutorial ici je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Crée l'objet Input. Cet objet sera utilisé pour gérer la saisie au clavier par l'utilisateur.
        if(!m_Input)
        {
            return false;
        }
    On dirait qu'il manque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_Input = new InputClass();
    Il faut savoir que depuis VC7, si l'opérateur new échoue, une exception est levée. Donc ce code plantera lamentablement si l'allocation échoue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    System = new SystemClass;
        if(!System)
        {
            return 0;
        }
    Personnellement j'ai le choix de std::nothrow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    System = new (std::nothrow) SystemClass();
        if(!System)
        {
            return 0;
        }
    Avec std::nothrow, le compilateur encadrera l'appel à new avec un bloc try/catch.

    Après selon moi l'auteur n'est pas cohérent dans son texte et dans son code au niveau du C++ pur. Je ne vais pas tout détailler mais deux exemples :

    l'auteur dans le texte parle de pointeur NULL mais dans le code, on voit :

    Je tittille, mais avec :

    d'un coup d'oeil, je sais que m_Input est un pointeur. Avec un 0 au lieu de NULL, je peux penser que m_Input est une variable de type int. Cela peut aider dans de la revue de code, et c'est plus cohérent pour un pointeur. Et pour être encore plus cohérent, j'ajouterai un 'p' pour pointeur :

    Mais il est vrai que ce genre de détail, c'est surtout pour les personnes qui programment tous les jours.

    L'autre exemple, C'est le fait de ne pas libérer les ressources dans le destructeur, et donc de ne pas être "POO conforme" en prétextant un appel incertain à ExitThread(). Mais ExitThread() n'appelera ni le destructeur, ni Shutdown. Donc l'argument est fallacieux. La classe SystemClass est une très bonne candidate à un appel à Shutdown dans le destructeur.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    L'histoire du new, manquait bien et c'est corrigé.
    Pour le reste, notamment le std::nothrow, oui c'est vrai, mais cela peut aussi se configurer à travers les paramètres de Visual. Pour les pointeurs +1 pour la notation 'p' et l'utilisation de NULL.
    Pour le destructeur, il est à noter qu'il ne fait pas l'initialisation dans le constructeur non plus. Au final, on pourrait qualifier son code de C avec classes.

    Pour ExitThread, je pense qu'il parle du cas où, le programmeur pense que son objet sera détruit s'il quitte le thread avec ExitThread() (car la variable est locale, ou je ne sais pas quoi), du coup, il se dit, en donnant une méthode shutdown, je donne un moyen de faire un shutdown avant ExitThread(). Mais bon, personnellement, je ne défendrai pas à 100 % cet argument.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour LittleWhite.

    Citation Envoyé par LittleWhite Voir le message
    Pour le reste, notamment le std::nothrow, oui c'est vrai, mais cela peut aussi se configurer à travers les paramètres de Visual.
    Je ne savais pas, et l'auteur n'en parle. Pour un tutorial, cela peut permettre de ne pas noyer le débutant, ce qui est une bonne chose. Mais le préciser à un moment est aussi une bonne chose.

    Citation Envoyé par LittleWhite Voir le message
    Pour le destructeur, il est à noter qu'il ne fait pas l'initialisation dans le constructeur non plus. Au final, on pourrait qualifier son code de C avec classes.
    Il y a beaucoup de débat philosophique à ce sujet, personnellement l'adage "Keep it simple" me va bien. Un code C++ trop spécialisé demandera des "spécialistes". Un code simple, même qualifié de "C avec classes" permettra à beaucoup de personnes de se l'approprier.

    Je suis contre les initialisations dans le constructeur qui peuvent échouées, tout cela pour ne pas avoir à gérer une classe partiellement construite. Et les fonctions d'initialisation n'ont aucune influence sur la POO conformité. Lorsque le destructeur est appelé, il libèrera les ressources si nécessaire. La seul contrainte, l'utilisateur doit appeler des fonctions d'initialisation. Mais les fonctions d'initialisation qui échouent permettent de prendre une décision sans toucher à la construction de l'objet (l'objet est déjà construit et on en est certain).

    Citation Envoyé par LittleWhite Voir le message
    Pour ExitThread, je pense qu'il parle du cas où, le programmeur pense que son objet sera détruit s'il quitte le thread avec ExitThread() (car la variable est locale, ou je ne sais pas quoi), du coup, il se dit, en donnant une méthode shutdown, je donne un moyen de faire un shutdown avant ExitThread(). Mais bon, personnellement, je ne défendrai pas à 100 % cet argument.
    Il n'y a rien à défendre à ce sujet, la documentation est claire :

    ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.
    Le destructeur ne sera jamais appelé, alors une fonction membre comme shutdown, faudra m'expliquer...

    Ceci dit je trouve ces tutoriaux excellents pour les notions 3D, et je les conseille vivement pour se faire la main avec DX11.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Pour le ExitThread(), je disait que dans son code, il aura un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    renderer.Shutdown();
    ExitThread();
    Alors qu'avec un destructeur, il aurait pu avoir plus de mal (surtout si la variable n'est pas un pointeur (même si cela semble loin d'être le cas pour cet auteur ))
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Re.

    Citation Envoyé par LittleWhite Voir le message
    Pour le ExitThread(), je disait que dans son code, il aura un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    renderer.Shutdown();
    ExitThread();
    Oui et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(renderer){
      delete renderer;
      renderer = NULL;
    }
    ExitThread();
    C'est la même chose...

    Le rendrer est un pointeur, aucun doute sur le code de base.

    En plus c'est foireux de Shutdown le renderer avant ExitThread, alors que le renderer est utilisé par le thread en question...

    EDIT :

    je commence à comprendre l'approche. C'est pas mal, mais deux choses.

    Un, il faut des sections critiques pour que cela marche.
    deux, cela n'empêche pas d'appeler Shutdown dans le destructeur, même si c'est redondant dans la majorité des cas.

    PS:

    De toute façon un développeur qui utilise ExitThread(); dans son code, c'est soit un développeur qui a des choses à se reprocher..., soit un développeur qui sait ce qu'il fait...

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Merci pour la précision
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Points : 17
    Points
    17
    Par défaut Erreur C2440
    Bonjour,

    J'ai essayer de suivre ce tutoriel, cependant j'utilise la version visual Studio 2017, j'ai installé avec cet environnement le package directX donc celà devrait fonctionner sans avoir à faire de configurations.
    Je me trompe peut être car j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Gravité	Code	Description	Projet	Fichier	Ligne	État de la suppression
    Erreur	C2440	'='*: impossible de convertir de 'LPCWSTR' en 'LPCSTR'	Project3	d:\users\apwvo\downloads\dx11src02\dx11src02\systemclass.cpp	208
    J'ai recherché l'erreur sur internet mais je n'ai pas trouvé de solution à mon problème.
    Merci d'avance pour votre aide en espérant ne pas avoir posé une question déjà postée.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    LPCWSTR c'est un const wchar_t* et LPCSTR est un const char* donc comme l'indique l'erreur à un endroit tu espères enregistrer un const wchar_t* dans un const char*.
    Et je sais pas trop comment t'as pu ne pas trouver d'informations parce que c'est une des erreurs les plus communes et Google m'en retourne plusieurs milliers aisément.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse, j'ai surtout pas compris pourquoi il y avait une erreur de ce type alors que j'ai repris le code source laissé par l'auteur du tuto.
    Je ne vois pas pourquoi ça coince. Je ne pense pas qu'il ce soit trompé dans son code, le tuto serait-il trop vieux ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/04/2018, 16h29
  2. Réponses: 1
    Dernier message: 06/02/2014, 08h23
  3. Réponses: 3
    Dernier message: 23/09/2013, 18h30
  4. Tutoriel sur la mise en place d'une grammaire avec ANTLR
    Par Marco1982 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 19/07/2013, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo