Newsgroup: it.comp.lang.visual-basic
Titolo: [?][LONG] Grafici real-time

Sto realizzando la seconda release di un'applicazione che visualizza a
schermo grafici in tempo reale.
La prima utilizzava una PictureBox con i "classici" metodi Point e Line che
pero', su grande mole di dati, non "rendono" particolarmente bene.
Poiche':
- i dati che arrivano in tempo reale sono dell'ordine di "da 0.2 a 4 valori"
al secondo per un totale di ca. 10-15mila al giorno,
- il grafico e' "acceso" dalla mattina alla sera ed e' necessario poter
"vedere" il grafico dell'intera giornata (quindi persistenza e graficazione
di tutti i dati),
- il programma oltre a graficare deve fare elaborazione sul dato entrante
(quindi la routine di disegno non puo' impegnare tutte le risorse),
- e' necessario che il tempo reale sia reale =) (non ritardato) e che non ci
sia "sfarfallio" dell'immagine nel refresh,
- con "point-and-click" si deve poter leggere il valore(ulteriore
elaborazione?),
- e' necessario che il grafico "segua" i nuovi valore (e quindi "si
sposti"),
mi chiedevo quali routine grafiche (e soprattutto - a grandi linee - in che
modo) si possono utilizzare per rendere il tutto piu' efficiente?
Ho esaminato e fatto alcuni test con le API grafiche:
- GetPixel/SetPixel,
- MoveToEx,
- LineTo,
che sembrano"fare al caso", pero' ho notato un fenomeno "strano": se la
proprieta' AutoRedraw del contesto in cui si disegna e' False, se il grafico
finisce "sotto" a qualche finestra e poi viene scoperto, ovviamente non
viene ridisegnata la parte coperta se non alla "passata" successiva (per ora
ridisegno "tutto" ad ogni nuovo valore).
Se la proprieta' e' True, il grafico non viene visualizzato a meno di un
refresh esplicito!!!
Quello che cerco e' il sistema piu' rapido, snello ed efficiente.
A "naso" mi verrebbe da pensare che il modo migliore sia:
- disegnare "in una porzione di memoria" il grafico.
- copiare tale "porzione" pari pari nel controllo grafico (PictureBox).
Putroppo non ho molta dimestichezza con i metodi grafici. Spero che qualcuno
(che avra' avuto la pazienza di arrivare fino a qui =P) sia in grado di
indirizzarmi nella giusta direzione.
Lokar

 refresh esplicito!!!
Usare l'AutoRedraw=True equivale a quello a fare un doublebuffering (quello
che vorresti fare tu "disegnando" in memoria).
Spiego: Con AR = True VB disegna in memoria finchč non fai un Refresh e
mostra quanto disegnato.
Questo sistema č ottimo per evitare sfarfallii, ma diventa poco efficace se
i refresh sono "a raffica" in quanto per portare a video una porzione di
immagine ci vuole comunque piů tempo che per tirare una riga.
Inoltre č Windows che si occupa del "ridisegno" nel caso in cui una finestra
venga coperta/scoperta.
Se usi AR = False invecie disegni direttamente a video, č molto veloce ma se
copri/scopri il disegno sei tu a dover pensare a ridisegnare (infatti
solitamente in questo caso si mette la sub di disegno nell'evento _Paint).
Inoltre questo sistema si presta a sfarfallare molto se ad es. usi la Cls
per pulire il grafico e ridisegnarlo aggiornato.
Ciao


Tutto cio' mi chiarisce meglio le idee sull'AutoRedraw... =)
Pero' non sono sicuro di aver capito se il sistema di refresh "manuale" e'
effettivamente il piu' efficente o esistono metodi "migliori"
La questione originale era e rimane: quali routine grafiche (e soprattutto -
a grandi linee - in che modo) si possono utilizzare per rendere la
visualizzazione di grafici real-time piu' efficiente?
GetPixel/SetPixel, MoveToEx, LineTo, sono alcune delle API che ho esaminato
e che mi sembrano piu' "consone" al lavoro che devo fare... c'e' di meglio?
Lokar.

 e che mi sembrano piu' "consone" al lavoro che devo fare... c'e' di
meglio?
No.
Rispetto alle funzioni VB ho notato un rapporto di velocità pari a circa
60:1, spece se usi il parametro del colore direttamente nei metodi line()
ecc.
Ciao


GetPixel usalo se "strettissimamente necessario" perché è poco pù rapido di
Point di VB
L'unico metodo più rapido per ottenere lo stesso è mappare la proprietà
image della picturebox in un'array di pixel e accedere al pixel via indici
x,y
Straveloce, ma abbastanza incasinato da implementare.
Poi GetPixel, come Point, non cattura i pixel fuori dalle estensioni della
picturebox a video
SetPixel/MoveToEx/LineTo le puoi sostituire tutte con la "ferrari" delle
prestazioni grafiche vettoriali: la PolyPolyLine
Tieni presente solo che SetPixel disegna un punto e la PolyPolyLine  disegna
solo linee con minimo 2 vertici, quindi il punto lo ottieni aggiungendo 1
alla  x  del secondo vertice
--
Fabio Guerrazzi
http://www.sourcecode4free.com/cgt
fab...@libero.it
fab...@si.tdnet.it