Autore Topic: Velocità grafica  (Letto 2704 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Velocità grafica
« il: 18 Settembre 2010, 15:59:59 »
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...):

Citazione
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...  :rolleyes:

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...


Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Velocità grafica
« Risposta #1 il: 18 Settembre 2010, 16:22:15 »
La butto lì.....hai provato ad estraniare lo zoom dal form in cui la drawing area si trova....magari gambas ridisegna tutto il form e questo porta via un po' di tempo....

prova a creare un form esterno in cui visualizzare lo zoom.....

Perchè ti dico questo? pensavo: il visualizzatore di immagini dei sistemi operativi ingrandisce le immagini impiegando pochissimo tempo....questo perchè in fin dei conti la finestra è semplice...magari riesci a guadagnare qualche secondo così.....

Oppure dovresti inglobare un visualizzatore di immagini già esistente nel tuo progetto...quando qualcuno vuole fare lo zoom tu salvi l'immagine e la passi al visualizzatore che si occupa di zoomarla per te....

Le mie sono solo stupide supposizioni poichè non mi sono mai trovato nella tua situazione...

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Velocità grafica
« Risposta #2 il: 18 Settembre 2010, 17:51:40 »
visto che disegni in un a picture in memoria, hai provato a vedere se una picture box impiega meno tempo a caricare l' immagine del buffer?

per lo strect non saprei... non capisco perchè fai uno strech .. non puoi ridisegnarlo ingrandito?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #3 il: 20 Settembre 2010, 00:35:55 »
[per Cesko]
Il disegno non interessa la form, e la drawingarea è incastonata in una serie di contenitori. Ad ogni modo, l'aggiornamento viene pilotato solo sulla drawingarea, e il refresh della form non viene interessato.
Tieni conto che i dati che ho pubblicato, sono il risultato di analisi all'interno della funzione stessa, per cui non viene fatto altro oltre a quello che ho analizzato.
Il visualizzatore di immagini cosa c'entra? Se parli di uno dei programmi che di solito è fornita una distro, il discorso non centra, perchè riguarda Gambas, e le sue librerie grafiche. Ovviamente gli altri programmi sono stati creati con altri linguaggi, magari più a basso livello. Comunque, tutto ciò non entra in merito...  :-\

[per fsurfing]
Nessuna differenza con le picturebox, perchè non ha senso usare una picturebox di quelle dimensioni, e se poi non la usi per il suo scopo.
Nella prima stesura di pgDesigner, avevo utilizzato le picturebox per creare gli oggetti, questo per poter facilmente interagire con essi, muovendoli nel diagramma. Dato che, poi, analizzando e provando, ho notato che le differenze di velocità, gestibilità, e congruità rispetto al disegnare gli elementi direttamente sul diagramma, non erano apprezzabili e, oltretutto mi semplificava di molto agire direttamente sul diagramma, ho abbandonato la cosa nella versione 2.x.
Come da prospetto, il problema si pone solo con l'uso di particolari metodi di gambas, a cui non posso porre rimedio, se non andare a modificare il codice sorgente (in C). Il disegno di tutti gli oggetti, tenendo presente che questi possono cambiare interattivamente, ovvero spostati e ridimensioni tramite il mouse da parte dell'utente, non ha praticamente ritardi apprezzabili. Il problema si pone sulla copia tra l'immagine in memoria e la drawingarea, in particolare se si applica una trasformazione (appunto lo stretching).
Io posso anche capire lo stretch, a cui occorre un serie di algoritmi per poter traformare i pixel del disegno in modo da adattarli alle dimensioni volute, ma sulla copia non lo capisco. La velocità con cui dovrebbero essere copiati i pixel non dovrebbe essere visibile, addirittura 7 secondi!
Immaginate un DM come kde, o gnome, che ci mette ogni volta sette secondi per processare i pixel dello schermo. Dopo un paio di minuti, prenderesti una mazza, e distruggi il monitor...  :hatecomputer:

Infine, è anche probabile che la funzioni di zoom a cui ho pensato, possa essere in qualche modo poco ottimale, ma sono obbligato a farla, dato che gli oggetti devono comunque poter essere manipolati tramite il mouse, ovvero trascinati, ridimensionati, ecc. In più, ogni qualvolta l'utente interviene, cambiando una impostazione di progetto, o una particolare proprietà del singolo oggetto, questo deve essere ricalcolato e ridisegnato, per poter immediatamente vedere la nuova struttura.

