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

Lazarus Pascal Discussion :

[WinCE] Affichage lent et incomplet


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut [WinCE] Affichage lent et incomplet
    Bonjour
    J'ai traduit un jeu d'échec de Delphi en lazarus (Arm WinCE sur Acer F900)
    Cela fonctionne assez bien sauf l'affichage qui est lent et le menu invisible.
    Je crois me rappeler qu'il y avait une fonction Delphi qui suspendait l'affichage tant que les traitements graphiques n'étaient pas terminés. Y a t'il l'équivalent en Lazarus (pour éviter un effet de scintillement)

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Je me réponds à moi même.
    En fait je pensais à Begin Update et à End Update qui ne fonctionnent pas sur un Timage. Pour le menu, il faut une form avec une hauteur multiple de 26 comme indiqué sur le FreePascal wiki.
    ADMR

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    DoubleBuffered pour le scintillement.

    sinon, pense à optimiser le code graphique les smartPhone ne sont pas des foudre de guerre.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci Dr.Who mais j'y avais pensé.
    Le but est d'afficher les coups de l'ordinateur, avec une flèche, au fur et à mesure de leur évaluation (dans la boucle de traitement).
    Effectivement je retrace a chaque fois l'échiquier :64 cases + les pièces
    J'ai essayé de tracer les flèches en XOR pour ne pas retracer l'échiquier: c'est pareil.
    J'ai essayé de sauver l'écran :
    BitMap1.Assign(Form1.image1.picture.Bitmap); puis Form1.image1.picture.Bitmap.Assign( BitMap1);
    puis de tracer mes flèches : toujours un effet à l'affichage.
    Je pense que , effectivement, ce sont les performances de la"carte graphique" et qu'il n'y a rien à faire sauf peut être de placer l'écran en mode 256 couleurs?

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    ah ok ouai je comprend pourquoi ç'est aussi peu performant.

    1) première règle à assimiler : Ne jamais appeler la variable de fiche (form1, form2) dans la classe elle même (TForm1, TForm2...)

    2) ne travail pas avec des TImage, utilise un TPaintBox et de simple TBitmap

    3) découpe chaque plan
    Echiquier -> TBitmap
    Pièces -> array de TBitmap avec transparence ou si les smartphone supporte le PNG, un array of TPNGImage (plus beau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      TPiece = record
        X, Y : integer;
        catched : boolean;
        Image : TBitmap; // TPNGImage;
      end;
      TPieces = array[0..15] of TPiece;
    4) utilise l'evenement OnPaint de la TPaintBox pour dessiner un unique buffer de dessin (qu'on appelera backBuffer) ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if assigned(BackBuffer) then
      PaintBox1.Canvas.Draw(0, 0, BackBuffer);
    5) appel Invalidate pour rafraichir l'affichage

    6) utilise un TTimer réglé à 50ms (20 FPS) pour les animations, effectue les dessins dans l'evenement OnTimer et appel invalidate de PaintBox1 à la fin ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if assigned(Echiquier) then
      BackBuffer.Canvas.Draw(0, 0, Echiquier);
     
    for N := 0 to 15 do
    begin
      if not PieceWhite[N].catched then
        BackBuffer.Canvas.Draw(PieceWhite[N].X, PieceWhite[N].Y, PieceWhite[N].Image);
      if not PieceBlack[N].catched then
        BackBuffer.Canvas.Draw(PieceBlack[N].X, PieceBlack[N].Y, PieceBlack[N].Image);
    end;
     
    PaintBox1.Invalidate;
    7) backBuffer, Pieces, Echiquier, tout se crée au début (OnCreate de la fiche) et se libère à la fin (OnDestroy de la fiche).
    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
    procedure TForm1.Form1Create(...);
    var N : integer;
    begin
      backBuffer := TBitmap.Create;
      backBuffer.pixelFormat := pf32bit;
     
      Echiquier := TBitmap.Create;
      Echiquier.LoadFromFile('resources\echiquier.bmp');
     
      for N := 0 to 15 do
      begin
        pieceWhite[N] := TBitmap.Create;
        pieceWhite[N].LoadFromFile('resources\pieceW'+intToStr(N)+'.bmp');
        pieceBlack[N] := TBitmap.Create;
        pieceBlack[N].LoadFromFile('resources\pieceW'+intToStr(N)+'.bmp');
      end;
    end;
     
    procedure TForm1.Form1Destroy(...);
    var N: integer;
    begin
      timer1.Enabled := false;
      paintBox1.Visible := false;
     
      for N := 0 to 15 do
      begin
        pieceWhite[N].Free;
        pieceBlack[N].Free;
      end;
      echiquier.Free;
      backBuffer.Free;
    end;
    8) la taille du backBuffer est gérée dans l'evenement OnResize de la fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Form1Resize(...);
    begin
      backBuffer.Width := PaintBox1.Width;
      backBuffer.Height := PaintBox1.Height;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonne idée d'utiliser une TPaintBox et un buffer. En Delphi je n'optimisais rien du tout , le problème n'existait pas. Je vais tester !
    Merci
    ADMR

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Résultat identique, toujours un sautillement à l'affichage . Celà viens donc probablement du smartphone
    ADMR

  8. #8
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 26
    Points
    26
    Par défaut Lenteur d'exécution mais stabilite sour LazFPC et WinCE
    Bonjour à tous,

    Ayant acquis 2 PDA, j'ai essayé de programmer dessus en FreePascal compatible Delphi.
    Ce sont des utilitaires de saisie de terrain couplés aux moteurs du logiciel GHTopo (très puissant logiciel de spéléo)
    J'installe les outils (deux fichiers à télécharger et à installer, style Delphi 5 et son pack additionnel.).
    Quelques tests et configurations du compilateur plus tard, nous avons un bon duo pour développer sur le PC et compiler (via un petit batch) sous ARM

    Les essais sous ARM me posaient énormément de plantages liée à la 'pompe à messages" ( for i:= 1 to 666 do WriteLn('Du Application.ProcessMessages tu abuseras dans les zones de contrôle'). Des Application.ProcessMessages équipent les routines d'affichage de texte. Cette méthode supprime enormément de bogues

    Si sur Windows Mobile (version 4.2) c'est quasiment inutilisable (VCL incomplète, instabilité de WinImobile, sous Mobile5.1, c'est très utilisable. Un peu lent, mais la session tient le coup.

    Les comportements des interfaces sont conformes mais les temps de calcul sont très longs, sans aucune mesure avec le différentiel de puissance des processeurs et memoires.

    FreePascal utiliserait-il un émulateur en interne ? Mon logiciel utilise énormément de TLists et dérivés.

    Etes-vous confrontés au pb de lenteur ?
    ---------------------------------
    HADES -2000, çà, c'est pas
    du logiciel de PD (euh ...)

Discussions similaires

  1. [MySQL] Optimisation requête, affichage lent
    Par Yann39 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/10/2008, 11h23
  2. Image - PictureBox : affichage LENT
    Par johan3240 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/06/2008, 10h50
  3. [WinForms]affichage lent en transparence et zone de click
    Par glebourg dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 20/12/2006, 20h35
  4. [C#] Affichage lent avec la méthode DrawRectangle
    Par mr.saucisse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/08/2006, 13h00
  5. Affichage de texte incomplet dans OnDrawItem
    Par Sunchaser dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/01/2006, 18h03

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