begin process at 2010 02 10 14:12:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > ANIMATIONS [SCANLINE + ALGÈBRE]

ANIMATIONS [SCANLINE + ALGÈBRE]


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :animation, scanline, thread, rgb, flou Niveau :Initié Date de création :24/01/2009 Date de mise à jour :25/01/2009 20:47:51 Vu / téléchargé :2 305 / 450

Auteur : Bacterius

Ecrire un message privé
Commentaire sur cette source (75)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour,
alors voici, à l'approche des vacances de février, un petit programme pour effectuer une animation tout à fait basique, tout

simplement avec Scanline, et un petit peu d'algèbre (équations de droites, trigonométrie ...).
C'est tout bête : tout commence avec une boîte de dialogue débile - choisissez votre mode de qualité (Basse qualité sera plus rapide,

mais beaucoup de scintillements). Ensuite, choisissez votre résolution (commencez avec le plus petit, puis augmentez progressivement

- par exemple, pour moi, ça marche au top sur 128x128, moyen sur 256x256, et ça rame sur 512x512).
Ensuite, vous pourrez voir une belle animation (comme celles qu'on peut eventuellement voir dans les jukebox électroniques - comme dans Windows Media Player, avec la prévisualisation). Les couleurs changement progressivement, parcourent l'arc-en-ciel. Un effet de flou est constamment appliqué pour faire disparaître les animations et laisser la place à d'autres.

Voici la liste des animations :

- Cercle : bon ben un beau cercle qui fait toute l'image.
- Arc : un arc qui tourne progressivement autour de l'image - plus petit que le cercle, volontairement.
- Ligne tournante : une ligne qui effectue une rotation sur le centre de l'image.
- Ligne tournante bizarre : la même ligne, mais avec une accelération radiale (c'est-à-dire qu'elle bouge avec les angles en radians).

Pour l'instant il n'y a que ça, mais ça en jette déjà pas mal.

Comme je travaille avec Scanline, il m'est impossible d'utiliser Canvas.Ellipse pour dessiner les cercles, et LineTo pour les lignes.

J'ai donc dû me débrouiller avec mon tableau de pixels ...
Bon ben c'est simple : pour le cercle, on utilise les sinus et les cosinus, et pour la ligne, on utilise l'équation d'une droite !

Les tables de sinus et de cosinus sont déclarées en tant que constantes. Vous pouvez vous amuser à changer quelques valeurs dans le tableau (tout en conservant une copie, attention), ça fait marrant pour le cercle !

Le tout géré par un thread, avec affichage des FPS et possibilité de mettre en pause, et le dessin géré par un petit timer.

Voilà, j'espère que vous apprécierez :)

On peut obtenir des configurations très interessantes avec un peu de chance.

Ajout de l'unité DialogsEx de Cirec pour pouvoir faire une boîte décente pour la résolution et la haute qualité :)


 Conclusion

Tous commentaires, critiques, remarques, conseils, etc ... ici :)

Codé sous Delphi 6 Personal Edition !

Cordialement, Bacterius !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

24 janvier 2009 23:30:57 :
// Correction de la mise en page de la description + capture (bon 15 FPS c'est pas terrible, j'étais en 256x256 px).
24 janvier 2009 23:32:48 :
// Correction de la mise en page de la description + capture (bon 15 FPS c'est pas terrible, j'étais en 512x512) + quelques bugs dans le code.
25 janvier 2009 15:10:40 :
// Plusieurs modifications, voir les derniers commentaires.
25 janvier 2009 15:28:11 :
// Optimisation vite fait, je passe au reste de l'optimisation (cf. tutorial de Caribensila)
25 janvier 2009 20:47:52 :
// Retrait des tables trigonométriques en constante (mise en tableau variable).

 Sources du même auteur

Source avec Zip Source avec une capture UNITÉ DE SUPPORT VISTA
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION"
Source avec Zip Source avec une capture CONJECTURE DU CARRÉ DES FACTEURS
Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA
Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES

 Sources de la même categorie

Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA par Bacterius
Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture DÉFORMER UNE IMAGE AUX DIMENSIONS D'UN QUADRANGLE QUELCONQUE... par FFCAST
Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette
Source avec Zip Source avec une capture ÉCRAN DE VEILLE FEU D'ARTIFICE par barbichette

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture ANIMATION AVEC PNG par Bacterius
Source avec Zip Source avec une capture BONNE ANNEE ! par cantador
Source avec Zip Source avec une capture JEU DU REVERSO par Bacterius
Source avec Zip Source avec une capture DESSINE-MOI UNE ETOILE par cantador

