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

Composants VCL Delphi Discussion :

Plus rapide que TPaintBox


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Plus rapide que TPaintBox
    Salut tout le monde,

    j'ai un progamme qui trace pas mal de chose dans une paintbox. et le problème que j'ai, c'est cque c est long et que sa "saute" meme avec le doublebuffer.

    J'aurais voulu si il existait un composant simlaire a la paintbox mais qui serait plus rapide et peut etre accéléré par le biais de directX ou openGl.

    Cordialement

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Reste a savoir si le "dessin" est effectué par le logiciel ou bien par l'utilisateur (dessin dynamique selon la souris)

    Si c'est l'application qui dessine elle meme, il y a moyen d'accelerer le processus en dessinant directement dans la memoire, puis copier le "rendu" sur la TPaintBox.

    Dessiner sur un TBitmap Memoire est plus rapide (beaucoup plus rapide) car il n'as pas besoins de raffraichir systematiquement le canvas.

    Une alternative equivalente serais de dessiner en permanace dans la memoire et effectuer un rendu ecran periodique a la maniere des moteurs 3D.

    Reste a savoir ce que tu veux faire exactement.

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    beh le seul truc que je sais c est que je veux pas me prendre la tete.

    Je m'explique mon appli est deja écrite et je ne veux pas la recoder en entier; donc si le nouveau composant a les meme fonctions ( a peu de chose prés) que la paintbox je dis pas non.

    Aprés je voudrais que la gestion soit plus rapide au niveau du dessin (c'est l'appli qui dessine).

    Et évidement s'il y a des fonctions native du style zoom ou anti aliasing, je suis preneur .

    j'ai regadé du coté de graphic32 et graphicex .

    T'en pense quoi ?

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    On ne dessine pas directement sur le PaintBox mais sur le Canvas (TCanvas) du paintBox

    TBitmap possede une variable TCanvas donc il n'y a pas de soucis.
    Il te suffit de manipuler le canvas du bitmap au lieu du canvas du PaintBox.
    La mise en parametre d'une variable Canvas dans les fonction de dessin serait un bon choix technique.

    Pour le rendu sur le paintbox, une copie (ou assign) du canvas du bitmap vers le canvas du paintbox en temps voulut devrais suffire.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    la librairie G32 est absolument ultime et imbattable -hors DirectX, donc nettement plus legere- je la conselle fortement pour tout ce qui est traitement d'image 2D.

    http://graphics32.org/wiki/

  6. #6
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    et pour ce qui est de l impression ? c'est facile avec graphic32 ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par rvzip64 Voir le message
    et pour ce qui est de l impression ? c'est facile avec graphic32 ?
    Salut,

    Pour ce qui est de l'impression, quelle que soit la solution que tu utilises la méthode reste la même du moment que tu obtiens ton rendu dans un TCanvas.


    Yan.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 702
    Points : 25 568
    Points
    25 568
    Par défaut
    Sinon, la solution de Clorish, un TPaintBox ou TImage, pour afficher, et un TBitmap qui sert de tampon, il est nettement plus rapide de dessiner toute son image sur un tampon, puis de l'afficher que d'ajouter directement sur la PaintBox chaque élément un à un ... de plus, le calcul peut se faire de un thread, qui avec un système de double buffer (un TBitmap en cours de création, un TBitmap en cours de copy dans l'écran, et on switch les deux TBitmap, ...) permet de faire des affichages très rapides ... c'est la technique sous DDraw

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par Clorish Voir le message
    Pour le rendu sur le paintbox, une copie (ou assign) du canvas du bitmap vers le canvas du paintbox en temps voulut devrais suffire.
    Salut tout le monde,

    Je viens interférer un peu ce fil qui n'est pas le mien, mais si je pouvais avoir un ch'tit exemple de la mise en application de la citation ci-dessus, ça m'aiderait, car quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox.Canvas.Assign(Buffer.Canvas);
    , je gagne "une classe d'exception EConvertError avec le message 'Impossible d'affecter TBitmapCanvas à TControlCanvas'." !

    C'est désagréable, ces trucs,

    Merci d'avance,
    --
    jp

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Bon pardon a mon tour de m'insérer dans la conversation mais...

    Ceci ne conviendrait-il pas pour répondre a ton problême de transtypage!

    bon on a déja une paintbox quelque part ... PoC...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure toto;
    var
    Buffer:TBitMap;
    begin
    Buffer:=TBitMap.Create;
    Buffer.Width:=PaintBox1.Width;
    Buffer.Height:=PaintBox1.Height;
    // ici on fait des trucs et des machins pour dessiner dans le buffer
    // et ensuite...
    PaintBox1.Canvas.Draw(0,0,Buffer);
    end;
    Alors je ne sais pas si c'est très rapide mais ca marche...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Bon pardon a mon tour de m'insérer dans la conversation mais...

    Ceci ne conviendrait-il pas pour répondre a ton problême de transtypage!

    bon on a déja une paintbox quelque part ... PoC...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure toto;
    var
    Buffer:TBitMap;
    begin
    Buffer:=TBitMap.Create;
    Buffer.Width:=PaintBox1.Width;
    Buffer.Height:=PaintBox1.Height;
    // ici on fait des trucs et des machins pour dessiner dans le buffer
    // et ensuite...
    PaintBox1.Canvas.Draw(0,0,Buffer);
    Buffer.free;
    end;
    Alors je ne sais pas si c'est très rapide mais ca marche...

    Oups pardon pour le double post, je voulais juste rajouter un free a la fin... j'ai voulut faire un edit mais j'ai loupé mon coup

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut !
    Citation Envoyé par darkvadr Voir le message
    Bon pardon a mon tour de m'insérer dans la conversation mais...

    Ceci ne conviendrait-il pas pour répondre a ton problême de transtypage!
    Ben si c'est à moi que tu réponds, je dirai "sans doute, sans doute",
    mais j'aimerais bien que Clorish nous explique son plan...

    --
    jp

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Petit « up », que je sens que sinon ça va finir aux oubliettes, et que j'aimerais bien en savoir un peu plus...

    Envoyé par Clorish
    Pour le rendu sur le paintbox, une copie (ou assign) du canvas du bitmap vers le canvas du paintbox en temps voulut devrais suffire.
    Salut tout le monde,

    Je viens interférer un peu ce fil qui n'est pas le mien, mais si je pouvais avoir un ch'tit exemple de la mise en application de la citation ci-dessus, ça m'aiderait, car quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox.Canvas.Assign(Buffer.Canvas);
    , je gagne "une classe d'exception EConvertError avec le message 'Impossible d'affecter TBitmapCanvas à TControlCanvas'." !
    Merci et bon dimanche,
    --
    jp

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    petit example ou celu

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par edam Voir le message
    petit example ou celu
    Dans le premier cas on utilise un copyrect
    et dans le deuxieme le draw que j'avais proposé un peu plus haut.

    Ca marche impec mais ca ne resoud pas le probleme d'assignation directe d'un canvas.

    Et ce ne repond pas au probleme plutot curieux de transtypage.

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut !

    Merci Edam pour me rappeler ces exemples.
    Merci Darkvadr pour ces précisions.

    Un complément :
    cette méthode Assign fonctionne de Bitmap à Bitmap, et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Destimg.Picture.Bitmap.Assign(bm);
    fonctionne, avec Destimg comme TImage et bm comme TBitmap de travail.

    Ce qui m'ennuie un peu sur ce coup-là, c'est le temps perdu à essayer de faire fonctionner quelque chose qui pourrait ressembler à la solution d'un post, et qui ne fonctionne pas, et pour lequel il n'y a pas d'explication de l'auteur...
    --
    jp

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je sais pas exactement , voir l'aide de delphi:
    TPersistent.AssignTo
    TPersistent Voir aussi
    Copie les propriétés d'un objet dans l'objet destination.
    procedure AssignTo(Dest: TPersistent); virtual;
    Description
    Surchargez la méthode AssignTo pour étendre les fonctionnalités de la méthode Assign à des objets destination afin qu'elle gère de nouvelles classes d'objets. Quand vous définissez une nouvelle classe d'objet, surchargez la méthode Assign de chaque objet existant afin qu'il soit capable de copier ses propriétés dans la nouvelle classe. Surchargez la méthode AssignTo de chaque classe existante afin que la nouvelle classe puisse se copier.

    La méthode Assign de TPersistent appelle AssignTo si l'objet descendant ne réussit pas à copier les propriétés d'un objet source. Par défaut, la méthode AssignTo définie par TPersistent déclenche une exception EConvertError.

    Par exemple, étant donné le code suivant où A et B sont des variables d'instances :

    A.Assign(B);


    Si A sait comment gérer B, il peut le faire. Si A ne sait pas comment gérer le type de B, l'exécution passe à TPersistent.Assign, qui appelle :

    B.AssignTo(A);


    Si B sait comment se copier dans A, l'affectation a lieu. Sinon, TPersistent déclenche une exception.

  18. #18
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Salut tout le monde !!

    Je vois que l'encre a bien coullé depuis la derniere fois que je suis venu ici
    Désolé ... je suis comme qui dirait un peu occupé ces temps ci. Donc merci d'avoir fait remonter ce post.

    Donc pour en revenir au sujet, ma technique est simple :
    1) un TImage (ou TPaintBox, ou ...) sur la form qu iva nous servir a afficher le resultat. PErsonnellement je prefere les TImages ... mais c'est un choix. Combiné avec un TScrollbox ca fait des miracles !!

    2) Une variable de Type TBitmap declaré soit dans la procedure de rendu, soit en local d'une classe bref ou c'ets le mieux selon l'applciation. Cette instance va nous permettre via la property Canvas de dessiner totu ce que l'on souhaite.
    Vu qu'il est en memoire et non directement lié a un composant visuel, le resultat se fera en memoire, sans declancher tout le processus de rafraichissement de l'interface a chaques changements de pixels. C'est le cas si on travaille directement sur un compo visuel et qu'on utilise la property pixels du canvas. Une horreur ....

    3) Une fois le dessin effectué sur notre tampo memoire (le Bitmap), l'affectation au TImage pour un resultat visuel est plus que simple : Un assign sur la prop Bitmap (eventuelement Graphic je n'ai pas Delphi sous la main pour tester ...) voir des copies du canvas du Bitmap vers le canvas du TImage via copyRect, BitBlt (unit windows), StretchDraw .... il en existe des tas.

    4) Optimiser ce code. La tout est possible, plusieurs pistes ont ete evoquées dont je ne rentrerais pas dans le details (faute de connaissances).

    Note : Graphic32 est une tres bonne librairie graphique et effectivement tres rapide, mais propose a mon gout, des classes bien trop complexes qui font tout et meme le café, la ou on attends juste une simple fonctionnalité.

    Dans la mesure ou cette fonctionnalité est accessible simplement via quelques astuces de codages, je prefere proposer ces dernieres.

    Pour plus d'infos, ne pas hesiter a me relancer par MP. Si des problemes persistent, je posterais un exemple plus concret ... mais il est preferable d'avoir un peu cherché avant (pour votre bien )

  19. #19
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut tout le monde,

    Je viens interférer un peu ce fil qui n'est pas le mien, mais si je pouvais avoir un ch'tit exemple de la mise en application de la citation ci-dessus, ça m'aiderait, car quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox.Canvas.Assign(Buffer.Canvas);
    , je gagne "une classe d'exception EConvertError avec le message 'Impossible d'affecter TBitmapCanvas à TControlCanvas'." !
    Visiblement le canvas de TPaintBox n'ets pas du meme type que celui du TBitmap. donc l'assignation n'ets pas possible.
    J'imagine qu'ils doivent avoir des fonctiosn differentes, vu que l'un interface un controle sur l'ecran, l'autre est directement lié a un handle de type HDC (graphique) ....
    A approfondir.

    Note sur le Assign : Cette methode permet de recopier le contenu d'une classe dans une autre, a conditions que les regles d'heritages soient respectees.

  20. #20
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 702
    Points : 25 568
    Points
    25 568
    Par défaut
    Le Assign sur les canvas, cela fonctionne rarement, autant sur Font, Brush, ... pas de soucis ... Mieux vaut un CopyRect (BitBlt) ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Access plus rapide que SQL server ????? (débutante)
    Par 24 faubourg dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 21/12/2005, 18h36
  2. [D7] composants plus rapides que dbExpress pour Oracle 8i
    Par Magnus dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/10/2005, 13h06
  3. Plus rapide que bresenham ?
    Par mathieu_t dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/06/2005, 14h28
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 01h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 17h21

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