2012-06-01 21 views
8

Ho impostato il on_motion per gestire EVT_MOTION. Voglio la posizione del mouse per in modo interattivo generando un'immagine specifica di coordinate, ma WxPython ha un ritardo di ~ 400ms nella registrazione di eventi di movimento successivi. Il che rende l'interfaccia lenta.Perché il rilevamento del movimento WxPythons è così lento?

Perché lo EVT_MOTION è così lento e come lo risolvo? L'ho provato in Ubuntu 11.10 e WinXP e i ritardi sono paragonabili?

Ho bisogno di tempi di risposta rapidi per selezionare una porzione da un'immagine come mostra l'immagine. Così com'è, i "cross-hair" seguono il mouse troppo lentamente.

enter image description here

Ecco il codice che ho provato EVT_MOTION:

def on_motion(self, event): 
    """mouse in motion""" 
    #pt = event.GetPosition() 
    self.mouseover_location = event.GetPosition() 
    self.t2 = time.time() 
    print "delay",self.t2 - self.t1 
    self.t1 = self.t2 

delay 0.379776954651 
delay 0.00115919113159 
delay 0.421130895615 
delay 0.416938066483 
delay 0.376848936081 
delay 0.387464046478 
delay 0.40311384201 
delay 0.392899036407 
delay 0.385301113129 
delay 0.422554969788 
delay 0.355197906494 
+1

Potrebbe essere altri eventi che vengono gestiti in mezzo? forse qualche disegno costoso che sta accadendo forse – GP89

+1

vorrei cross-post al gruppo Google wxPython. E pubblica anche un piccolo esempio eseguibile. –

+2

Hai pensato di creare una discussione dedicata solo al rilevamento del mouse?Un ciclo cosntante di "dove si trova l'aggiornamento del trigger del mouse. Se il problema è EVT_MOTION questo lo risolverà. Se il problema è la velocità di disegno, dovresti essere in grado di vederlo anche tu. – acattle

risposta

3

La domanda così com'è è incompleta, in quanto non esiste un'app campione per dimostrare il problema. Tuttavia, direi che il gestore del movimento non ha nulla a che fare con il tuo problema, perché molto probabilmente stai facendo alcune costose operazioni tra i successivi gestori di movimento (come l'aggiornamento dell'intera tela di disegno).

Se questo è il caso (e si può facilmente controllare se la vostra routine di vernice si chiama tra eventi di movimento del mouse), vorrei suggerire quanto segue:

  1. Se il disegno che roba da soli, in modo che tu sei usando doppio buffering (via wx.BufferedPaintDC);
  2. Se la vostra routine di disegno viene effettivamente chiamata tra i movimenti del mouse, provare e aggiornare solo la parte danneggiata della trama (tramite RefreshRect);
  3. Usa wx.Overlay per disegnare la tua selezione rettangolare (ci sono alcune demo disponibili su come farlo);
  4. Pubblica una piccola e eseguibile app di esempio che mostri il problema.
+0

Sì, è stata un'operazione di disegno costosa che richiede 0,35 secondi. L'ho ridotto a 0,1 e più liscio. Ho assunto che il rilevamento degli eventi funzioni in modo asincrono rispetto al disegno (e funziona come un vero multithreading). E chiamo 'Refresh()' ogni volta che acquisisco una nuova immagine. – aitchnyu

2

Il EVT_MOTION viene licenziato ogni volta che il mouse viene spostato! Se quindi si chiama event.GetPosition() su ogni movimento e si elaborano anche i dati, questo rallenterà le prestazioni. Come sarebbe utilizzare EVT_LEFT_DOWN o qualcosa di simile, e quindi ottenere la posizione ed elaborare tali dati. Questo sarà molto più efficiente dato che stai cercando solo una certa area dell'immagine.

+0

_ "Se si chiama event.GetPosition() su ogni movimento e si elaborano anche i dati" _ si prega di approfondire. Ho bisogno di guide per individuare il mirino, almeno quando l'utente si avvicina (con il suo puntatore) al punto desiderato. – aitchnyu

+1

In tal caso, è necessario rendere più veloce il "codice di disegno". Prova a commentare le cose e vedi se la velocità sta migliorando. Se non riesci a renderlo più veloce in un singolo thread, prova ad aggiungerne un altro. –

2

Avremo davvero bisogno di vedere cos'altro sta succedendo nell'applicazione per essere in grado di darvi risposte significative, anche se molte persone sono in grado di risolvere i problemi stessi nel processo di creazione di un piccolo campione che dimostra il problema da condividere con gli altri.

http://wiki.wxpython.org/MakingSampleApps

Ottimizzazione come si sta disegnando il mirino e/o come si sta rinnovando il contenuto principale della finestra è probabilmente la scelta migliore, ma fino a quando si condivide maggiori dettagli tutto ciò che possiamo fare è indovinare.

Problemi correlati