Commentaires et avis

Commentaire de John Dogget le 25/01/2009 00:03:39 7/10

Avec DirectX, on atteindrait facilement les 500 FPS, mais çà je suppose que tous le monde le sait déjà :p

En tout cas, le code est archi-commenté, bravo => 7/10

Commentaire de blueperfect le 25/01/2009 00:51:23

>>John
DirectX c'est pas de la programmation, c'est de l'utilisation excessive de termes ésothériques malencontreusement non alignables, réservé aux élève de MathSpé...

>>Bactérius
Bonne idéee...je vais lire ça...Pour le tracé des lignes, j'ai idée que faire des gradients t'inspirerait...

Commentaire de Caribensila le 25/01/2009 02:00:31

@John
  Tu as raison. Mais DirectX et Delphi ne forme pas un couple idéal je trouve.

@BLUEPERFECT
  «des gradients» ?
Peux-tu nous expliquer, stp?

@Bacterius
Je suis déçu, je m'attendais à un truc en 3D...

Non, je plaisante!  :)))
Mais ça sent quand même l'optimisation à plein nez.
Je n'ai pas encore regardé de près, mais il faut bien commencer par un truc qui saute aux yeux:
ton tableau en cache pour les sinus/cosinus est une excellente pratique pour ce genre de truc, mais tu devrais regarder mon tuto :

http://www.delphifr.com/tutoriaux/TACTIQUES-OPTIMISATION-VITESSE-EXECUTION-CODE_755.aspx

... et surtout le commentaire très avisé de f0xi.

Sinon, on sent que tu fais des efforts pour ne pas poster de la m...
Et tu en es le 1er bénéficiaire.
Bravo !

Commentaire de Caribensila le 25/01/2009 02:07:17

... Je ne note pas encore car j'ai remarqué que tu finissais tes sources on-line  ;)

Commentaire de blueperfect le 25/01/2009 02:58:35

Les gradients sont une nouveauté de Windows XP... Une API leur est dédiée...faies une tour sur google...

Sinon le mieux est de les programmer soi-même :
Ce sont des variations du spectre lumineux basées sur 1 ou plusieurs couleurs...

A votre disposition pour étudier, et/ou améliorer un TPersistent de mon crû,que j'ai nommé TSpectre.... C'est une TStringList de TColor (ColorToString) et un éditeur de propriétés...et une collection de procédures de tracé de lignes/Cercles où l'on trace ces figures en ajoutant en paramètre un tableau de TColor, et une collection de fonctions de gestion des couleurs incluant :

* pour 1 couleur, on demande n valeurs TColor, de¨% sombre à % clair, et on renvoie le tableau de TColors correspondant...

* pour plusieurs couleurs, on demande n valeurs TColors comprises entre l'étalonnage de TColors passé en paramètre...

Concrêtement :

DrawGradientLine( MyBitmap.Canvas,
                  Point(10,10), Point(100,10),
                  [ clRed, clGreen, clYellow ]
                );

permets de tracer une ligne horizontale dont les couleurs varient du rouge au jaune, en passant par le vert...

Commentaire de blueperfect le 25/01/2009 03:02:10

En ce qui concerne ton  appli, j'ai eu un plantage en  sortie du programme, dû à une éxécution de Synchronize, alors que ton programme en était à FormDestroy....

Quand tu utilises un TThread, il faut le libérer sur OnQueryClose...sinon, il tourne sur des TCanvas qui sont libérés...

Commentaire de Nicolas___ le 25/01/2009 12:14:01

---------------------------
Animation
---------------------------
Violation d'accès à l'adresse 00401E78 dans le module 'AnimTest.exe'. Ecriture de l'adresse 00E40004.
---------------------------
OK  
---------------------------

J'ai ce gentil petit message en quittant ton appli en 512x512 ...
Pas encore regardé le code ...

Commentaire de Bacterius le 25/01/2009 12:52:51

@John Dogget, Caribensila et Cirec : Merci oui je vais optimiser tout ça ... online ^^ et je vais voir le tuto (même si je l'ai déjà vu, mais j'ai dû rater un truc dessus).

@Blueperfect : oui mais là j'utilise un tableau de pixels, donc pour dessiner sur le canevas c'est niet. Sinon merci pour le conseil du OnQueryClose, je vais voir ça.

@Nicolas : ouais je vais arranger ça, ca arrive de temps à autres :/

