Uno dei metodi che mi sembra non sia stato aggiunto sino ad ora è quello del frame skip.
E' molto pratico e veloce da implementare e viene in aiuto soprattutto se il rendering del frame ciuccia molta cpu.
Non aiuta quasi per nulla se il tempo cpu è speso altrove es. nell' ia , fisica etc.
Potrebbe comunque essere riadattato per altri sistemi e sottosistemi di gioco es potreste aggiornare l'ia o un particolare aspetto di un object solo nelle instanze pari in un frame e nelle instanze dispari in un altro frame in modo molto simile o anche dividerle su piu' frame tramite if(((instanza.id) % numgruppi) == GruppoAttivo) Esegui Calcolo su instanza altrimenti skippa.
Per utilizzare il frame skip si setta la room speed a 60 e si sceglie in base alla potenza del device di renderizzare un frame ogni 2 frame o ogni 3 ottenendo 60 , 30 o 20 fps.
Differenza puramente visuale a parte, il gioco girerà identico su tutti i device con aggiornamento a 60 fps per input,fisica e quant'altro.
Applicato alla grafica non intacca il determinismo del gioco in nessun modo; Invece, se applicato su altri sistemi di gioco, il metodo è deterministico solo per valori fissi;
girerà, quindi, in maniera differente su 2 pc con valori di skipping differenti o variabili, perdendo di determinismo.
Codice: Seleziona tutto
#define timing_FrameSkip_Create
//nell' evento create di un vostro controller.
FrameCounter = 0;
FrameToSkip = 2;
#define timing_FrameSkip_Step
//nell' evento step
if(FrameToSkip == 0)exit;
FrameCounter++;//Se usate il FrameCounter altrove dovreste incrementare il valore prima del controllo del frameskipping a 0
if(FrameCounter % FrameToSkip )
draw_enable_drawevent(false);
else
draw_enable_drawevent(true);
Questa è un implementazione veloce visto che non ho il mio codice alla mano comunque dovrebbe funzionare, o almeno, farvi capire il concetto.
FrameCounter ad un certo punto andrà in overflow e wrapperà, non dovrebbe essere un problema, ma per i più pipi si puo' anche evitarlo accumulando in FrameCounter.
nel codice di esempio avremo 30fps con room settata a 60.Per avere gli originali 60 settare FrameToSkip a 0.