Quando si realizzano giochi occorre sempre tenere presente tutti i possibili tipi di computer che il giocatore può avere. Una delle tante cose da tenere presente (forse la più banale ma non per questo meno importante) è la velocità del gioco. Cosa succede se il PC in cui gira il gioco è troppo debole: semplice andrà lento! Tuttavia se è troppo potente il gioco schizzerà a velocità altissime rendendolo ingiocabile. Se il primo caso richiede molte soluzioni complesse per il secondo è sufficiente tenere costanti i numeri di frame del gioco. Queste solitamente corrispondono al numero di giri che il ciclo principale effettua.
While tempo() - lastTick < tempoAttesa
End While
lastTick = tempo()
tempo è una funzione che restituisce il timer di sistema, lastTick il tempo memorizzato precedentemente e tempoAttesa una costante che indica quanti frame al secondo desideriamo avere.
Questo funziona semplicemente così. Inseriamo il codice nel ciclo (deve girare una sola volta nel ciclo). L'algoritmo usa il valore del tempo del precedente ciclo (lastTick) e tramite la funzione che restituisce il tempo (tempo()) controlla finchè la differenza non è superiore al tempoAttesa ossia il tempo minimo che deve durare il ciclo.
Un secondo sono mille millesimi quindi per un frame rate di 40 frame al secondo basta fare
1000/40=25 i millesimi che dura un frame. Se alla fine di tutte le operazioni il PC ha impiegato meno di 25 millesimi l'algoritmo non lo farà continuare creando un'attesa. Quando il tempo sarà trascorso si esce dal ciclo while si memorizza il tempo in quell'istante e si ricomincia.
Altri valori di attesa sono
1000 / 50 frame al secondo = 20
1000/60 frame al secondo = 16.66666666
Di solito i giochi vengono tenuti a 50-60 frame al secondo.
E per contarli e visualizzarli a schermo?
f1 += 1
If tempo() - f2 >= 1000 Then
f3 = f1
f2 = tempo()
f1 = 0
End If
Anche questo deve girare una volta ogni ciclo. Incrementa f1 ogni gira. In f2 c'è il precedente tempo. Se è trascorso 1 secondo (1000 millesimi) si memorizza il valore di f1 in f3, la si azzera e si inserisce il tempo in f2.La variabile f3 contiene il frame rate del precedente secondo. Il metodo richiede un paio di secondi per stabilizzarsi (in genere dovuto al programma che si deve stabilizzare).
Con cosa conto?
VB.Net ha tante funzioni ma molte sono imprecise e soprattutto per il primo codice non vanno bene perchè creano rallentamenti (devono essere precise al millesimo di secondo mentre alcune non lo sono). Quindi io uso le API.
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (ByRef PerformanceFrequency As Long) As Boolean
Private Declare Function QueryPerformanceCounter Lib "kernel32" (ByRef PerformanceCount As Long) As Boolean
Queste 2 righe così come scritte restituisco la prima la frequenza del timer, la seconda il numero di tick. Il tutto molto velocemente (nell'opzione ho soppresso il controllo da parte di VB del codice).
Memorizzate una volta la frequenza tramite la prima e usate questa formula
Function tempo() As Integer
QueryPerformanceCounter(l)
Return (l * 1000 / freque)
End Function
L è un long. La funzione ora restituisce il numero di millisecondi trascorsi dall'accensione del PC.
I commenti sono disabilitati.