Cordialement, Bacterius !

Commentaire de cirec le 25/01/2009 12:57:50 administrateur CS

Salut,
j'ai pas encore testé.
mais juste pour info en ce qui concerne les Gradients :
http://www.delphifr.com/codes/DEGRADE-MULTICOULEURS-AVEC-API-WINDOWS_35784.aspx

@+

Commentaire de Bacterius le 25/01/2009 13:05:40

Ah mince Cirec je croyais avoir vu un commentaire de toi avant mon post.
Donc, merci Cirec maintenant ^^, et puis le lien peut servir, je mets en favoris.

Cordialement, Bacterius !

Commentaire de fredelem le 25/01/2009 13:10:11

   Une question un peu naïve: pourquoi cette table des sinus et cette table des cosinus ? Pourquoi n'avoir pas utilisé les fonctions sin() et cos()

Commentaire de Bacterius le 25/01/2009 13:24:25

Parce que ces fonctions nécessitent des calculs importants du CPU, et comme elles ne changent jamais, autant les mettre en constante comme cela, aucun calcul n'est nécessaire. Graçe à ça, tu passes de 12 FPS à plus de 300 FPS. Voilà :)

Cordialement, Bacterius !

Commentaire de blueperfect le 25/01/2009 13:27:46

Ta table des SInCos, tu peux pas la précalculer dans un DynArray sur OnCreate ?

Commentaire de Bacterius le 25/01/2009 13:49:29

Je crois que l'accès à une constante est plus rapide que l'accès à une variable non ?

case MyQuestion of
False: DynArray;
True: Nothing;
end;

^^

Cordialement, Bacterius !

Commentaire de Nicolas___ le 25/01/2009 13:53:54

Dis , testes chez toi : Basse qualité , réso 128x128 (non)

Ça te fait : Surprise mais je plante :)

Commentaire de cirec le 25/01/2009 13:59:02 administrateur CS

bon j'ai testé et regardé (un peut le code).

tout comme FREDELEM pourquoi ces tableaux de Sinus et Cosinus.

tu pouvais les créer directement au lancement du programme  voir un exemple ici:
http://www.delphifr.com/codes/ROTATION-RAPIDE-BITMAP-360-PUR-GDI_45850.aspx

ensuite certaines de tes méthodes on plutôt tendance à ralentir l'exécution que l'accélérer. Quand on fait de l'animation en GDI il est souvent préférable d'avoir du code répétitif dans une même procédure que de regrouper les codes qui se répètent dans une procédure externe et y faire appel (les temps d'exécutions s'y ressentent).
Ton doubleBuffered n'est pas utile dans ce cas de figure.
Tu dessines dans un BMP pour au final l'afficher dans ton TImage ... c'est le principe du DoubleBuffered. ce que tu fais s'appel un TripleBuffered ^^

Le TImage consomme aussi des cycles inutiles .. tu pouvais afficher le résultat directement sur le canvas de la fiche.

et pour finir ta MessageBox avec le choix de la taille:
---------------------------
Confirmation
---------------------------
Quelle résolution ?

Cliquez sur OK pour une résolution de 512x512.
Cliquez sur Oui pour une résolution de 256x256.
Cliquez sur Non pour une résolution de 128x128.
Ne quittez pas la boîte de dialogue.

---------------------------
Oui   Non   OK  
---------------------------

fait un peut "pitié" quand même ... lol
pour faire ça:
http://www.delphifr.com/gdi/c/34243.cs.jpg
regarde là:
http://www.delphifr.com/codes/MESSAGEDLG-AVEC-CHECKBOX-BOUTONS-PERSO-ICONE-PERSO_34243.aspx

ah oui : je suis pas certain que ceci amène réellement un gain: "asm INC BlurInc end;"

sinon le résultat est pas mal et le code est bien commenté ++
Bravo

Commentaire de Bacterius le 25/01/2009 14:00:31

Tu veux mes FPS ? (chez moi ça ne plante pas, mais je n'ai pas encore posté le code arrange).
En fait, ton ordi va tellement vite qu'il passe à tous les coups sur un appel à une variable détruite avec le thread ! héhé >-)

Sinon, dites-moi vos FPS ;)

128x128 = 63 FPS (bon hier je faisais du 219 FPS, je ne comprends pas ...).
256x256 = 43 FPS
512x512 = 12 FPS -_-'

Cordialement, Bacterius !

Commentaire de blueperfect le 25/01/2009 14:01:40

