Dato che allo stato attuale, con Gambas2, non sono riuscito a trovare sistemi per velocizzare il disegno su una DrawingArea, pongo questo quesito, nell'eventualità che qualcuno abbia qualche idea a cui non ho pensato...
Il problema è il seguente:
sò che ormai parlo solo di pgDesigner, ma è proprio su questo che stò lavorando per poter ottimizzare il disegno dei diagrammi.
In pratica ho un pannello, una DrawingArea, di dimensioni variabili, e comunque non inferiori a 500x500 pixel (può arrivare a dimensioni ragguardevoli, es. 16000x16000, su cui vengono disegnati diversi oggetti, il cui contenuto varia a seconda di alcune impostazioni.
Dalle prove che ho fatto, i tempi di elaborazione e disegno di questi oggetti, anche se di numero ragguardevole, sono calcolabili in millisecondi, per cui apprezzabili. Il problema nasce dalla necessità di implementare un sistema di zooming, in modo che il diagramma venga ridimensionato, ivi gli oggetti che contiene, rispetto ad una impostazione, che può variare dal 25% fino al 400%.
Onde evitare di ridimensionare l'area se non viene modificata rispetto alle dimensioni originali (100%), effettuo una semplice copia dell'immagine che, tra le altre cose tengo bufferizzata in un'oggetto Picture in memoria. Questa copia è praticamente indolore, nel senso che, nonostante le dimensioni del diagramma, è all'ordine anch'essa di pochi millisecondi.
Il problema si presenta, quando la procedura si accorge che c'è da effettuare un stretching, ovvero un ridimensionamento dell'immagine, rispetto alle impostazioni di base, ovvero se viene richiesto di ridurle o aumentarle secondo una determinata percentuale. In questo caso sono stato obbligato ad usare il metodo Stretch dell'oggetto Image, passandogli i giusti parametri di altezza e larghezza.
Dai test che ho effettuato, dopo aver ottimizzato tutto il codice che la procedura utilizza per il disegno, sono arrivato al punto in cui oltre non posso andare, ovvero devo usare una funzione (Stretch) di cui non sò assolutamente nulla.
I test, dicevo, mi hanno dimostrato che i tempi che alle funzioni, in particolare Image.Copy() e Image.Stretch(), occorrenti per completare il processo, sono tangibili, nell'ordine di secondi o decine di secondi, il che vuol dire che l'utente che guarda il diagramma, deve attendere molto prima di vederne i risultati, e devo dire che a me che l'ho costruito dà molto fastidio.
Tanto per fornire alcuni numeri, di seguito il debug di ogni singola operazione, tenendo presente che l'esempio di seguito mostrato si riferisce ad una elaborazione di stretching al 400%, con un diagramma finale di dimensioni pari a 12736x13476 pixel (un bel numero...):
Dimensioni finali DrawingArea: 12736,13476
Percentuale di zoom applicata: 400%
Disegno di tutti gli oggetti: Start: [09/18/2010 15:15:24.679] Tempo (secondi):
Semplice copia dell'immagine bufferizzata: Start: [09/18/2010 15:15:24.680] Tempo (secondi):
Stretching dell'immagine: Start: [09/18/2010 15:15:24.680] Tempo (secondi): [12]
Disegno del buffer sulla DrawingArea: Start: [09/18/2010 15:15:37.353] Tempo (secondi): [7]
Come si può notare, le uniche funzioni che hanno un tempo apprezzabile, sono relative allo strething e alla copia dell'immagine.
Devo anche dire che la cosa è proporzionale, ovvero al 200% i tempi diminuiscono della metà, e così via...
Con fattori di zoom inferiori al 100%, i tempi sono uguali a zero.
Come ho scritto, ogni singola riga del log si riferisce ad una determinata funzione dell'oggetto Picture (o Image), ovver il metodo chiamato, senza ulteriori codifiche inframmentate.
Come ultimo, faccio anche notare che il tutto ha girato sul mio pc, che ha una sk madre Asus, processore Intel QuadCore 2.5MHz, 8Gb di ram 800MHz, sk video NVidia Geforce 9300... e ho detto tutto...
Sò che qualcuno del forum ha avuto modo di giocare con la grafica in Gambas, e forse può darmi un suggerimento su modi migliori, o alternativi, per poter velocizzare il tutto...