Autore Topic: Grafica un pò lenta...  (Letto 2378 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Grafica un pò lenta...
« il: 15 Febbraio 2008, 17:45:27 »
Nei miei approcci con Gambas, ho avuto modo di fare abbastanza esperimenti a livello di disegno grafico e ho notato che, a differenza di altri linguaggi, oltre certi limiti Gambas diventa piuttosto lento.
Non ho potuto sperimentare la parte di librerie gtk, di cui ò che possono esserci problemi, ma con le qt ho sicuramente notato questa cosa.

Es.: se disegniamo linee, testi o rettangoli, colorati o meno, con la funzione draw() su una DesignArea di piccoli dimensioni, il problema non si verifica a meno di non disegnare un numero cosmico di oggetti grafici.
Se, diversamente, allarghiamo quest'area su dimensioni notevoli, ad esempio 2000x2000, a questo punto si verifica il problema di lentezza.

La lentezza si nota se si interagisce con questi oggetti grafici, ovvero si abilitano gli eventi del mouse, in modo da poter selezionare e spostare un singolo oggetto sul piano grafico; il ridisegno degli oggetti inizia a diventare notevolmente lento, causato probabilmente dal fatto che occorre aggiornare l'intera area.

Ho fatto delle prove comparative con altri linguaggi, ad esempio python e java, e indipendentemente dalle dimensioni dell'area di disegno, gli oggetti vengono disegnati alla stessa velocità di uno solo, con nessun refresh fastidioso o tentennamento del mouse.

Non sò se questo dipende dal ponte tra le librerie Gambas e quelle QT, ma sicuramente c'è qualcosa che non và.

Che ne dite, si può segnalare al team di Gambas ???

Bye

Offline Pixel

  • Amministratore
  • Maestro Gambero
  • *****
  • Post: 414
    • Mostra profilo
    • http://www.gambas-it.org
Re: Grafica un pò lenta...
« Risposta #1 il: 15 Febbraio 2008, 18:25:22 »
Siccome sto eseguendo degli esperimenti a riguardo, mi interessa sapere come riesci a rilevare un oggetto tracciato.
Ipotizziamo di tracciare una linea in diagonale, tu riesci a rilevare un qualsiasi punto della linea?
Io sto percorrendo due strade:
1) gestisco un array di oggetti e rilevo la posizione sulla base della superficie dell'oggetto all'interno della DrawingArea
2) genero una matrice pari alla superficie della Drawing ed attribuisco ogni punto come appartenente all'oggetto.

Per quanto riguarda la tua segnalazione, impostando la DrawingArea con cache=True e generando un unico motore di rendering riesco ad ottenere dei risultati di refresh notevoli anche su superfici da 2500x2500 (ho tirato anche un 5000x5000).