Ce qui n'est pas normal dans ton cas, ce n'est pas l'accès à une variable ou à une constante, mais le fait de devoir compter sur cet écart pour arriver à la bonne performance...

D'ailleurs, dans ton code, je ne vois pas ce qui prends autant de temps...

Peut être devrais-tu changer la phase de dessin en suppriment l'appel à draw dans ton thread, et en la plaçant dans un TTimer de ta TForm à 25ms (40 affichages par secondes)...

Cordialement...

Commentaire de Bacterius le 25/01/2009 14:01:41

Ah Cirec on s'est téléscopé.
Je regarde ton post, j'arrange tout ça et c'est parti.
Donc les tables dynamiques trigonométriques sont plus rapides que les constantes ?

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 14:02:15

Arg BluePerfect tu m'as encore téléscopé -_-'

Je prends note pour le timer.

Cordialement, Bacterius !

Commentaire de cirec le 25/01/2009 14:03:00 administrateur CS

ps: j'ai testé tous les modes Haute & Basse résolutions
et je n'ai eu aucun plantage !!!

Commentaire de Bacterius le 25/01/2009 14:04:24

Bravo Blueperfect pour l'idée du timer ! Le résultat est plus fluide, et en plus je passe à 333 FPS en 128x128.
En revanche ... opération de pointeur incorrecte sur toutes les res. ^^' à la fermeture.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 14:17:55

Victoire !
En fait l'opération de pointeur incorrecte était générée par la tentative de dessin dans le composant TImage (libéré avant la fiche).
Je dessine sur la fiche et ça marche nikel (ça m'évite même le bidouillage avec le TBitmap temporaire dans le Create).
Maintenant que j'ai éradiqué cette erreur, je vais voir le messagebox personnalisé (j'en ai besoin :x), et j'arrange tous les autres petits trucs.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 14:37:34

J'ai un problème avec ton unité DialogEx, Cirec. Un gros même.

Alors, avec le MessageDlg classique :

case MessageDlg('Quelle résolution ?' + chr(13) + chr(13)
   + 'Cliquez sur OK pour une résolution de 512x512.' + chr(13)
   + 'Cliquez sur Oui pour une résolution de 256x256.' + chr(13)
   + 'Cliquez sur Non pour une résolution de 128x128.' + chr(13)
   + 'Ne quittez pas la boîte de dialogue.' + chr(13)
   , Dialogs.mtConfirmation, [Dialogs.mbOK, Dialogs.mbYes, Dialogs.mbNo], 0) of
   mrOK: Res := Point(512, 512);
   mrYes: Res := Point(256, 256);
   mrNo: Res := Point(128, 128);
  end; // On demande pour la résolution d'affichage

C'est moche mais il n'y a pas de problème.

Avec une boîte de dialogue à toi :

New(Btns);
  Btns[mbCust1] := '128x128';
  Btns[mbCust2] := '256x256';
  Btns[mbCust3] := '512x512';

  case MessageDlgEx('Choisissez votre résolution', mtInformation, [mbCust1, mbCust2, mbCust3], 0, mbCust1, nil, Btns) of
   mrCust1: Res := Point(128, 128);
   mrCust2: Res := Point(256, 256);
   mrCust3: Res := Point(512, 512);
  end;

Dispose(Btns);

C'est beau, mais ça plante dès qu'on quitte cette boîte, sur une affectation de composante dans SetPixel. Bizarre, car ça marche avec une boîte normale et pas avec la tienne ??

Cordialement, Bacterius !

Commentaire de blueperfect le 25/01/2009 14:41:47

>>car ça marche avec une boîte normale
Oublies pas que t'es dans un thread et qu'il aime pas la manipulation des pointeurs en simultanée !

Commentaire de Bacterius le 25/01/2009 14:55:06

Oui mais il ne démarre qu'après la boîte !
Mais c'est arrangé, j'ai mis plutôt l'autre option (MsgDlgBox), avec les paramètres tout regroupés, et ça marche bien maintenant.
Je vais pas tarder à mettre à jour sur le site.

Cordialement, Bacterius !

Commentaire de cantador le 25/01/2009 14:59:29

bonjour,
quelle énergie !
ya pas le feu au lac..
prends ton temps Bacterius.

Commentaire de Bacterius le 25/01/2009 15:05:55

Lol ^^
Oui, je vais bien vérifier sinon je vais encore mettre à jour 20 fois ...

Cordialement, Bacterius !

Commentaire de cirec le 25/01/2009 15:10:21 administrateur CS