Pensandoci bene, in effetti questo mio dilemma me lo porto appresso dall'inizio del progetto, e sò anche benissimo che si tratta di uno dei limiti di gambas2, che spero abbiano in qualche modo migliorato con la versione 3.

Un pò di tempo fà, a seguito di queste considerazioni, avevo provato a riportare il progetto pgDesigner in Python e Java, e devo dire che le cose cambiano totalmente. La velocità delle funzioni di disegno sono impressionanti rispetto a gambas, oltre al fatto che hanno caratteristiche molto potenti, come ad esempio la gestione dei layer.

Vabbè, ho passato questo week, pensando e ripensando alla cosa, e non ne sono venuto fuori. Vorrà dire che dovrò mettermi sotto a provare Gambas3, per vedere se migliora qualcosa. Una pulce me l'ha messa Milio in un'altra discussione, e spero che si riscontri vera.

Grazie comunque per i tentativi che ho molto apprezzato, ma rimango comunque aperto ad eventuali altre idee, e il thread lo lascio open!  :ok:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Velocità grafica
« Risposta #4 il: 20 Settembre 2010, 12:44:09 »
molto starno però! ho fatto delle prove e una picture di 13000X13000 mi viene disegnata sulla drawing in 4.2 e-5  secondi
logicamente lo stretch impiega del tempo...

ma perchè quando fai zoom invece di ingrandire l' immagine non la ridisegni direttamente impostando alle dimensioni di ogni oggetto lo zoom?

Offline Pixel

  • Amministratore
  • Maestro Gambero
  • *****
  • Post: 414
    • Mostra profilo
    • http://www.gambas-it.org
Re: Velocità grafica
« Risposta #5 il: 20 Settembre 2010, 13:45:13 »
G2 è sempre stato "debole" nella gestione della potenza grafica e la riprova è la creazione di una specifica libreria in G3.

