notJustCode.it
 
\\ Home : Articoli
Frame rate
Di RobyDx (del 02/08/2007 @ 08:41:49, in DirectX9, linkato 2348 volte)

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.

Articolo Articolo  Storico Storico Stampa Stampa
I commenti sono disabilitati.
"I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione."

Albert Einstein


Cerca per parola chiave
 

Titolo
Articoli (4)
C++ (4)
Direct3D10 (30)
Direct3D11 (20)
DirectX9 (82)
DotNet (10)
English (9)
FanGames (22)
ManagedDX11 (2)
Materiale Utile (4)
News (39)
Shader Library (12)
SharpDX (1)
Software (25)
Tecnologia (19)
Varie (9)

Gli interventi più cliccati

Ultimi commenti:
If you wish to retai...
23/05/2013 @ 13:07:45
Di chanel outlet
You deficit of self-...
23/05/2013 @ 13:07:13
Di cartier watches uk
Reinforce your own l...
23/05/2013 @ 13:06:37
Di replica watches
Whenever you"re shiv...
23/05/2013 @ 13:06:11
Di swiss replica watches
It's likely you have...
23/05/2013 @ 13:05:02
Di chanel handbags
Cheap automobile ins...
23/05/2013 @ 13:04:28
Di replica watches

Titolo
Con quale tecnologia state realizzando o avete intenzione di realizzare i vostri progetti?

 DirectX11
 DirectX10
 DirectX9
 XNA
 DirectX8 o Precedenti
 OpenGL
 Motori grafici già pronti
 Altro

Titolo
Umorismo (17)

Le fotografie più cliccate



Ci sono 509 persone collegate
Sono state visualizzate  pagine

27/07/2024 @ 10:21:31
script eseguito in 42 ms