j'ai testé ton code et il fonctionne parfaitement et si ça fonctionne avec "MsgDlgBox" ça veut dire que le problème vient d'ailleurs dans ton code (peut être un conflit entre "Btns" et un autre pointeur) puisque peu importe la méthode utilisée la boite est toujours crée avec "MessageDlgPosHelpEx"  

Commentaire de Bacterius le 25/01/2009 15:12:28

Ouais peut-être un conflit.
Mais c'est pas grave, ça marche avec l'autre boîte.
Affaire à suivre quand-même.
Je viens de mettre à jour :)

Au fait Cirec, tu as une idée de pourquoi, quelques fois, mes FPS sur 128x128 atteignent les 350 FPS, et que d'autres fois (sans rien changer au code), on passe à 63 FPS ?
Bizarre non ?

Cordialement, Bacterius !

Commentaire de Nicolas___ le 25/01/2009 15:15:57

basse qualité et non , ca plante sur cette ligne :
  Lines[Y][X].rgbBlue := B; // On définit la composante B

Pourquoi, je ne sais pas ...

Commentaire de Caribensila le 25/01/2009 15:19:40

Un petit conseil :
Pour pouvoir comparer les perfs efficacement, évite les threads ou les ProcessMessages quand tu es en phase d'optimisation. Une simple boucle avec un nombre d'itérations fixe est bien plus pratique pour déceler les goulets d'étranglement.
Et ce ne sera que lorsque tu penseras avoir optimisé au mieux que tu threaderas ton appli...

Commentaire de Bacterius le 25/01/2009 15:22:41

Tu vas trop vite Nicolas (je parle de ton CPU).
Or, moi j'ai un escargot comparé au tien.
Donc, il faudrait que ... que tu me files ton PC pour quelques temps ... juste le temps de faire marcher le tien (car sur le mien ça marche bien car il est lent).
En fait ton problème vient que tes instructions sont executées tellement vite qu'elles tombent à coup sûr sur une synchronisation du thread - alors à la fermeture, conflit : Synchronisation + Libération du bitmap => Violation d'accès.

Donc, comme je ne peux pas tester dans les conditions de ton PC, je ne peux pas faire grand-chose.
Tu veux pas aller à Carrefour chercher un PC pourri en soldes à 50 euros, vite fait pour tester ? ^^

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 15:23:22

Ah, Caribensila, je vais lire ton message.

(décidément je me fais doubler par tout le monde aujourdhui !).

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 15:26:44

Ah ben tiens Caribensila : ton com. m'a donné une idée - j'ai enlevé ProcessMessages du thread, et hop, gain de performances de 75% !

Juste une question : c'est quoi un "goulet d'étranglement" ? Je ne comprends pas très bien.

Cordialement, Bacterius !

Commentaire de cantador le 25/01/2009 15:59:15

@Bacterius:
pour le PC, tu aurais du songé au père Noël..

Commentaire de cantador le 25/01/2009 16:00:27

désolé..
tu aurais du songer au père Noël..

Commentaire de Caribensila le 25/01/2009 16:05:12

Ben... Un goulet d'étranglement, c'est par exemple un ProcessMessages dans un Thread...  ;)

Commentaire de Caribensila le 25/01/2009 16:12:36

+ sérieusement, une application passe le plus clair de sont temps à effectuer les calculs de quelques procedures ou fonctions en nombre limité...
C'est sur ces méthodes que tu dois t'arrêter en priorité pour améliorer les perfs. Elles constituent ce qu'on appelle des goulets d'étranglement...

Commentaire de Bacterius le 25/01/2009 20:54:58

Ok Caribensila, j'ai regardé un petit peu les routines qui sont le plus souvent appelées (des variables entières pour compter le nombre d'appels, puis un rapport à la fin). J'ai remarqué que ScaleTo était appelé plus de 10.000 fois par seconde ! J'ai un petit peu réduit ce nombre, et un tout petit peu optimisé la fonction. J'ai regardé ensuite la 2eme routine la plus appelée - CreateCircle, de pair avec CreateRotatingArcCW - j'ai optimisé tout ça (moins de Round, moins de ScaleTo). Ensuite, j'ai remplacé (dans le Draw), le Canvas.Draw par un BitBlt - plus rapide je crois).

