Italian problema misura tempi di reazione

zamb

Active Member
Licensed User
Ciao a tutti. eccomi di nuovo con il mio atavico problema di misurazione dei tempi di reazione.
Nel frattempo ho verificato come il vecchio detto "vieni giù dalla pianta" si adatti perfettamente a me infatti ho scoperto (meglio tardi che mai) che l'evento click sia su pulsante che su ImageView si scatena non alla pressione ma al rilascio e questo spiega tutti i miei precedenti problemi.
Infatti io assegnavo una immagine ad un ImageView e poi misuravo il tempo che intercorreva con tra questo ed il click sull'ImageView stessa dando un tempo limite di accettazione (scaduto il quale l'immagine era cancellata) e mi accorgevo, specie quando cliccavo un po' avanti nel tempo di accettazione (io l'ho chiamato "coda"), che iniziavo a toccare quando l'immagine era ancora certamente presente ma il sistema diceva che ero fuori tempo massimo. Da qui le ipotesi più assurde (ritardi di aggiornamento UI, lentezza SW, Sender, etc.). Ora mi accorgo che tutto dipendeva non da quando toccavo ma da quando rilasciavo. Spero che questo sia utile anche ad altri.
Era un giochino e può andare bene anche così...
Ora però vorrei misurare con discreta precisione quel tempo di reazione indipendentemente da quanto tengo premuto.
Ho provato con un pannello trasparente intercettandone l'evento TOUCH DOWN e con un pulsante intercettandone l'evento DOWN. Entrambi questi sovrapponendoli all'ImageVew da controllare.
Bene, ho stimato un ritardo tra circa 300 e 260 msec rispettivamente ai 2 sistemi di scatenamento dell'evento monitorato. Questa osservazione è corroborata, oltre dai valori standard in letteratura, anche dal test che faccio usando il sito http://www.earmi.it/varie/reazione/reazione.htm che mi dà tempi medi di circa 310 msec se uso il pc e di circa 850 msec se uso il cellulare ma non sapendo quale metodo usi il sito, non so spiegare la differenza tra i circa 260-300 msec di B4A citati ed i circa 540 ottenuti sul sito stesso.
Ora però temo che questi 260-300 siano anche funzione della velocità di Android sui diversi smartphone.
La domanda delle cento pistole è: esiste un metodo per rilevare con il minimo scostamento temporale (scostamento possibilmente indipendentemente dalla velocità dello smartphone) l'istante di tocco del display in un punto preciso?
 

LucaMs

Expert
Licensed User
Questa osservazione è corroborata, oltre dai valori standard in letteratura, anche dal test che faccio usando il sito http://www.earmi.it/varie/reazione/reazione.htm che mi dà tempi medi di circa 310 msec se uso il pc e di circa 850 msec se uso il cellulare ma non sapendo quale metodo usi il sito, non so spiegare la differenza tra i circa 260-300 msec di B4A citati ed i circa 540 ottenuti sul sito stesso.
Ora però temo che questi 260-300 siano anche funzione della velocità di Android sui diversi smartphone.
Sul desktop, a meno che non abbia un touch-screen, è ovvio che i tempi del mouse (meccanico) siano "molto" più lunghi.

La domanda delle cento pistole è: esiste un metodo per rilevare con il minimo scostamento temporale (scostamento possibilmente indipendentemente dalla velocità dello smartphone) l'istante di tocco del display in un punto preciso?
La differenza di potenza, come cpu, grafica, memoria ed anche sistema operativo ovviamente esiste, tra i diversi dispositivi.
Se lo scopo è far gareggiare due avversari con dispositivi diversi, la vedo dura, se non impossibile, se i valori sono pochissime centinaia di millisecondi!
 

zamb

Active Member
Licensed User
Sul desktop, a meno che non abbia un touch-screen, è ovvio che i tempi del mouse (meccanico) siano "molto" più lunghi.

Ma io ho tempi molto più lunghi sul cellulare rispetto al pc sia con tastiera che con mouse e non il contrario
Per quanto riguarda i ritardi sugli eventi Android speravo che fossero definiti a livello di sistema per filtrare eventi spuri e quindi non molto dipendenti dall'HW
 

udg

Expert
Licensed User
Aggiungo che i vari eventi finiscono in una coda che man mano viene smaltita, quindi non hai mai certezza che ciò che desideri misurare risulti in un valore coerente con la realtà.
Immagina il classico "albero" delle gare motoristiche. In teoria dovresti misurare il tempo intercorso tra il "verde" e la pressione dell'acceleratore. Ma se uno o entrambi gli eventi vanno in una coda che il sistema operativo prima e l'app (il suo processo) poi elaborano "quando possono", non puoi avere certezza che il tempo risultante sia pari a quello sperimentato nella realtà (cronometro alla mano e comunque soggetto ai tempi di reazione di un eventuale cronometrista, nel caso l'intero sistema non sia automatizzato)
 

Sagenut

Well-Known Member
Licensed User
Però sullo store si trovano app stopwatch al msec....
E chi ti dice quanto sia veritiera la loro precisione? ;)
Come detto sarà più o meno attendibile a seconda delle capacità del dispositivo.
E del suo stato di INTASAMENTO dovuto alla pulizia del SO da app inutili e simili.
 

Sagenut

Well-Known Member
Licensed User
Credo che più che prendere il
B4X:
DateTime.Now
nel momento in cui parte il gioco e poi riprenderlo nel momento in cui Activity.ACTION_DOWN viene eseguito ci sia poco altro da fare.
Il confronto tra i due dati ti darà una simil precisione al millesimo di secondo.
 

Sagenut

Well-Known Member
Licensed User
Probabilmente c'è anche uno scarto dovuto alla precisione della parte hardware che rileva l'orario.
 

zamb

Active Member
Licensed User
Credo che più che prendere il
B4X:
DateTime.Now
nel momento in cui parte il gioco e poi riprenderlo nel momento in cui Activity.ACTION_DOWN viene eseguito ci sia poco altro da fare.
Il confronto tra i due dati ti darà una simil precisione al millesimo di secondo.
Beh, nessuno mi garantisce che siano veramente precise ma, a meno di trucchetti nel codice, dando start e stop molto velocemente, riesco a vedere tempi di una decina di msec quindi mi aspetto, nonostante start e stop ritardati entrambi dai compiti svolti in contemporanea, che la variabilità possa essere contenuta entro i msec e non di qualche centinaio altrimenti vedrei i numeri del lotto...
 

Sagenut

Well-Known Member
Licensed User
Prova questo.
I miei migliori risultati sono stati da 82 a 102.
Click sul pannello blu per iniziare e fermare.
Molto rudimentale.
 

Attachments

zamb

Active Member
Licensed User
Prova questo.
I miei migliori risultati sono stati da 82 a 102.
Click sul pannello blu per iniziare e fermare.
Molto rudimentale.
Mah, che dire. A me dà risultati belli strani. Facilissimo ottenere 1 o 2 poi pare salti su valori più ragionevoli...
 

Sagenut

Well-Known Member
Licensed User
1 o 2?
Il mio record è stato 65 usando 2 dita quindi click quasi contemporanei.
Ma chi sei? Flash? 🤣🤣🤣
 

zamb

Active Member
Licensed User
1 o 2?
Il mio record è stato 65 usando 2 dita quindi click quasi contemporanei.
Ma chi sei? Flash? 🤣🤣🤣
Evidentemente c'è qualche cosa che non va. Effettivamente all'apertura del sorgente mi dice che è stato fatto con una versione più recente di libreria. Dovrò verificare...
 

sirjo66

Well-Known Member
Licensed User
ho scoperto (meglio tardi che mai) che l'evento click sia su pulsante che su ImageView si scatena non alla pressione ma al rilascio
Questa cosa pare ovvia, dato che il sistema Android ha due tipi di click: il click corto e il click lungo
Se l'evento "click" venisse generato alla pressione, come farebbe a distinguere il click corto dal click lungo ??
;)
 

Star-Dust

Expert
Licensed User
A questo punto meglio se intercetti l'evento Touch che quello Click, cosi puoi cogliere l'evento de tocco e non quello del rilascio

B4X:
Sub Activity_Create(FirstTime As Boolean)
'Activity.LoadLayout("Layout")
'
Dim obj As Reflector
obj.Target = MyImageView
obj.SetOnTouchListener("MyImageView_Touch")
End Sub

Sub MyImageView_Touch (viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean
  Select action
       Case 0 ' Down
             Log(x)
             log(y)
       Case 1 ' Up

       Case 2 ' Move

    End Select
  Return True
End Sub
 
Last edited:

zamb

Active Member
Licensed User
A questo punto meglio se intercetti l'evento Touch che quello Click, cosi puoi cogliere l'evento de tocco e non quello del rilascio

B4X:
Sub Activity_Create(FirstTime As Boolean)
'Activity.LoadLayout("Layout")
'
Dim obj As Reflector
obj.Target = MyImageView
obj.SetOnTouchListener("MyImageView_Touch")
End Sub

Sub MyImageView_Touch (viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean
  Select action
       Case 0 ' Down
             Log(x)
             log(y)
       Case 1 ' Up

       Case 2 ' Move

    End Select
  Return True
End Sub
Si. Debbo provare. Debbo ancora fare le prove con quanto inviatomi da Sagenut ma credo di dover aggiornare prima B4A perchè mi dice che la libreria che ho io è più vecchia della sua.
Per ora ho fatto prove con una serie di pulsanti usando l'evento DOWN perchè mi viene più semplice che gestire le coordinate; funziona ma non ho ancora certezze assolute della sua reattività.
Per il momento lavori in corso. Vi terrò informati...
 

zamb

Active Member
Licensed User
Caro Sagenut purtroppo confermo. Con il tuo sorgente anche dopo aver aggiornato alla 10.2 a me i risultati non cambiano. Se clicco velocissimamente (anche senza ricorrere al doppio dito) ho tempi assurdi di 1, 2 o 3 msec (!!) che poi improvvisamente schizzano a qualche centinaio. Non riesco ad ottenere i valori tra 65 e 100 che trovi tu. La segnalazione relativa alla libreria più recente non viene più visualizzata e quella che mi ritrovo (Core, è la versione 9.9). Altro mistero....
Tieni conto che i miei riflessi, testati con altri metodi ufficiali si attestano al limite superiore di normalità per la fascia di età 45-60 aa anche se ne ho 71.
Mentre confermo a StarDust che mi sto muovendo in quella direzione anche se, dopo diverse prove, mi pare che l'evento DOWN di pulsanti trasparenti siano la soluzione migliore
 

Filippo

Expert
Licensed User
A questo punto meglio se intercetti l'evento Touch che quello Click, cosi puoi cogliere l'evento de tocco e non quello del rilascio

B4X:
Sub Activity_Create(FirstTime As Boolean)
'Activity.LoadLayout("Layout")
'
Dim obj As Reflector
obj.Target = MyImageView
obj.SetOnTouchListener("MyImageView_Touch")
End Sub

Sub MyImageView_Touch (viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean
  Select action
       Case 0 ' Down
             Log(x)
             log(y)
       Case 1 ' Up

       Case 2 ' Move

    End Select
  Return True
End Sub
Prova a usare invece un Panel, è più semplice e non c'è bisogno di usare la libreria "Reflector".
 

zamb

Active Member
Licensed User
No, no. Sto usando direttamente l'evento down sul pulsante senza reflector e mi intercetta l'inizio della pressione e mi pare più veloce di circa 30 msec rispetto al touch sul panel senza contare che non debbo gestire le coordinate sui diversi schermi...
 
Top