Jump to content
Rpg²S Forum
  • 0

Velocità di esecuzione e gestione del tempo nel BS


Fire-Dragon-DoL
 Share

Question

Ok... noto che ultimamente i topic relativi al tempo sono molti, effettivamente il tempo è mal gestito in rgss (o meglio, è poco chiaro per chi programma)... quando avrò un pò piu di esperienza mi propongo di fare una libreria...

 

comunque volevo chiedere...se io faccio una cosa di questo tipo:

$sp=Sprite.new$sp.bitmap=RPG::Cache.battler("Ziegfred_btl",0)$sp.x=0$sp.y=0$thr=Thread.new {  while ($sp<=640)	$sp.x+=1	$sp.update  end}

 

Quanto ci impiega in secondi (e perchè) l'immagine ad attraversare lo schermo?

Dipende dal nostro pc o sbaglio?

Occorre mettere un wait (con la funzione che ho creato) per scandire il tempo sotto questo aspetto?

 

Grazie dei suggerimenti...

 

Ah una cosa, il fatto che gli FPS oscillino tra 38 e 40 (sul mio pc) non indica che i frame_rate siano meno di 40, cioè in realtà sempre 40 sono no?E' solo il pc che ne riproduce di meno a schermo... o sbaglio?Perchè in tal caso ho fatto una paperata con la funzione wait xD

If you think C++ is not overly complicated, just what is a protected abstract virtual base pure virtual private destructor and when was the last time you needed one? (Tom Cargill)

 

Se dovete fare una cosa semplice, tipo

 

 

if (a==b) c='pippo';else c='pluto';
Usate le funzionalita' del linguaggio piu' complicato che esiste:

 

c=select decode(sign(a-b),0,"pippo","pluto");
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Sono un po di fretta ma provo a risponderti comunque.

Allora per capire quanto dura un secondo come credo avrai capito devi vedere il frame rate, quindi l'immagine per attraversare lo schermo ci mette, (640 / frame_rate) secondi, nel caso di 40 FPS ci mette 16 secondi con lo spostamento di un pixel ad ogni update.

Non occorre nessun wait, ti basti sapere che la funzione update è chiamata una volta a frame e quindi ti puoi regolare di conseguenza, non so fai un contatore che ti conta n frame e poi si riazzera quando ha raggiunto n e gli fai fare quello che vuoi (pratica molto usata, mi sembra anche gli eventi fanno così), ti prendi il resto della divisione del frame_count per vedere se sono passati tot frame o secondi (questa non so quanto sia affidabile xD), puoi sbizzarrirti come più ti piace, non è poi tanto difficile dopo che ci prendi la mano.

 

Per quanto riguarda il frame_rate, quello dovrebbe rimanere invariato a meno che non lo cambi, solo che come hai detto tu il tuo pc ne riproduce di meno a schermo (credo, dovrei approfondire con qualche esperimento).

 

Altra cosa, perchè usi tutte variabili globali? è solo un esempio vero? Altra cosa, in questo caso (come in molti casi in rpg maker) la creazione di altri thread è prettamente inutile, ti conviene mettere tutto in un metodo update che poi richiamerai ad ogni aggiornamento.(scusa la spiegazione da cani ma meglio di così non riesco a spiegarmi :P)

 

Ora vado che mi stanno trascinando via dal PC, buona pasqua e buona programmazione :biggrin:

Link to comment
Share on other sites

  • 0
Sono un po di fretta ma provo a risponderti comunque.

Allora per capire quanto dura un secondo come credo avrai capito devi vedere il frame rate, quindi l'immagine per attraversare lo schermo ci mette, (640 / frame_rate) secondi, nel caso di 40 FPS ci mette 16 secondi con lo spostamento di un pixel ad ogni update.

Non occorre nessun wait, ti basti sapere che la funzione update è chiamata una volta a frame e quindi ti puoi regolare di conseguenza, non so fai un contatore che ti conta n frame e poi si riazzera quando ha raggiunto n e gli fai fare quello che vuoi (pratica molto usata, mi sembra anche gli eventi fanno così), ti prendi il resto della divisione del frame_count per vedere se sono passati tot frame o secondi (questa non so quanto sia affidabile xD), puoi sbizzarrirti come più ti piace, non è poi tanto difficile dopo che ci prendi la mano.

 

Per quanto riguarda il frame_rate, quello dovrebbe rimanere invariato a meno che non lo cambi, solo che come hai detto tu il tuo pc ne riproduce di meno a schermo (credo, dovrei approfondire con qualche esperimento).

 

Altra cosa, perchè usi tutte variabili globali? è solo un esempio vero? Altra cosa, in questo caso (come in molti casi in rpg maker) la creazione di altri thread è prettamente inutile, ti conviene mettere tutto in un metodo update che poi richiamerai ad ogni aggiornamento.(scusa la spiegazione da cani ma meglio di così non riesco a spiegarmi :P)

 

Ora vado che mi stanno trascinando via dal PC, buona pasqua e buona programmazione :biggrin:

 

We grazie della risposta...anche io sto andando di fretta purtroppo xD comunque si le globali sono esempi (è il modo piu veloce per fare un test senza fare qualcosa di complesso)

 

Per la prima risposta si credo di aver capito (quindi supponendo frame_rate==40, 4 frame dovrebbe corrispondere a un decimo di secondo... ogni 4 frame posso far fare uno spostamento per dire, o ogni 40 se voglio che ci metta 640 secondi)... quello che mi lasciava perplesso in quella cosa che ho fatto io è:

for i in 0..640  $sp.x+=1end

 

Se faccio una cosa cosi, non viene effettuato nessun update...e soprattutto, io aumento una variabile numerica e stop (ammenoche in realtà quella nn è un metodo...ma questo non lo sapevo), di conseguenza, è come se aumentassi una variabile i di 1, e io dubito che venga effettuato un ciclo ogni frame (sarebbe assurdo no?cioè sarebbe lentissimo il linguaggio)...per questo ho fatto quella domanda: in quel thread a parte sei sicuro che avvenga una volta ogni update? io ho paura che si l'update avvenga, ma una volta ogni volta che il pc ci riesce (quindi basandosi sulla sua reale velocità di cpu... xD)...ovviamente molti update risulteranno impercettibili a occhio umano

 

scappo che mia sorella mi corca!

If you think C++ is not overly complicated, just what is a protected abstract virtual base pure virtual private destructor and when was the last time you needed one? (Tom Cargill)

 

Se dovete fare una cosa semplice, tipo

 

 

if (a==b) c='pippo';else c='pluto';
Usate le funzionalita' del linguaggio piu' complicato che esiste:

 

c=select decode(sign(a-b),0,"pippo","pluto");
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...