Et ... je me suis inspiré de tes techniques d'optimisation du code avec les tables trigonométriques : j'ai créé 4 tableaux d'entiers (Sinus, Cosinus, DegSinus et DegCosinus), que je remplis dans une boucle au début de l'application.
Sinus et Cosinus contiennent les sinus des angles exprimés en radians. DegSinus et DegCosinus contiennent les sinus et les cosinus [en degrés] des [angles exprimés en radians] (utilisé dans le calcul des points des lignes).
Et evidemment, j'ai tout passé en entiers avec une multiplication puis une division par 1000. (mais je crois que si on le fait avec 1000000, la précision des sinus et des cosinus sera plus importante non ?).

Bon ben voilà, c'est déjà ça de gagné ! (300% de gain de performances, d'après ton tutorial).

Cordialement, Bacterius !

Commentaire de Francky23012301 le 25/01/2009 21:32:37

J'ai pas regardé le source mais il y a un méga soucis d'optimisation : en 512*512 c'est vachement lent. Il y a un petit soucis au niveau de la form : la croix de fermeture de l'application n'est pas affichée. Pour la partie Cosinus et Sinus regarde le source de Manchester sur le mémo qui dance.

Commentaire de gege58 le 25/01/2009 21:36:33

Bonsoir, Petite erreur, je crois :

DegSinus[I] := Round(Deg(S) * 1000); // On récupère son sinus degré * 100 arrondi

il faut mettre :

DegSinus[I] := Round(Deg(S) * 100); // On récupère son
sinus degré * 100 arrondi

A+

Commentaire de Bacterius le 25/01/2009 21:40:37

Ah oui, non en fait c'est le contraire lol.
Il faut rectifier le commentaire, c'est * 1000 arrondi ^^'

Désolé.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 21:42:24

Et Francky, moi j'ai la croix ! :/ Essaye de mettre ta fiche en bsSingle plutôt qu'en bsToolWin eventuellement ?
Sinon pour l'optimisation je fais ce que je peux ...
Je me rappelle de son texte dancant à Manchester - dès que je posais son composant sur la fiche, il plantait comme c'est pas possible (100% CPU, plantage total => redémarrage du concombre). Mais je vais voir pour les sinus-cosinus.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/01/2009 21:44:04

Oups : "redémarrage de l'ordinateur", pas du concombre. En fait je regardais la tarte au concombre qu'on t'avait offerte pour ton anniv. Francky ^^

Cordialement, Bacterius !

Commentaire de Caribensila le 25/01/2009 22:30:52

Regarde le commentaire d'acanicio, sur le tuto... Tu gagneras encore un peu/beaucoup.

D'ailleurs, tu devrais lire tous les commentaires de ce tuto. C'est le plus intéressant!  :)

(Et t'es bien sûr que c'est pas un concombre déguisé, ton PC?)

Commentaire de Debiars le 26/01/2009 09:53:28

Mes résultats personnels, à moi tout seul :

128x128 : se plante au lancement dans SetPixel, violation d'adresse...

256x256 : fonctionne bien, mais fait une sinusite à l'arrêt : pointeur invalide...

512x512 : OK, un peu lent, mais est-ce vraiment un problème ??
Qui va piano, va sano !

(Cari, serait-ce le retour du cocombre masqué ? Bretzel liquide !!!)  

Commentaire de Debiars le 26/01/2009 09:58:53

Bien entendu, je voulais écrire concombre, mais comme j'avais mis coccombre, j'ai viré le "c" de trop sans m'apercevoir que ce "c" là était en réalité un "n" travesti. Quel siècle vivons-nous?

Commentaire de blueperfect le 26/01/2009 10:54:39

Sinon, dans le genre optimisation, si tes rotations sont cycliques, tu peux mettre tout ça en cache, même les TBitmap...

Commentaire de cantador le 26/01/2009 13:29:35

@Bacterius:
un test avec un profiler te permettrait d'y voir plus clair..
avec cet outil, tu aurais la liste de toutes tes méthodes avec le nombre de cycles et aussi le temps consommé.

Commentaire de Bacterius le 26/01/2009 17:51:21

@Caribensila : je n'ai que survolé les commentaires (trop d'asm pour moi !), mais je vais y jeter un coup d'oeil plus en profondeur. D'ailleurs, je ne suis jamais arrivé au bout des commentaires (trop long ... !).

@Blueperfect : tes commentaires sont toujours plein de mystère ...

@Débiars : interessants résultats ... il faut que j'en finisse avec ces violations d'accès (l'opération de pointeur incorrecte, je croyais l'avoir virée !).

Et où puis-je télécharger un profiler ?
Ou bien dois-je me commander un Do-It-Yourself ?
Je demande à mon ami Google :)

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 18:17:16

