Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 2008
-
4 juin 2004 à 19:06
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010
-
14 mars 2006 à 21:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 14 mars 2006 à 21:43
C'est Tesdud, pas Testud xD
Bartoune74
Messages postés2Date d'inscriptionjeudi 8 juillet 2004StatutMembreDernière intervention 8 juillet 2004 15 janv. 2006 à 19:52
Heu c'est pas pour dire mais je doute que tu soit réellement l'auteur de tes petits conseils. J'ai chez moi un livre : DirectX 9 de Laurent Testud (jme goure peut etre dans le nom :d) et ya un chapitre sur l'optimisation et c'est EXACTEMENT les meme conseil dans le meme ordre! Donc a part modifié un peu le vocabulaire et changer le nom des variables toi et tes potes de STI-A faut arreter de pomper ;)
bye !
PS: les droits d'auteurs c'est précieux
Kornferki
Messages postés17Date d'inscriptionjeudi 25 mars 2004StatutMembreDernière intervention 6 décembre 2004 16 juin 2004 à 15:21
Ne pourrais-tu pas écrire en francais, MasterShadows ?
Si vraiment ton "CPU travail rapidement" dès la deuxieme ligne de ton tutorial, je me demande comment ton programme peut fonctionner ?
C est pas si compliqué que cela d écrire correctement et cela fait tellement plaisir de lire du code commenté en bon francais de temps à autres. Vous avez encore le temps de le faire en 1ere.
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDernière intervention 7 octobre 2006 8 juin 2004 à 17:51
mouais chu pas trop convaincu par ce tuto...
deja pour les float c le compilateur qui fait les conversions que ce soit ecrit avec des f ou pas c juste une question de lisibilité et ca ne change en rien la vitesse d'execution de ton programme...
pour ce qui est des incrementations :
D3DXVECTOR3 vA, vB, vC; // allocation mémoire
vA = vB + vC;
// utilisation de l'operateur+ défini par la classe D3DXVECTOR3
// création variable temporaire pour la stocker résultat opération donc construction (sur la pile)
// utilisation du constructeur de recopie
// destruction variable temporaire
vA = vB;
// utilisation constructeur de recopie
vA += vC;
// utilisation operateur += de la classe D3DXVECTOR3
donc il ya bien gain de temps et de mémoire ram en utilisant les incrementeurs des classes et cela est vrai pour toute classe d'ou l'interet des incrementeurs... i++ est plus optimisé que i = i+1;
mais en arriver la devient ridicule... dans ce cas la autant faire ta routine en assembleur et l'incorporer à ton programme...
d'autant plus qu'une grande partie de l'optimisation vient du compilateur : faut utiliser les bons flags et avoir un bon compilateur :p
c souvent étonnant de voir le résultat code machine d'une source c (soit disant optimisée) et qui au final est tout pourri ou inversement (mais c moins frequent :p)
donc si tu geres mal ton compilo meme en voulant soi disant optimiser tu te retrouvera avec un code tout pourri...
principalement à retenir sur ce tuto :
- utiliser les incrémenteur natifs (moins d'erreur et plus rapide)
- n'utiliser pas de variables temporaires à tout va
- matez un peu les inline, define, register, static etc... ;)
passe a l'assembleur...............
voit pas l'interet de faire du c ou c++
en plus si tu touche un peu aux flags de ton compilateur il te le fera tout seul à la compilation...
++
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 201212 8 juin 2004 à 11:39
Je ne suis pas d'accord avec toi, Bombela, regarde dont le bouqin de Laurent Testud sur la programmation de jeux avec DirectX, à moins d'une erreur d'interprétation au niveau de ce que j'ai dit sur les float , je maintiens que tout ce que j'ai dit est bon
Bombela
Messages postés225Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention30 juillet 2008 6 juin 2004 à 20:21
"ECRIVEZ TOUJOURS : float x =0.0f; ET NON float x = 0.0;
LE COMPILATEUR DOIT EFFECTUER LES CONVERSIONS <=> CONSEQUENCE : PERTE DE TEMPS"
N'importe quoi ! C'est stoqué au moment de la compilation en binaire ! C'est la même chose ! C'est comme quand tu code :
"X 5*5" Après la compilation, y aura : "X 25".
Par contre, créer des variables dans une partie de code n'est pas plus rapide, du au fait que les variables sont allouées sur la pile. Y a même une mini perte de temps, a cause du code pour modifier le pointer de pile. Par contre, le programme prendra moins de place en mémoire.
@+
L'ASM, ça a du bon.
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 5 juin 2004 à 21:46
Et le programme a gagné en rapidité (3%) !
Thanks !
Faut que je retape toutes mes fonctions, j'ai du boulot !
Moralité:
Faire comme en assembleur, 1 ligne = 1 opération
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 5 juin 2004 à 13:01
Funto66 > Excellente precision.
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 5 juin 2004 à 11:59
Pas tout à fait d'accord avec ton :
void main()
{
toto(); // crée la variable
toto(); // ne fait rien puisque la variable est déjà créée
}
La variable n'est pas crée lors du 1er appel de toto() mais lors du lancement du prog, une variable static n'étant en fait qu'une variable "globale" mais visible uniquement dans une fonction.
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 5 juin 2004 à 11:50
Ok merci bigzooloo et Cyberboy2054 !
Mais ce qui m'étonne c'est que la variable ne soit pas dans le corps de la fonction.
En gros, quand le programme est lancé, la fonction est copiee dans la RAM et il n'y a qu'a reserver un espace mémoire pour la variable, ca évite d'avoir a allouer de la memoire et la desallouer sans arret...
Mais bon, c'est vrai que quand on a un double[1024*1024*1024] dans la fonction, vaut mieux pas que la fonction monopolise tout le temps la RAM. (dans ce cas, je fais un new .... delete de toutes facons)
Si j'ai bien compris, mettre un static devant une variable accelere l'execution de la fonction.
Et si on met un "register" devant le nom de variable, s'il reste des registres libres, il n'y a pas besoin d'allouer de memoire, mais si il n'y a plus de registres libres, est-ce exactement comme si on n'avait pas mit de "register" ?
bigzooloo
Messages postés36Date d'inscriptionjeudi 16 mai 2002StatutMembreDernière intervention 6 octobre 2009 5 juin 2004 à 10:31
Pour répondre à Galmiza...
si tu veux déclarer des variables dans une foction et que cette MEME variable soit réutilisable dans le prochain appel de cette fonction (et tout au long du programme), il faut que tu la déclare en static.
exemple:
void toto()
{
static int a;
}
void main()
{
toto(); // crée la variable
toto(); // ne fait rien puisque la variable est déjà créée
}
voila, si ca peut te servir...
Cyberboy2054
Messages postés173Date d'inscriptionjeudi 20 décembre 2001StatutMembreDernière intervention22 août 2008 4 juin 2004 à 22:49
Vachement court le tuto ... Sinon g du mal a comprendre comment t arrive a généraliser le fait qu il faut des arbres et pas des listes pour les IA, chaque algo ayant des applications très spécifiques ...
Cyberboy2054
Messages postés173Date d'inscriptionjeudi 20 décembre 2001StatutMembreDernière intervention22 août 2008 4 juin 2004 à 22:43
Tu les déclare en début de prog et les détruit a la fin ...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 4 juin 2004 à 19:06
Quand on definit des variables a l'interieur d'une fonction, elles sont créées et detruites a chaque fois qu'on appelle la fonction ???
Et si on veut que ces variables soit créées au début du programme et détruites la fin, comment on fait ?
14 mars 2006 à 21:43
15 janv. 2006 à 19:52
bye !
PS: les droits d'auteurs c'est précieux
16 juin 2004 à 15:21
Si vraiment ton "CPU travail rapidement" dès la deuxieme ligne de ton tutorial, je me demande comment ton programme peut fonctionner ?
C est pas si compliqué que cela d écrire correctement et cela fait tellement plaisir de lire du code commenté en bon francais de temps à autres. Vous avez encore le temps de le faire en 1ere.
8 juin 2004 à 17:51
deja pour les float c le compilateur qui fait les conversions que ce soit ecrit avec des f ou pas c juste une question de lisibilité et ca ne change en rien la vitesse d'execution de ton programme...
pour ce qui est des incrementations :
D3DXVECTOR3 vA, vB, vC; // allocation mémoire
vA = vB + vC;
// utilisation de l'operateur+ défini par la classe D3DXVECTOR3
// création variable temporaire pour la stocker résultat opération donc construction (sur la pile)
// utilisation du constructeur de recopie
// destruction variable temporaire
vA = vB;
// utilisation constructeur de recopie
vA += vC;
// utilisation operateur += de la classe D3DXVECTOR3
donc il ya bien gain de temps et de mémoire ram en utilisant les incrementeurs des classes et cela est vrai pour toute classe d'ou l'interet des incrementeurs... i++ est plus optimisé que i = i+1;
mais en arriver la devient ridicule... dans ce cas la autant faire ta routine en assembleur et l'incorporer à ton programme...
d'autant plus qu'une grande partie de l'optimisation vient du compilateur : faut utiliser les bons flags et avoir un bon compilateur :p
c souvent étonnant de voir le résultat code machine d'une source c (soit disant optimisée) et qui au final est tout pourri ou inversement (mais c moins frequent :p)
donc si tu geres mal ton compilo meme en voulant soi disant optimiser tu te retrouvera avec un code tout pourri...
principalement à retenir sur ce tuto :
- utiliser les incrémenteur natifs (moins d'erreur et plus rapide)
- n'utiliser pas de variables temporaires à tout va
- matez un peu les inline, define, register, static etc... ;)
faire ca c ridicule :
a=longueur_bielle;
a-=l;
a*=raideur_ressort;
b=amortissement;
b*=prod_scal;
b*=l_inv;
a-=b;
pBielle->effort_interne=a;
passe a l'assembleur...............
voit pas l'interet de faire du c ou c++
en plus si tu touche un peu aux flags de ton compilateur il te le fera tout seul à la compilation...
++
8 juin 2004 à 11:39
6 juin 2004 à 20:21
LE COMPILATEUR DOIT EFFECTUER LES CONVERSIONS <=> CONSEQUENCE : PERTE DE TEMPS"
N'importe quoi ! C'est stoqué au moment de la compilation en binaire ! C'est la même chose ! C'est comme quand tu code :
"X 5*5" Après la compilation, y aura : "X 25".
Par contre, créer des variables dans une partie de code n'est pas plus rapide, du au fait que les variables sont allouées sur la pile. Y a même une mini perte de temps, a cause du code pour modifier le pointer de pile. Par contre, le programme prendra moins de place en mémoire.
@+
L'ASM, ça a du bon.
5 juin 2004 à 21:46
J'ai remplacé:
pBielle->effort_interne= raideur_ressort*(longueur_bielle-l)
- amortissement*prod_scal*l_inv;
par:
a=longueur_bielle;
a-=l;
a*=raideur_ressort;
b=amortissement;
b*=prod_scal;
b*=l_inv;
a-=b;
pBielle->effort_interne=a;
(a et b etant deja definis car utilisé apres)
Et le programme a gagné en rapidité (3%) !
Thanks !
Faut que je retape toutes mes fonctions, j'ai du boulot !
Moralité:
Faire comme en assembleur, 1 ligne = 1 opération
5 juin 2004 à 13:01
5 juin 2004 à 11:59
void main()
{
toto(); // crée la variable
toto(); // ne fait rien puisque la variable est déjà créée
}
La variable n'est pas crée lors du 1er appel de toto() mais lors du lancement du prog, une variable static n'étant en fait qu'une variable "globale" mais visible uniquement dans une fonction.
5 juin 2004 à 11:50
Mais ce qui m'étonne c'est que la variable ne soit pas dans le corps de la fonction.
En gros, quand le programme est lancé, la fonction est copiee dans la RAM et il n'y a qu'a reserver un espace mémoire pour la variable, ca évite d'avoir a allouer de la memoire et la desallouer sans arret...
Mais bon, c'est vrai que quand on a un double[1024*1024*1024] dans la fonction, vaut mieux pas que la fonction monopolise tout le temps la RAM. (dans ce cas, je fais un new .... delete de toutes facons)
Si j'ai bien compris, mettre un static devant une variable accelere l'execution de la fonction.
Et si on met un "register" devant le nom de variable, s'il reste des registres libres, il n'y a pas besoin d'allouer de memoire, mais si il n'y a plus de registres libres, est-ce exactement comme si on n'avait pas mit de "register" ?
5 juin 2004 à 10:31
si tu veux déclarer des variables dans une foction et que cette MEME variable soit réutilisable dans le prochain appel de cette fonction (et tout au long du programme), il faut que tu la déclare en static.
exemple:
void toto()
{
static int a;
}
void main()
{
toto(); // crée la variable
toto(); // ne fait rien puisque la variable est déjà créée
}
voila, si ca peut te servir...
4 juin 2004 à 22:49
4 juin 2004 à 22:43
4 juin 2004 à 19:06
Et si on veut que ces variables soit créées au début du programme et détruites la fin, comment on fait ?