Per ovviare alla lentezza si possono usare vari artifici:
non visualizzare in tempo reale il disegno
disegnarlo su una zona invisibile e successivamente ricopiarlo (caricandolo proprio come immagine e non come copia da drawing a drawing)
creare dei falsi zoom (tipo solo il contorno dell'oggetto)
Ovviamente tutto questo non va certamente a vantaggio della qualità del progetto.
Ubuntu Italian Member Ubuntu User 4683
Il mio Blog

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #6 il: 20 Settembre 2010, 14:09:46 »
Citazione
molto starno però! ho fatto delle prove e una picture di 13000X13000 mi viene disegnata sulla drawing in 4.2 e-5  secondi
logicamente lo stretch impiega del tempo...
Infatti, la copia della picture impiega 5 secondi. il fatto che a me ne segna 7 può dipendere da altri fattori, e non è detto che siano legati proprio a gambas. Tieni conto che il sistema ha comunque in piedi dei servizi (molti) ed è a 64bit, per cui in alcune parti sembra più lento ad elaborare.
Comunque la tua prova è il riscontro delle mie...

Citazione
ma perchè quando fai zoom invece di ingrandire l' immagine non la ridisegni direttamente impostando alle dimensioni di ogni oggetto lo zoom?
Prova già fatta e scartata subito, per il fatto che complica notevolmente la gestione. L'idea sarebbe buona, ma il numero e le tipologie di oggetto disegnabili sono abbastanza, e già ci sono un certo numero di parametri che transitano tra le varie funzioni. La cosa che ho notato manca alla gestione degli oggetti (o classi) è il fatto di poter definire una stessa funzione con diversi parametri, e l'interprete chiama quella corretta in base a come viene chiamata, un pò come funziona in C/Java. Questo mi ha obbligato a creare e duplicare alcuni oggetti, rendendo un pò arzigogolata la gestione.
Citazione
G2 è sempre stato "debole" nella gestione della potenza grafica e la riprova è la creazione di una specifica libreria in G3.

Per ovviare alla lentezza si possono usare vari artifici:
non visualizzare in tempo reale il disegno
disegnarlo su una zona invisibile e successivamente ricopiarlo (caricandolo proprio come immagine e non come copia da drawing a drawing)
creare dei falsi zoom (tipo solo il contorno dell'oggetto)
Ovviamente tutto questo non va certamente a vantaggio della qualità del progetto
Infatti pixel, questo è stato ribadito più volte e in diverse occasioni, specialmente da me medesimo.
Riguardo agli artifici, ne ho implementati parecchi, oltre al sistema di caching (doppia immagine memoria->drawing) usata nel progetto.
Nonostante questo, che comunque ha notevolmente aumentato la velocità rispetto le prime versioni, mi trovo ora al punto di stop. Oltre le funzioni base di Gambas non posso, e non volglio, andare.

Citazione
creare dei falsi zoom (tipo solo il contorno dell'oggetto)
Questo non posso farlo, perchè il dettaglio deve essere sempre visibile, oltre al fatto che l'oggetto deve essere interattivamente gestibile.

Offline Pixel

  • Amministratore
  • Maestro Gambero
  • *****
  • Post: 414
    • Mostra profilo
    • http://www.gambas-it.org
Re: Velocità grafica
« Risposta #7 il: 20 Settembre 2010, 16:19:41 »
Citazione
creare dei falsi zoom (tipo solo il contorno dell'oggetto)
Questo non posso farlo, perchè il dettaglio deve essere sempre visibile, oltre al fatto che l'oggetto deve essere interattivamente gestibile.
Ah.. non ho mai usato Pgdesigner e quindi non ho idea di che succede quando esegui lo zoom ;D
Ubuntu Italian Member Ubuntu User 4683
Il mio Blog

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #8 il: 20 Settembre 2010, 16:25:55 »
Ma come !?!?!? Mai usato pgDesigner? E non ti vergogni manco un pochino ?  >:( :evil:


 :P :P :P :bad: :bad: :bad: :rotfl: :rotfl: :rotfl:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Velocità grafica
« Risposta #9 il: 20 Settembre 2010, 16:40:57 »
mi sono espresso male, intendevo dire che a riempire la drawing con una picture mi impiega 4,2 esponente -5 secondi ovvero nulla, mi pare strano che a te ne impiegi 5 secondi

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #10 il: 20 Settembre 2010, 16:58:40 »
Ha, allora dimmi a livello di codice cosa hai fatto.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Velocità grafica
« Risposta #11 il: 20 Settembre 2010, 19:26:13 »
bho niente di che..

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #12 il: 21 Settembre 2010, 12:07:01 »
Perdona, ma come fà a funzionarti? A me blocca tutto...

Il disegno di quei cerchi l'ho ridotto a 5, ma ad ogni modo c'è qualcosa che non và.
E' pur vero che lo stò provando con il mio portatile in virtuale, ma non capisco perchè si inchioda...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Velocità grafica
« Risposta #13 il: 21 Settembre 2010, 12:25:00 »
Credo di aver trovato il problema fondamentale... la gestione della memoria....

Stò facendo girare su una macchina virtuale (con 1G di ram) il tuo programmino di esempio e, nonostante abbia limitato i loop di creazione, ci ha messo 5 minuti prima di dare un risultato ma, stranamente, ma come hai affermato, tutto a zero.

Questo non è proprio possibile, a meno che non subentri il discorso memoria. E' probabile, e dico probabile, che la gestione della memoria abbia un aspetto fondamentale nella velocità di esecuzione. Quello che è strano è che il mio sistema a casa ha ben 8Gbyte di ram, quindi dovrebbe sciacquare dentro come una rana nel lago di Como...  ;D

Questa anomalia si riscontra anche nel timer che, a quanto pare inizia a contare quando in effetti la memoria termina di essere riempita.
Dopo i 5 minuti, il controllo ritorna e, sia i timer  che le elaborazioni grafiche, iniziano ad essere processate.

Di certo è che le dimensioni della drawing sono ragguardevoli, se parliamo in puri pixel, escludendo l'oggetto in sè, abbiamo un numero totale di 169 miglioni di pixel, che rapportati in byte (da 8) sono oltre 20 MByte... Cavolo!!! Non avevo considerato questa cosa... anche se, in ogni caso, non giustifica i tempi...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Velocità grafica
« Risposta #14 il: 21 Settembre 2010, 15:00:37 »
Di certo è che le dimensioni della drawing sono ragguardevoli, se parliamo in puri pixel, escludendo l'oggetto in sè, abbiamo un numero totale di 169 miglioni di pixel....

Poi dite a me... ;D