Et mes réponses ?

Commentaire de Bacterius le 26/01/2009 18:25:57

Ben quand je dis que tes commentaires sont toujours plein de mystère, c'est que tu ne précises pas beaucoup ta pensée, notamment dans ce message :

"Sinon, dans le genre optimisation, si tes rotations sont cycliques, tu peux mettre tout ça en cache, même les TBitmap..."

Mais je viens de comprendre.
C'est une bonne idée, mais côté mémoire ça va pomper ! 360 TBitmaps en mémoire, argh.

Cordialement, Bacterius !

Commentaire de Bacterius le 26/01/2009 18:27:43

Seul petit hic : dès que je veux faire des animations aléatoires, pouff ton optimisation tombe à l'eau ...

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 18:28:18

tssssssssssss ..
Fini les 128Ko de mémoire....
Et puis tu utilises combien de couleurs ?
Tu peux jouer avec la palette...

Commentaire de blueperfect le 26/01/2009 18:29:34

Les animations aléatoires :

faut absolument jouer avec les threads...

Actuellement tu utilises 1 thread...

Dans l'absolu, il en faut un par objet animé !

Commentaire de Bacterius le 26/01/2009 18:32:30

A mon avis 360 bitmaps 32 bits de taille 128x128 à 512x512 prennent un peu plus que 128 Ko de mémoire ...
Je travaille en 32 bits, c'est plus rapide qu'en 24 bits pour le CPU.

Cordialement, Bacterius !

Commentaire de Bacterius le 26/01/2009 18:33:07

Pourquoi 1 par objet animé ?

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 18:34:54

Parce que....

Commentaire de Bacterius le 26/01/2009 19:00:51

Parce que quoi ?
Précise ta pensée !

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 19:05:09

* Parce que chaque propriété devrait être un objet en elle-même...
* Parce que chaque objet, maintenant que leur modalité est précisée, devrait posséder son propre espace mémoire et d'éxécution pour ses propres traitements
* Parce que Synchronize existe pour quelquechose
* Parce que jouer sur 32 bits parce que c'est plus rapide ne devrait pas être la justification d'une lenteur de traitement global
* Parce que DirectX fais mieux que ça en version 0.9beta...

Commentaire de Bacterius le 26/01/2009 19:08:58

Et si j'ai 64 animations différentes ? 64 threads ! Tu vois, tout a des limites. Mais eventuellement, si je voulais m'arrêter à 5 ou 6 animations, ouais.

Juste une question : quelle est le plus rapide (renvoient tous les deux 0 avec un GetTickCount, trop rapide) :

-- Version ASM --

function TMainForm.ScaleTo(X: Integer; Scale: Integer): Integer; // Replacement de X dans Scale (opérandes entiers)
begin
while X >= Scale do
  asm
   MOV EAX, X;
   SUB EAX, SCALE;  // ASM pour aller + vite
   MOV X, EAX;
  end; // On diminue X jusqu'à ce qu'il soit dans 0..Scale
Result := X; // On donne ça au résultat
end;

-- Version Pascal --

function TMainForm.ScaleTo(X: Integer; Scale: Integer): Integer; // Replacement de X dans Scale (opérandes entiers)
begin
while X >= Scale do X := X - Scale;
// On diminue X jusqu'à ce qu'il soit dans 0..Scale
Result := X; // On donne ça au résultat
end;
______________________

Et pareil pour le type Single à la place d'Integer ?
Je précise que j'ai souffert pour convertir une soustraction pascal en ASM, alors pitié ne m'achevez pas :'/
D'ailleurs il faut que je m'y mette, à l'ASM, c'est essentiel.

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 19:13:14

while X >= Scale do System.Dec(X, Scale);

Commentaire de blueperfect le 26/01/2009 19:14:06

Difficile à optimiser pour les Single...Je te renvoie à Google...ou aux newsgroup de CodeGear...

Commentaire de Bacterius le 26/01/2009 19:15:18

C'est quand-même une instruction pascal BluePerfect ...

Cordialement, Bacterius !

Commentaire de John Dogget le 26/01/2009 19:16:28

Pour les temps d'execution, il y a sur le site un source qui te permet de faire des mesures très précises :)

Voir ici -> http://www.delphifr.com/codes/PLUS-PRECIS-GETTICKCOUNT_11808.aspx

Sinon directx, c'est fait par et pour des math/spé (il parait), donc c'est pas vraiment l'objectif ici.

