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.
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.
Bonjour,
Avez-vous fait le test avec :
ATTENTION, cette variable (Comme le GlobalUseDXSoftware d'ailleurs) est à mettre à jour dans le source du projet avant le : Application.Initialize
Code : Sélectionner tout - Visualiser dans une fenêtre à part FMX.Types.GlobalUseGPUCanvas:= True;
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.
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
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
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
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 :
Est-ce qu'on a le droit de faire ça ?
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.
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.
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
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
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager