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

Delphi Discussion :

Apprendre à créer un jeu en 3D avec Delphi et FireMonkey, un tutoriel de Grégory Bersegeay


Sujet :

Delphi

  1. #21
    Futur Membre du Club
    Femme Profil pro
    dev
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bonjour

    J'ai tenté de modifier GlobalUseDXSoftware mais ça ne change rien.

    Ci joint une copie d'écran, a gauche dans l'EDI, a droite au runtime.

    Nom : Sans titre3.png
Affichages : 691
Taille : 176,0 Ko

  2. #22
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    Avez-vous fait le test avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FMX.Types.GlobalUseGPUCanvas:= True;
    ATTENTION, cette variable (Comme le GlobalUseDXSoftware d'ailleurs) est à mettre à jour dans le source du projet avant le : Application.Initialize

  3. #23
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Bonjour,

    Rien à voir avec le problème de couleur, mais dans cet exemple, on a 3 objets identiques (ou presque) : base, bordDroit et bordGauche...et bien il est tout à fait possible d'en remplacer deux par un TProxyObject

    le projet est facile à modifier pour ce faire:
    1) ouvrir le DFM en mode texte (Alt + F12)
    2) remplacer TCube par TProxyObject sur les objets bordDroit et bordGauche
    3) ouvrir le DFM comme une fiche (Alt + F12)
    4) valider les deux erreurs sur la propriété Material inexistante
    5) renseigner la propriété SourceObject des deux bords pour pointer sur Base

    on obtient exactement le même résultat, mais les deux bords sont dessinés par via l'objet "base" dont les dimensions et la position sont surchargées dynamiquement au moment du rendu.

    Bon ok, ça ne va pas révolutionner le projet vu que l'objet de base est des plus simple, mais cette technique est utilisable aussi avec des objets plus complexes (Mesh, Path, Model) qui gagnent à ne pas être copier/coller dans une scène.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #24
    Futur Membre du Club
    Femme Profil pro
    dev
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Bonjour Thierry,

    Merci de votre aide.

    C'était bien ça : il fallait modifier ces variables avant le Application.Initialize et non pas de le FormPrincipale.create ().
    La variable FMX.Types.GlobalUseGPUCanvas:= True;-> ca fait tout planter : notification = Le pilote d'affichage Intel Graphics Accelerator for Windows 8(R) ne répondait plus.
    en revanche le fmx.types.GlobalUseDXSoftware := True ; fonctionne très bien.

    Du coup questions subsidiaires

    Comment puis-je savoir si il faut mettre cette variable à True ?
    Sur certains postes l'appli fonctionne très bien sans cette ligne. Si je la mets tout le temps à True, est-ce que cela va dégrader les performances ?
    Est ce que des problèmes similaires ont été rencontrés sur d'autre plateformes (Android ou IOS) ?

    Chantal

  5. #25
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par chantal04 Voir le message
    Du coup questions subsidiaires

    Comment puis-je savoir si il faut mettre cette variable à True ?
    Sur certains postes l'appli fonctionne très bien sans cette ligne. Si je la mets tout le temps à True, est-ce que cela va dégrader les performances ?
    Est ce que des problèmes similaires ont été rencontrés sur d'autre plateformes (Android ou IOS) ?

    Chantal
    En fait :

    Mettre
    • Mettre FMX.Types.GlobalUseDirect2D à False va forcer l'utilisation de GDI+
    • Mettre FMX.Types.GlobalUseDX10Software à True va utiliser L’accélération logiciel (au lieu de Hardware) pour Direct2D (Et Direct3D)
    • Mettre FMX.Types.GlobalUseGPUCanvas à True va forcer l'utilisation du processeur graphique (GPU)


    Et en fait selon les choix des Canvas différents seront créés quand on fera du graphisme sur Firemonkey :

    • TCanvasGDIPlus > Unité : FMX.Canvas.GDIP
    • TCanvasD2D > Unité : FMX.Canvas.D2D
    • TCanvasGpu > Unité : FMX.Canvas.GPU


    Après si on regarde l'unité FMX.Canvas.D2D et la classe TCustomCanvasD2D on se rend compte qu'on a des propriétés :

    • Direct3DHardware
    • Direct3DSupport
    • Direct3DLevel



    Donc je me pencherai là dessus pour en savoir plus sur la config graphique dispo et donc pour déterminer quelles variables mettre à jour ou non.

    Attention cela concerne seulement Windows car sur Mac on utilise un Canvas Quartz : TCanvasQuartz, unité : FMX.Canvas.Mac

  6. #26
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Merci à Thierry pour ces réponses. Effectivement, la variable GlobalUseDXSoftware doit être positionnée dans le source du projet (c'était indiqué dans le post du forum Embarcadero que j'avais mis en lien ).
    En complément, sur Mac OS, Quartz est le moteur graphique 2D. Pour la 3D, Quartz s'appuie sur OpenGL.

    Merci à Paul également car je ne connaissais pas le TProxyObject. Du coup, j'ai une question : qu'elle est la meilleure méthode pour dupliquer des objets similaires ? Dans le projet, par exemple, je clone le TRoundCube nommé raquetteJoueur pour créer la raquette gérée par l'ordinateur. Est ce qu'en passant par un TProxyObject on y gagnerait quelque chose (performance, consommation mémoire...) ? L'inconvénient que je vois au TProxyObject, c'est que l'objet ne se voit pas quand il n'a pas le focus en mode conception dans l'IDE : difficile alors de positionner correctement la scène via l'éditeur graphique.

    Pour répondre à chantal04,
    - en activant le rendu logiciel de DirectX, il y a des chances que les performances soient dégradées. Ce n'est peut être pas sensible avec le projet de Pong car il est simple mais avec un projet plus complexe ça risque de se faire ressentir.
    - j'ai eu l'occasion de tester le projet Pong sur 4 périphériques Android (smartphones Galaxy S4 et S5, une tablette Archos 80b Helium et un smartphone Sony mais je ne me souviens plus du modèle) : les couleurs étaient bonnes à chaque fois. Je n'ai pas testé sur IOS car je n'ai pas d'appareil sous cet OS.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #27
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bonjour à toutes et à tous,

    J'ai le même problème que Chantal (normal, on travaille dans le même bureau, et on a la même config )

    Après lecture de cet article (Source), on a voulu réécrire/mettre à jour la code présent dans la page avec la dll DX11, puisque c'est maintenant le minimum requis pour Firemonkey.
    Les premiers retours de la fonction D3D11CreateDevice étaient bon, que ce soit avec le paramètre D3D_DRIVER_TYPE_HARDWARE ou D3D_DRIVER_TYPE_WARP.
    J'avais une seule différence, c'était au niveau du FeatureLevel : celui du Warp était plus élevé qu'en Hardware.

    on a donc essayé d'implémenter le code suivant afin de solutionner le problème, par contre, on ne sais pas si c'est vraiment la bonne méthode à appliquer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    program FMXPong;
     
    uses
      System.StartUpCopy,
      FMX.Forms,
      FMX.Types,
     
    {$IFDEF MSWINDOWS}
      System.Math,
      Winapi.Windows,
      Winapi.D3D11,
      Winapi.D3DCommon,
      FMX.Context.DX11,
    {$ENDIF}
     
      principale in 'principale.pas' {fPrincipale};
     
    var
      PrevFPUState: TArithmeticExceptionMask;
     
    {$R *.res}
     
    {$IFDEF MSWINDOWS}
     
    // *****************************************************************************
    // Copiée de la fonction du même nom dans FMX.Context.DX11. ***
     
    procedure SaveClearFPUState; inline;
    begin
      PrevFPUState:= GetExceptionMask;
      SetExceptionMask(exAllArithmeticExceptions);
    end;
     
    // *****************************************************************************
    // Copiée de la fonction du même nom dans FMX.Context.DX11. ***
     
    procedure RestoreFPUState; inline;
    begin
      SetExceptionMask(PrevFPUState);
    end;
     
    // *****************************************************************************
     
    procedure TryUseWARPCanvas;
    const
      FeatureLevels : array [0 .. 8] of D3D_FEATURE_LEVEL = (
        D3D_FEATURE_LEVEL_12_1,
        D3D_FEATURE_LEVEL_12_0,
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
        D3D_FEATURE_LEVEL_9_2,
        D3D_FEATURE_LEVEL_9_1
      );
     
    var
      DX11Library : THandle;
      vResultHardware, vResultWarp: Integer;
      // Variables output de la fonction D3D11CreateDevice. ***
      TestDevice : ID3D11Device;
      LD3DDeviceContext : ID3D11DeviceContext;
      vFeatureLevelHardware, vFeatureLevelWarp: D3D_FEATURE_LEVEL;
     
    begin
      // J'essaye de charger la dll de directX 11. ***
      DX11Library := LoadLibrary(winapi.D3D11.D3D11dll);
      if DX11Library <> 0 then
      begin
        try
          SaveClearFPUState; // copié de la fonction du même nom dans FMX.Context.DX11. ***
          try
            // Est-ce que la procédure "D3D11CreateDevice" est dispo dans la Dll ? ***
            if GetProcAddress(DX11Library, 'D3D11CreateDevice') <> nil then
            begin
              // Test sur le hardware. ***
              vResultHardware := D3D11CreateDevice(
                nil,
                D3D_DRIVER_TYPE_HARDWARE,
                0,
                D3D11_CREATE_DEVICE_BGRA_SUPPORT,
                @FeatureLevels,
                Length(FeatureLevels),
                D3D11_SDK_VERSION,
                TestDevice,
                vFeatureLevelHardware,
                LD3DDeviceContext
              );
              if (Succeeded(vResultHardware)) and (vFeatureLevelHardware < D3D_FEATURE_LEVEL_11_0) then
              begin
                // Test du "high-performance software rasterizer" (cf. msdn "D3D_DRIVER_TYPE enumeration"). ***
                vResultWarp := D3D11CreateDevice(
                  nil,
                  D3D_DRIVER_TYPE_WARP,
                  0,
                  D3D11_CREATE_DEVICE_BGRA_SUPPORT,
                  @FeatureLevels,
                  Length(FeatureLevels),
                  D3D11_SDK_VERSION,
                  TestDevice,
                  vFeatureLevelWarp,
                  LD3DDeviceContext
                );
                // Je regarde sur la FeatureLevel est plus élevée en Warp. ***
                if Succeeded(vResultWarp) and (vFeatureLevelWarp >= D3D_FEATURE_LEVEL_11_0) then
                begin
                  // C'est le cas, je force le flag "GlobalUseDXSoftware". ***
                  GlobalUseDXSoftware := True ;
                end;
              end;
            end;
          finally
            TestDevice := nil;
            RestoreFPUState; // copié de la fonction du même nom dans FMX.Context.DX11. ***
          end;
        finally
          FreeLibrary(DX11Library);
        end;
      end;
    end;
     
    // *****************************************************************************
     
    {$ENDIF}
     
    begin
     
    {$IFDEF MSWINDOWS}
      TryUseWARPCanvas;
    {$ENDIF}
     
      Application.Initialize;
      Application.CreateForm(TfPrincipale, fPrincipale);
      Application.Run;
    end.
    Est-ce qu'on a le droit de faire ça ?

    D'avance, un grand merci pour votre aide.
    Cordialement.

    Edit1:
    J'ai modifié le code en testant le FeatureLevel pour le 11.0 (c'est celui qui prend en charge le shader model 5, étant maintenant le minimum requis pour Firemonkey)
    Dans mes tests sur ma config, le hardware était en shader model 4 alors que le Warp était en 5.

  8. #28
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Merci pour ce retour détaillé et le lien très intéressant
    Je ne saurais vous dire si "on a le droit de faire ça". Mais je pense qu'à défaut d'une autre solution, c'est un palliatif possible. Effectivement, Delphi Berlin utilise sous Windows DirectX 11 et le shader model 5 (http://docwiki.embarcadero.com/RADSt..._Prerequisites).

    D'après le message de Chantal, vous avez un cpu Intel Core i5-2400 (qui intègre un gpu Intel HD). D'après les specs de ce processeur, il ne sait gérer que le shader model 4.1 et DirectX 10.1 (http://www.cpu-world.com/CPUs/Core_i...300834106.html). C'est ce qui doit expliquer la nécessité de passer par le rendu logiciel pour avoir les bonnes couleurs mais du coup les performances s'en ressentent (peut être pas sur ce petit jeu de Pong qui n'est pas complexe mais sur un projet plus important...).
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #29
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    J'ai apporté de petites évolutions au jeu. Je laisse sur le site developpez la version en lien avec le tutoriel et j'invite celles et ceux qui souhaiteraient suivre (ou participer pourquoi pas ?) à son évolution à aller sur le repository GitHub : https://github.com/gbegreg/FMXPong

    Les nouveautés apportées sont :
    - légères modifications de l'ihm
    - ajout d'un menu "options" permettant de régler et de faire persister différents paramètres (vitesse du palet, niveau de l'IA, activation/désactivation de l'anticrénelage, activation/désactivation du gyroscope, niveau de sensibilité du gyroscope)
    - utilisation d'un TMotionSensor afin d'ajouter la possibilité de déplacer la raquette en bougeant le smartphone

    Prochaine évolution prévue : étudier les fonctionnalités de tethering (que je n'ai encore jamais eu l'occasion de manipuler) pour essayer de rendre le jeu jouable à deux joueurs sur deux appareils distincts...
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #30
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour celles et ceux qui souhaiteraient tester ce que donne le jeu sous Android et qui ne disposent pas de la partie mobile de Delphi, je viens de le mettre sur le Play Store de Google : https://play.google.com/store/apps/d...besoft.FMXPong.

    Le jeu ne nécessite aucune autorisation, aucune donnée n'est collectée, il est gratuit et sans pub
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/07/2016, 14h55
  2. Apprendre à créer un jeu de plateformes 2D avec Godot
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 24/03/2016, 21h55
  3. Créer une base de données avec Delphi
    Par louise70 dans le forum Bases de données
    Réponses: 6
    Dernier message: 07/05/2013, 12h01
  4. comment créer un client OPC (DCOM) avec delphi
    Par aladin95 dans le forum Automation
    Réponses: 3
    Dernier message: 18/12/2011, 17h56
  5. comment créer une base de donnée avec delphi
    Par innocent672 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/10/2010, 10h00

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