Sois fort Bacterius !

Commentaire de blueperfect le 26/01/2009 19:16:41

Raciste...lol

Commentaire de Caribensila le 26/01/2009 19:21:59

:)))

BLUEPERFECT a raison pour la palette, en tout cas! La palette est le secret de ce genre d'animation je pense. Les perfs s'envolent !
Contrairement à ce que croient les novices, la palette ne limite pas la profondeur des couleurs affichées, mais seulement le nombre de couleurs affichées simultanément. Ce qui n'est pas gênant ici.
Autre avantage: tu peux obtenir des effets très intéressants et très rapides en ne travaillant que sur la palette ("palette-animation", in english).

Mais bon! Palette + threads, c'est pour les "pro", je crois. Mais c'est tj bon de savoir que ça existe.

Commentaire de Nicolas___ le 26/01/2009 19:22:34

Poser un commentaire sur un source de bacterius, c'est encore pire que d'être spammé !
y'en a encore plus par heure !!!

Commentaire de Caribensila le 26/01/2009 19:56:15

Re Nico.  lol

Moi, j'aurais laissé les tables trigonométriques en constante. J'ai pas testé, mais je crois que c'est plus rapide.

Commentaire de Bacterius le 26/01/2009 20:03:04

Je viens de me poser une question qui m'a brisé : ça ne serait pas plus rapide en utilisant Ellipse et LineTo des canevas ?

x(

Cordialement, Bacterius !

Commentaire de blueperfect le 26/01/2009 20:06:21

Oui et non...

Si tu veux réutiliser ton code, passes par des ScanLines...Tu pourras ajouter des effets plus tard...et pourquoi pas la 3D ?

Commentaire de Bacterius le 26/01/2009 20:09:46

Attends : je ressors mon unité de projection 3D => 2D. Je ne l'ai jamais finie, je n'ai pas pu gérer les angles de la caméra.

*Bouhouhouhouh*

Probablement un cube en 3D home-made avec des faces dégradées la prochaine fois ?

Cordialement, Bacterius !

Commentaire de cirec le 26/01/2009 20:15:51 administrateur CS

@Nicolas___ : MDR

dans ce cas la gain est minime(si gain il y a) par contre la probabilité d'une erreur de saisie est importante.

Commentaire de Caribensila le 26/01/2009 20:16:41

Je te conseille de regarder du côté de GLScene...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

boucle thread simple exemple ! [ par fabiin ] Salut !Je cherche un exemple simple d'une boucle threadje n'est trouvé aucun tutorial français a ce sujet sur internet Merci par avance@+Fabs Problème avec Canvas.draw [ par fabiin ] salut,voici mon prob:j'utilise un threaddans ce thread dans ce thread je dessine sur un TBitmap(jusque la pas de problème)ensuite, je veu afficher mon Tcolor, RGB [ par PowerII ] Salut,je voudrais savoir comment je pourrais faire pour récuperer la valeur d'un Tcolor en RGB?Merci ColorToRgb - probleme [ par PowerII ] slt,j'ai deja posé une kestion pour savoir komment recupéré la valeur d'un TColor en RGB et DelphiProg m'a dit ke devait le faire avec un ColorToRgb : Arrêt d'un thread [ par commodore ] J'aimerai savoir s'il existe une une variante que ExitThread pour arréter un thread . Car je voudrais arréter un thread d'un a partir d'un BT arrét et Conseil pour Moteur 3D [ par dami ] Bonjour a tous .Je développe actuellement un jeux de stratégie 3D temps réel. J'ai décidé d'importer les objects via un loader 3ds que j'ai fais, je l Urgent, cherche aide sur le multi-thread [ par djtexas ] Pour commencer, j'ai programmé un serveur chat sans grande prétention, mais me voila confronté a un problème de stabilité du moteur. J'utilise 2 compo Animation dans un Menu [ par Chong ] Bonjour, Tiens Bestiol en parlant de Menu, moi j'aimerai savoir si qlq à déjà réalisé un composant permettant d'afficher une petite aniamtion (rectan form aux bord irreguliers : régions [ par sebrs1 ] salut à tousvoila mon pbj'assigne plusieurs fois d'affilée des regions a ma form (attention, je ne cherche pas a les combiner) afin de realiser une an parametrer un thread [ par optarel ] j'aimerais passer un parametre à la fonction thread.execute.or celle-ci n'est jamais appellée explicitement, c'est quand on lance thread.create qu'ell


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,231 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales