Cerca

modulo attività

modulo tecnica

Login Form

In questo articolo si illustrano i risultati di ulteriori esperimenti eseguiti con Scratch per sondarne alcune caratteristiche di velocità in aggiunta a quelli esaminati qui link1.

Viene provocata una rotazione di 7 gradi più volte e si cerca di misurare il tempo impiegato a compiere tutte le rotazioni richieste (nota 1) utilizzando script differenti.

La rotazione multipla può essere effettuata vantaggiosamente utilizzando i cicli di ripetizione ma si deve ricordare che i comandi di controllo del flusso delle istruzioni hanno una notevole incidenza sui tempi di calcolo per i loro legame con l'aggiornamento della grafica.

Per lo scopo è stato scritto un progetto specifico reperibile a questo link1 a cui conviene riferirsi per vedere come sono stati scritti tutti gli script per realizzare l'esperimento.

Sullo stage vengono disposti cinque sprite che compiono delle rotazioni sulla base dei rispettivi script.

Premendo i tasti numerici si avviano processi diversi e si misurano i tempi impegati per completare i comandi utilizzando il cronometro interno di Scratch.

 

Dopo aver premuto [bandierina verde] si ottiene uno stage pulito.

Di seguito si esaminano i risultati dei singoli esperimenti.

 

I seguenti esperimenti vengono svolti utilizzando la modalità "editor" e senza il "turbo".

[tasto 1]

Lo sprite deve compiere 500 rotazioni di 7 °. 

Il compito viene realizzato scrivendo 500 volte di seguito il singolo comando "ruota di 7°" suddiviso in 10 blocchi da 50 comandi

In questo modo non si utilizzano comandi di controllo del flusso.

Non si osserva alcun movimento rotatorio mentre la rotazione dello sprite scatta nella posizione finale di -100°.

Il tempo misurato è 0,00 s che significa solo che non è misurabile con i mezzi che offre Scratch stesso.

Il calcolo è comunque rapidissimo ma non si osserva movimento.

La rotazione risultante corrisponde al calcolo "resto di (500*7/360)" = 260° = -100°.

 

[tasto 2]

Si utilizza 10 volte consecutivamente il ciclo "ripeti 10 volte per fare compiere in tutto 100 rotazioni di 7°.

Il tempo impiegato è 3,33s, si vede lo sprite ruotare fino alla posizione finale di -20°.

La posizione finale corrisponde al calcolo "resto di (100*7/360)" = 340 = -20

Si può calcolare che per ogni rotazione di 7° Scratch abbia impiegato 3,33/100 =  0,0333s.

In altri termini, Scratch ha fatto compiere 30 rotazioni in un secondo.

Questo è un risultato già emerso nell'esperimento link1.

Si conferma che la presenza del ciclo di ripetizione impone il ridisegno del quadro al ritmo previsto di 30 frame al secondo.

 

[tasto 3]

Con un comando "ripeti 10 volte" si produce una sequenza di 50 rotazioni.

Il tempo impiegato è di 0,332 s.

Il movimento di rotazione che si osserva è retrogrado e la posizione finale è -100°.

Il tempo impiegato corrisponde al fatto che sono stati eseguiti 10 cicli di durata identica a quella misurata nel caso precedente.

Il moto retrogrado è spiegabile col fatto che al termine di ogni ciclo, lo sprite ha ruotata di 50*7° = 350°

Dato che il ridisegno del quadro avviene al termine di ogni ciclo accade che dopo ciascun ciclo si trova 10 gradi indietro.

Quanto si vede è correlato con l'effetto stroboscopico.

 

[tasto 4] 

Si provoca la stessa rotazione  del caso [tasto 2] ma con un solo ciclo di 100 ripetizioni.

Il risultato è pressoché identico: durata 3,34 s. 

È interessante vedere cosa accade se non si mostra lo sprite.

Per questo caso si preme [tasto 7] e si vede che il tempo diventa molto minore: 0,032 s o non è nemmeno misurabile.

Se si mostra lo sprite solo dopo che c'è stata la rotazione si vede che occupa la posizione prevista.

Il ridisegno del quadro richiede tempo. Se non si deve mostrare lo sprite in rotazione, Scratch non provvede a ridisegnare il quadro e svolge i calcoli più velocemente.

 

[tasto 5]

Si comanda 50 volte la rotazione di 7° con una sequenza come fatto nel caso di [tasto 1] ma questa volta si impone ad ogni rotazione un calcolo che sembra gravoso contenendo diverse funzioni trascendenti.

Non si vede la rotazione, la posizione finale è -20° come atteso ma la durata non è misurabile.

Se si aggiunge al gruppo dei calcoli un comando "attendi 0 s" si vede la rotazione e la durata diventa di 3,33 s. (la modifica dello script va fatta in modalità editor ma la misura della durata va fatta in modalità player) 

 

[tasto 6]

Utilizzando la stessa impοstazione del caso di [tasto 1] con solo 30 rotazioni di 7° ma con un comando "attendi 0 s" si vede lo sprite ruotare ed il tempo impiegato è 1 s.

Anche la funzione di ritardo, seppur di 0 s, produce la forzatura del ridisegno del quadro con la conseguente animazione visibile.

 

Tutte le prove si possono ripetere con la modalità "turbo".

Tranne il caso [tasto 6] tutti gli sprite ruotano istantaneamente alla posizione finale e la durata non è misurabile.

Può significare che in modalità turbo i cicli non provocano il ridisegno del quadro con la conseguente perdita di tempo.

Il caso [tasto 6]  mostra ancora la rotazione e la durata resta la stessa di quasi un secondo.

Il comando di attesa viene comunque rispettato anche in modalità turbo a differenza degli altri comandi della stessa categoria (nota 2).

Lo stesso accade con [tasto 5] se si aggiunge il comando di "attendi 0 s" al gruppo dei calcoli.

 

Se si lavora in modalità player si possono osservare notevoli rallentamenti dovuti al fatto che il computer deve ridimensionare tutti i disegni per adattarli alla definizione dello schermo in uso.

 

Note

nota 1: ho scelto una rotazione di 7 gradi solo perchè è primo rispetto a 360.

nota 2: in realtà si dovrebbe indagare per tutti i comandi.