Come posso aggiungere rapidamente una grande quantità di contenuti ricchi (immagini, formattazione) a un controllo senza usare tonnellate di CPU?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Sto usando wxWidgets e Visual C ++ per creare funzionalità simili all'utilizzo di Unix " tail -f " con formattazione avanzata (colori, caratteri, immagini) in una GUI. Sto prendendo di mira sia wxMSW che wxMAC.

La risposta ovvia è usare wxTextCtrl con wxTE_RICH, usando le chiamate a wxTextCtrl :: SetDefaultStyle () e wxTextCtrl :: WriteText ().

Tuttavia, sulla mia stazione di lavoro da 3 Ghz, compilata in modalità di rilascio, non riesco a continuare a mettere in coda un registro che cresce in media di 1 ms per riga, alla fine rimanendo indietro. Per ogni riga, mi sto incorrendo in:

  1. Due chiamate a SetDefaultStyle ()
  2. Due chiamate due WriteText ()
  3. Una chiamata a Freeze () e Thaw () il widget

Quando eseguo questo, la mia CPU va al 100% su un core usando wxMSW dopo aver riempito circa 20.000 linee. Il programma è visibilmente più lento quando raggiunge una certa soglia, rimanendo più indietro.

Sono aperto all'utilizzo di altri controlli (wxListCtrl, wxRichTextCtrl, ecc.).

È stato utile?

Soluzione 3

Deriva da wxVListBox. Dai documenti:

  

wxVListBox è un controllo simile a una casella di riepilogo con le seguenti due principali differenze rispetto a una normale casella di riepilogo: può avere un numero arbitrariamente enorme di elementi perché non li memorizza da solo ma utilizza il callback OnDrawItem () per disegnarli (quindi è una casella di riepilogo virtuale) e i suoi elementi possono avere un'altezza variabile come determinato da OnMeasureItem () (quindi è anche una casella di riepilogo con le righe di altezza variabile).

Altri suggerimenti

Hai considerato di limitare la quantità di linee nella vista? Quando abbiamo riscontrato un problema simile, ci siamo assicurati che nella visualizzazione non fossero mai presenti più di 10.000 righe. Se più linee entrano in fondo rimuoviamo le linee in alto. Non utilizzava WxWidgets, utilizzava un'interfaccia utente Cocoa nativa su Mac, ma il problema è lo stesso. Se una visualizzazione di testo in stile (con colori, formattazione e bella stampa) diventa grande, l'aggiunta di più dati nella parte inferiore diventa piuttosto lenta.

Sembra che il controllo che stai usando non sia semplicemente costruito per la quantità di dati che stai lanciando. Vorrei prendere in considerazione la creazione di un controllo personalizzato. Ecco alcune cose che potresti prendere in considerazione:

  1. Quando arriva una nuova linea, non è necessario ripetere il rendering delle linee precedenti ... non cambiano e il layout non cambierà a causa dei nuovi dati.
  2. Cerca di mantenere solo la parte visibile più alcune schermate di ricerca in memoria alla volta. Questo renderebbe un po 'più leggero ... ma dovrai fare la tua gestione dello scorrimento se vuoi che l'utente sia in grado di scorrere indietro oltre il tuo look-back e far sembrare tutto senza soluzione di continuità.
  3. Non aggiornare necessariamente una riga alla volta. Quando ci sono nuovi dati, prendili tutti e aggiorna. Se ottieni 10 linee molto rapidamente e aggiorni lo schermo tutto in una volta, potresti risparmiare un po 'del sovraccarico di farlo riga per riga.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top