@xeeynamo:
è complicato spiegare in due parole tutto quello che ti ho accennato. Ti consiglio una buona lettura dai manuali di sistema della ARM, riguardo l'architettura ARMv5 e in particolare il core ARM9E che equipaggia l'ARM946E-S del NDS. Lì troverai tutti i dettagli relativi alle memorie TCM (Instruction TCM e Data TCM), e molto altro.
Per approfondimenti relativi al NDS fai riferimento al gbatek (lo trovi tra la documentazione dell'emulatore no$gba, si legge no-cash-gba), o mandami un PM per altre informazioni ( ).
Per il discorso dello streaming, mi riferivo al fatto che durante la fase di copia, passavo attraverso la DTCM che usavo come memoria tampone per applicare filtri grafici. Applicare questi filtri in SystemRAM e poi copiare con swiCopy sulla VRAM è certamente possibile, ma si spreca più tempo per questioni di tempi di accesso alla memoria (6 cicli per ogni parola ad accesso casuale, 4 cicli in modalità burst), mentre in DTCM gli accessi random impiegano 2 cicli di clock, 1 ciclo in modalità burst (se non ricordo male).
Per misurare gli FPS puoi usare un metodo molto semplice:
- setta una variabile intera a zero in fase di init (chiamiamola frameCounter)
- incrementala ogni volta che finisci il disegno di un frame
- nella routine di VBlank incrementa un secondo contatore (chiamiamolo vbCounter)
- sempre nella routine di VBlank, appena vbCounter raggiunge il valore di 60, fai così: currentFPS = frameCounter; frameCounter = 0; vbCounter = 0;
la variabile currentFPS verrà aggiornata ogni secondo.
Se vuoi aggiornarla più spesso (diciamo ogni decimo di secondo), ti basta contare fino a 6, anzichè fino a 60, e poi fare currentFPS = frameCounter * 10;
Una volta ottenuto il conteggio, puoi usare una routine di print sullo schermo per vedere il numeretto dove più ti aggrada.
PS: la routine di VBlank viene chiamata esattamente 1 volta ogni 16,66 millisecondi, cioè ogni sessantesimo di secondo, la sua esecuzione è asincrona, cioè scatta un interrupt che interrompe il codice corrente ed esegue questa funzione (come se fosse su un altro thread), e poi ritorna al codice di prima nonappena la routine fa return.
Ultima modifica effettuata da TheKaneB il 04/05/2010 alle 14:27 |