Comment ajouter rapidement une grande quantité de contenu riche (images, formatage) à un contrôle sans utiliser beaucoup de ressources processeur?

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

Question

J'utilise wxWidgets et Visual C ++ pour créer une fonctionnalité similaire à celle utilisée sous Unix " tail -f " avec une mise en forme riche (couleurs, polices, images) dans une interface graphique. Je cible wxMSW et wxMAC.

La réponse évidente consiste à utiliser wxTextCtrl avec wxTE_RICH, en utilisant les appels à wxTextCtrl :: SetDefaultStyle () et wxTextCtrl :: WriteText ().

Cependant, sur mon poste de travail de 3 GHz, compilé en mode de publication, je ne parviens pas à conserver un journal qui croît en moyenne de 1 ms par ligne, mais qui finit par prendre du retard. Pour chaque ligne, j'engage:

  1. Deux appels à SetDefaultStyle ()
  2. Deux appels deux WriteText ()
  3. Un appel à Freeze () et décongeler () le widget

Lors de l'exécution de cette opération, mon processeur utilise wxMSW à 100% sur un cœur après avoir rempli environ 20 000 lignes. Le programme est visiblement plus lent une fois qu'il atteint un certain seuil, ce qui le retarde davantage.

Je suis ouvert à l'utilisation d'autres contrôles (wxListCtrl, wxRichTextCtrl, etc.).

Était-ce utile?

La solution 3

Dérivez de wxVListBox. À partir de la documentation:

  

wxVListBox est un contrôle semblable à une zone de liste avec les deux différences principales suivantes par rapport à une zone de liste normale: il peut avoir un nombre arbitrairement énorme d'éléments car il ne les stocke pas lui-même mais utilise le rappel OnDrawItem () pour les dessiner (il est une listbox virtuelle) et ses éléments peuvent avoir une hauteur variable, déterminée par OnMeasureItem () (il s’agit donc également d’une listbox avec les lignes de hauteur variable).

Autres conseils

Avez-vous envisagé de limiter le nombre de lignes dans la vue? Lorsque nous avons eu un problème similaire, nous nous sommes assurés que jamais plus de 10 000 lignes ne seraient visibles. Si plus de lignes entrent en bas, nous supprimons les lignes en haut. Cela n'utilisait pas WxWidgets, il utilisait une interface utilisateur Cocoa native sur Mac, mais le problème est le même. Si une vue de texte stylée (avec des couleurs, une mise en forme et une impression agréable) devient trop grande, l'ajout de données supplémentaires en bas devient assez lent.

On dirait que le contrôle que vous utilisez n’est tout simplement pas construit pour la quantité de données que vous lui envoyez. J'envisagerais de créer un contrôle personnalisé. Voici quelques éléments à prendre en compte:

  1. Quand une nouvelle ligne arrive, vous n'avez pas besoin de refaire le rendu des lignes précédentes ... elles ne changent pas et la mise en page ne changera pas à cause des nouvelles données.
  2. Essayez de ne conserver que la partie visible à la fois, plus quelques écrans de rétrospective. Cela le rendrait un peu plus léger ... mais vous devrez faire votre propre gestion de défilement si vous voulez que l'utilisateur puisse faire défiler en arrière plus loin que votre recherche en arrière et lui donner un aspect transparent.
  3. Ne mettez pas nécessairement à jour une ligne à la fois. Quand il y a de nouvelles données, récupérez tout et mettez à jour. Si vous obtenez 10 lignes très rapidement et que vous mettez à jour l’écran en une fois, vous économiserez peut-être une partie de la surcharge occasionnée par cette opération ligne par ligne.

J'espère que cela vous aidera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top