Ciao
Ubuntu Italian Member Ubuntu User 4683
Il mio Blog

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Grafica un pò lenta...
« Risposta #2 il: 17 Febbraio 2008, 11:41:59 »
Guarda, come esempio ti porto al mio programmino pgDesigner (puoi trovarlo su sf.net), che ho iniziato a sviluppare da ormai più di un anno, rivoluzionandolo ogni volta per cercare di trovare il modo più adatto per velocizzare il più possibile il disegno. Questo programma non è altro che una specie, se hai presente, di Erwin o Oracle designer, solo che è fatto per postgres.
Ora,
Per i punti, come hai scritto, in effetti data l'assenza di un qualche funzione che possa aiutarti a capire se un pixel è più o meno accesso, e magari di che colore, devi per forza farti una mappa personale in memoria (cosa che è abbastanza pesante). Il programma in questione disegna una certa quantità di recttangoli contenenti righe di testo, hai presente una tabella con il nome scritto in testata e l'elenco dei campi a seguito ? Una specie di piccola form insomma. Questi rettangoli, se definiti tabelle, posso essere collegati tramite linee, più o meno rette (dipendentemente dalle impostazioni utente), con a volte dei testi scritti.
Insomma, ogni oggetto si disegna da solo nell'area grafica, e un loop esegue l'operazione. Se questi oggetti raggiungono una certa quantità, il refresh dell'area diventa fastidioso, come se dovessi dipingere a mano un quadro... :-)
Ti ricordo che questi oggetti devono essere spostati tramite mouse, ritracciando le linee di relazione in modo costante, per cui l'immagine finale non è statica.
Se hai provato a disegnare pochi oggetti, questa cosa non si nota, o perlomeno si nota appena.
La scappatoia che ho trovato io? Disegno ogni oggetto su una picture (ridimensionabile a seconda del contenuto), e ogni oggetto è associato al contenitore che è poi l'area di disegno; le linee invece sono costretto a disegnarle nell'area direttamente. In questo modo il movimento degli oggetti viene gestito direttamente dal motore grafico, e io devo controllare solo che un elemento non esca dai margini.
Nelle ultime versioni ho aggiunto un'ulteriore oggetto, un'area rettangolare, più o meno colorata con testo incluso, ridimensionabile dall'utente tramite il mouse; purtroppo, per il suo scopo, quest'oggetto deve venir disegnato alla stregua delle linee, per il fatto che questo non deve mai coprire un oggetto tabella (ovviamente). Ancora una volta, purtroppo, mi sono scontrato con la lentezza delle librerie, e questa volta la causa è la dimensione di queste aree, oltre al loro movimento.
Tanto per la cronaca, l'area di disegno ha le dimensioni di 3x4 fogli in formato A4, più o meno 3000x2000.
La prova con cache=true l'ho fatta, ed è tuttora impostata, ed è stata obbligatoria, altrimenti ero ancora in attesa del refresh... :-)
Per il rilevamento dei punti, come ho già accennato, devi per forza tenere traccia del grafico, ma per fortuna io non ne ho necessità.

Sempre come ho scritto nel precedente msg, ho fatto prove con altri linguaggi e questa cosa non è avvenuta, nonostante si aggancino quasi tutti alle stesse librerie (qt o gtk). Python, ad esempio, ha un oggetto simile alla AreaDrawing, che ha la possibilità di sapere le caratteristiche di tutti gli oggetti grafici che hai disegnato (es. posizione, colore, ecc.); in java ho notato con stupore che la parte grafica è stata potenziata notevolmente, raggiungendo livelli quasi pari al C/C++.

Credo che Gambas dovrà faticare non poco per raggiungere questi livelli, ma io confido che al più presto sarà veramente un linguaggio completo, anche visti i notevoli progressi fatti in questo poco tempo di vita.
L'idea di sviluppare il mio progetto è stata proprio quella di scoprirne le funzionalità e la potenza, e devo dire che Gambas mi piace.
Spero possa essere in un prossimo futuro un'alternativa valida al basic di windoz.

Comunque, visto il tuo interessamento, se tu serve aiuto in qualche tuo progetto, oppure esperimento in genere, sono ben felice di darti una mano (sempre dipendentemente dal tempo a disposizione...).

Bye

Offline Pixel

  • Amministratore
  • Maestro Gambero
  • *****
  • Post: 414
    • Mostra profilo
    • http://www.gambas-it.org
Re: Grafica un pò lenta...
« Risposta #3 il: 17 Febbraio 2008, 12:25:58 »
Più o meno immaginavo una risposta del genere, speravo tu avessi trovato l'uovo di colombo :nulla:
In questo momento sto seguendo 2 esperimenti, appena ho qualche cosa di più o meno funzionante lo metto sul sito e vediamo se può servire.

Grazie delle info e della disponibilità. ;-)
Ciao
Ubuntu Italian Member Ubuntu User 4683
Il mio Blog

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Grafica un pò lenta...
« Risposta #4 il: 17 Febbraio 2008, 20:10:35 »
Di nulla...

No, l'uovo me lo sono mangiato... Purtroppo, come ho scritto, le prove credo di averle fatte tutte; se hai necessità di interagire con il grafico, come ho fatto io, avrai dei problemi. Mi sono dimenticato di dirti che ovviamente dipende anche dalla potenza della macchina, probabilmente su un dualcore la cosa è minimizzata.

Comunque, se lo trovi tu l'uovo, prima di fartelo alla coque, fammelo sapere... :-)

Scherzi a parte, magari lo trovassi davvero!