Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

limitatore fps

Messaggio da Jak »

Stavo studiando le opengl in c++ ma poichè non esiste un limitatore di fps il while di base del programma avviene al massimo che il PC riesce a dare.
Mi sono quindi andato a cercare varie funzioni che mi sarebbero potute essere d'aiuto ma ho trovato solo cose imprecise(oddio, precise al millisecondo ma è facile trovare decimali quindi possiamo avere solo certi valori di fps come passare da 45 a 70 fps senza intermedi)ma alla fine ho trovato 3 funzioni che dovrebbero essermi utili.
(Sleep)la prima mette in pausa il programma per un tot di millisecondi(utile per evitare di impallare inutilmente il processore)
(QueryPerformanceCounter)la seconda mi restituisce in numero di "passaggi" da quando è partito il sistema.
(QueryPerformanceFrequency)la terza è la frequenza della seconda funzione, cioè quanti "passaggi" avvengono al secondo, è indispensabile quindi per sapere quanto dura un "passaggio"(li chiamo così tanto per differenziarli da ogni altra cosa ed esporre più facilmente il tutto).

Ho quindi pensato a questo algoritmo:

Codice: Seleziona tutto

while(TRUE)
{
     OgniQuantiPassaggi=PassaggiAlSec/FPS
     PassProxCalc=(OgniQuantiPassaggi*(NumStep+1))
     if(PassProxCalc<PassaggioAttuale+OgniQuantiPassaggi)
     {
          Sleep(PassaggioAttuale+OgniQuantiPassaggi-PassProxCalc)   //dopo aver convertito il numero di passaggi risultante in millisecondi. Attenzione che la sua precisione max è 1 millisecondo, decimali non consentiti
     }
     NumStep+=1
}
Legenda:
-PassaggiAlSec=QueryPerformanceFrequency
-PassaggioAttuale=QueryPerformanceCounter
-NumStep=lo step attuale(uno step dovrà essere 1/fps se il processore ci riesce)
-FPS=il numero di step al secondo che vorrei avere
-OgniQuantiPassaggi=numero di passaggi che devono passare tra uno step ed un'altro.
-PassProxCalc=numero di passaggi che mancano prima di calcolare il prossimo step.

Il mio algoritmo(ancora non testato) non mi convince molto, sarà che sono un po arruginito, quindi volevo chiedere un vostro parere su di esso e se, oltre a funzionare, sarà molto preciso e se si adatterà in caso di minor numero di fps reali rispetto a quelli desiderati. In poche parole se funziona senza bloccarsi o dare errore nel caso faccio crysis 3 e lo provo su un PC mulo che fa fatica ad aprire una cartella. Chiaro che il gioco sarà più lento ma finchè non si blocca e non da errore son cazzi di fa il gioco.
Eventualmente avete in testa altri modi di risolvere il problema? Ogni soluzione consentita basta che Il risultato finale(su un pc decente che regge ovviamente) sia il più preciso possibile con uno scanso di al massimo 1 fps ma ovviamente più preciso è meglio è.
E' consigliabile anche usare calcoli matematici piuttosto che soluzioni brutali come i while, usate Sleep saggiamente una sola volta al massimo per ogni passaggio(PS: Sleep(0) non fa niente quindi non preoccupatevi di valori sballati)

Mi sto scervellando ma la ruggine è gran brutta cosa. :fapensare:

PPS: se capitano fps con valori superiori al 1000 quindi con precisione superiore allo sleep potete fare ad esempio con 3000 fps potete fare 3 step di fila e poi uno sleep. L'importante è essere il più precisi possibile e che il risultato finale sia coerente con quello desiderato quindi se uno richiede 1487 fps su un pc che ne regge 10.000 dategli 1487 fps esatti(o al massimo ovviamente potrebbe capitare 1486 o 1488 ma è naturale poichè la precisione assoluta non potrà mai esistere)

EDIT: Noto la libreria standard "ctime.h"(o semplicemente "time.h" in C), ora la guardo ma se volete usatela pure, non ho preferenze sui metodi che usate, se poi non sono strettamente collegati a windows ma multipiattaforma è ancora meglio.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
NoCode
GMI VIP
Messaggi: 3403
Iscritto il: 01/09/2008, 8:08
Specialità: Grafica e Musica
Uso: GM:Studio 1.4 Pro
Località: My houuuse... Where is my houuuuse?!?
Contatta:

Re: limitatore fps

Messaggio da NoCode »

Devo imparare il C#, perchè se è vero che è più facile del C++ (a sua volta MOLTO facile), vuol dire che si ha per le mani un linguaggio potente e nello stesso tempo semplicissimo... :fapensare:
Non è poi tanto diversa la logica dal linguaggio di GM, anche se c'è più pappa pronta lì... :fapensare:
Alla fine le funzioni te le devi fare, ma finchè la struttura è molto simile non è poi un grosso problema...
Appena avrò un po' di pace mi ci metterò... :fapensare:
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

NoCode ha scritto:Devo imparare il C#, perchè se è vero che è più facile del C++ (a sua volta MOLTO facile), vuol dire che si ha per le mani un linguaggio potente e nello stesso tempo semplicissimo... :fapensare:
Non è poi tanto diversa la logica dal linguaggio di GM, anche se c'è più pappa pronta lì... :fapensare:
Alla fine le funzioni te le devi fare, ma finchè la struttura è molto simile non è poi un grosso problema...
Appena avrò un po' di pace mi ci metterò... :fapensare:
Il c++ è più veloce e non scomoda il .net(che è supportato solo da windows)
Personalmente lo preferisco al C# per la sua sintassi rigida(quindi sai cosa stai realmente facendo) pur essendo molto potente inoltre è multipiattaforma.
Comunque cosa centra con questo topic? :hum:
Ciò che mi serve è l'algoritmo per farlo in c++ ci penso io, per quello infatti non ho usato struttura e sintassi del C++ ma nomi generali così mi può aiutare anche chi non conosce il c++ :sisisi:

La mia intenzione per ciò che sto facendo è anche la possibilità di utilizzarlo su varie piattaforme e cambiare solo l'inizializzazione delle openGL(su linux userò le cose appropriate anzichè i wform ma la sostanza resterà quella) sennò a sto punto mi mettevo con directx che hanno molta più roba già di per se(ma comunque anche opengl ho scoperto che non scherza, anche questo ha i suoi modi per velocizzare il rendering :sisisi: )

Ma come ho appena detto ora basta offtopic, voglio risolvere sto problema e mi sembra che sulla libreria ctime ci siano i sostituti alle funzioni "Query" così diminuisco le dipendenze da windows(anche se sleep purtroppo... ma son altri problemi, per ora mi basta windows)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Nix »

NoCode ha scritto:Non è poi tanto diversa la logica dal linguaggio di GM, anche se c'è più pappa pronta lì... :fapensare:
Il C# ha mooooolta più pappa pronta di GM
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Nix ha scritto:Il C# ha mooooolta più pappa pronta di GM
Anche il c++ solo che non ha la stessa che ha GM. Ognuno ha i suoi pregi e difetti ma dopo aver visto C# e c++ ti assicuro che GM in confronto è niente :sisisi:

PS: Ok ora non offtopico più
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Nix
GMI Advanced
Messaggi: 2437
Iscritto il: 26/12/2008, 18:14
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Nix »

Jak ha scritto:Ma come ho appena detto ora basta offtopic, voglio risolvere sto problema e mi sembra che sulla libreria ctime ci siano i sostituti alle funzioni "Query" così diminuisco le dipendenze da windows(anche se sleep purtroppo... ma son altri problemi, per ora mi basta windows)
puoi usare #define e #ifdef per mettere sia il codice per windows che per linux...
comunque guarda l'esempio qui:
http://www.cplusplus.com/reference/clib ... ime/clock/
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Nix ha scritto:puoi usare #define e #ifdef per mettere sia il codice per windows che per linux...
Ne sono cosciente ma se l'imito le dipendenze da un'unico sistema operativo ci sarà meno lavoro da fare per farlo multipiattaforma.
Nix ha scritto:comunque guarda l'esempio qui:
http://www.cplusplus.com/reference/clib ... ime/clock/
L'avevo visto ma si capisce già dal codice di wait

Codice: Seleziona tutto

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}
Che usa la cpu a massima potenza(ed infatti ho provato ed è così) e bruciare il processore per un programma da quattro soldi che ti andrebbe 20 volte più veloce non mi sembra una bella idea...
Almeno per windows preferisco usare Sleep finchè posso inoltre non devo fermare lo step per un valore fisso perchè altrimenti se hai un pc vecchio stampo vai ancora più lento, quello è un rallentatore non un limitatore ed è per questo che ho domandato.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: limitatore fps

Messaggio da Tizzio »

Io in javascript faccio così anche se dubito :fapensare: possa esserti utile.

Codice: Seleziona tutto

function _FpsCounter_() {
	if (_GameRunning_){
		GameLoop();
		_FrameCount_++;
		current_date=new Date().getTime();
		if (current_date-_Start_Date_>=1000){
			fps=_FrameCount_;
			_FrameCount_=0
			_Start_Date_=new Date().getTime();
		}
	}
}

Codice: Seleziona tutto

function start_interval(){
	 _Start_Date_ =new Date().getTime();
	window.setInterval(_FpsCounter_, 1000 / room_speed);
}
vedi se esiste una funzione simile a setInterval che ripete un'altra funzione ogni tot millisecondi
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Tizzio ha scritto:vedi se esiste una funzione simile a setInterval che ripete un'altra funzione ogni tot millisecondi
Windows ha una funzione tipo quella(Non la ricordo più ma prima l'avevo trovata e provata) ma la sua risoluzione è in millisecondi e non supporta numeri decimali quindi se io gli do 60 fps posso o eseguire la funzione ogni 16 millisecondi o ogni 17 e ciò non è molto preciso inoltre in caso di rallentamenti da problemi perchè se il momento opportuno passa e non può agire non esegue quindi preferisco evitarla. Anche ricorrendo al while dovrei comunque calcolarmi il numero di "passaggi" quindi posso farmi la mia funzione Sleep precisa ma mi devo fare i calcoli ugualmente. Nessuno che non abbia ruggine sulla parte matematica del cervello? :roll:

Dai baron aspetto solo la tua venuta :baron:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
Prometeo
Membro d'elite
Messaggi: 1258
Iscritto il: 15/09/2010, 12:36
Specialità: Grafico Progammatore
Uso: GameMaker 8.1
Località: Italia
Contatta:

Re: limitatore fps

Messaggio da Prometeo »

Lo so c'entra poco, ma visto che si parla di c++ e linguaggi alternativi a GM, mi sono imbattuto in questo sito italiano che forse può interessarvi... non ho approfondito perchè, ad una prima occhiata, mi sembra troppo tecnico per me... per programmatori esperti insomma:

http://gameprog.it/index.php
Il dolore che i limiti delle cose c'impongono, cioè a dire il mal essere del desiderio non soddisfatto, il senso del non potere tutto, ci dà il sentimento e l'idea del tutto. Il limite diventa indizio. E la più larga via verso l'infinito è il dolore. [Niccolò Tommaseo]
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

A quanto vedo è una raccolta di un bel po di roba ma non essendo un forum cè poca discussione quindi o trovi quello che cerchi(considerando che cè taaaaanta roba nel mondo trovarla è dura) o non te ne fai niente.
Comunque ciò che richiedo è indipendente dal linguaggio, l'algoritmo è semplice ma per qualche strano motivo non riesco a venirne fuori, sarà che sto usando troppo il cervello ultimamente e sono fuso.
Io uso il c++ ma il linguaggio è solo il mezzo è l'algoritmo che conta...
Almeno ho trovato una chicca che mi ha risollevato il morale(un'ottimo image loader completo per opengl) in attesa dell'arrivo di qualche utente non arruginito come me tipo nightwish o baron.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: limitatore fps

Messaggio da Sla »

limitare gli fps? Poca roba.. strano che non ne vieni a capo.
definiamo "ifps" come gli fps ideali, quelli che l'utente vorrebbe e che il programma cerca di raggiungere limitandosi.
Un esempio di ifps potrebbe essere 30.
Quello che devi fare è calcolarti un intervallo di tempo in millisecondi all'interno del quale debba essere renderizzato un solo frame,
altrimenti si sorpassa il limite degli ifps.
Se ifps = 30, 30 frames ogni secondo, 1 frame ogni 1/30 secondo, 1 frame ogni 1000/30 millisecondi, e , arrotondando in eccesso,
non bisogna renderizzare più di 1 frame ogni 34 millisecondi.

current_time è il numero di millisecondi passati dall'accensione del computer (ho voluto seguire la funzione di gm, spero
di averla ricordata bene). Il codice è tanto semplice che si scrive da solo.

Codice: Seleziona tutto

time = current_time;
ms = 0;
frame_rendered = false;
while(true)
{
     ms = current_time - time;
     if( ms < 34)
     {
          if(!frame_rendered) {Render(); frame_rendered = true;}
     }
     else {
        frame_rendered = false;
        time = current_time;
        ms = 0;
    }
}
Al posto di 34 metterai ovviamente (1/ifps*1000)
eppure mi sembra tutto giusto...
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: limitatore fps

Messaggio da Sla »

Ah ma guarda che culo, in windows.h ti torvi GetTickCount, che ritorna proprio il numero di millisecondi passati dall'avvio del sistema.
eppure mi sembra tutto giusto...
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Super_Slascio ha scritto:Ah ma guarda che culo, in windows.h ti torvi GetTickCount, che ritorna proprio il numero di millisecondi passati dall'avvio del sistema.
Già peccato che la sua risoluzione sia da 10 a 16(numero casuale che varia ogni ciclo) e quindi con una risoluzione bassa ottengo fps a bassa risoluzione, il tuo codice l'avevo già scritto ma mi mette solo dei certi valori di fps che potrebbero variare da momento a momento(in base alla risoluzione cha ha voglia di usare in quel momento) quindi passo da 40 a 70 fps senza possibilità di intermedi.
Avevo anche trovato un'altra funzione dove poter indicare la precisione del timer ma comunque cè un massimo di precisione con un'algoritmo come il tuo mi da comunque problemi.
Come detto nel mio post ho scoperto la libreria ctime dove ho a disposizione il numero di cicli al secondo ed il ciclo attuale(questo contatore è multipiattaforma ed ha precisione inferiore al nanosecondo(circa 0.8ns)... bello preciso no? :twisted: )Altra cosa è, come già detto, che per quanto semplice volevo evitare di attendere il momento opportuno con un while quindi magari usare Sleep(millisecondi) o cose così.
Mi sto arrendendo, ormai non riesco più a fare nemmeno 4 conti del piffero, uso il while e basta.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
icosist
Newbie
Messaggi: 12
Iscritto il: 21/06/2011, 18:09
Specialità: Programmazione
Contatta:

Re: limitatore fps

Messaggio da icosist »

Questo potrebbe funzionare:

Codice: Seleziona tutto

time = current_time;
ms = 0;
while(true)
{
     ms = current_time - time;
     if( ms >= 33,3333)
     {
          Render();
          time += 33,3333;
     }
}
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Non stavo parlando di game maker quindi il tuo metodo non funziona anche perchè pure in game maker current_time ha una bassa precisione(penso usi proprio la funzione della libreria standard) ed è proprio quello il problema.
Grazie comunque per il(vano) tentativo.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
icosist
Newbie
Messaggi: 12
Iscritto il: 21/06/2011, 18:09
Specialità: Programmazione
Contatta:

Re: limitatore fps

Messaggio da icosist »

Jak ha scritto:Non stavo parlando di game maker quindi il tuo metodo non funziona anche perchè pure in game maker current_time ha una bassa precisione(penso usi proprio la funzione della libreria standard) ed è proprio quello il problema.
Grazie comunque per il(vano) tentativo.
Aspè, prova questo: (Programmi in .net?)

Codice: Seleziona tutto

using namespace System;
time = Environment::TickCount;
Comunque ti serve un tick counter più preciso.
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: limitatore fps

Messaggio da Sla »

bell'up ;D
Aggiungo comunque qualcosa anche io perchè tempo fa avevo trovato una soluzione perfetta.
Dovresti cambiare qualche parametro nelle librerie grafiche che utilizzi! Usando DX ci ero riuscito, non so però per OpenGL.
eppure mi sembra tutto giusto...
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: limitatore fps

Messaggio da Sla »

bell'up, comunque se il problema è ancora aperto posso provare a darti un consiglio..
io con le DX poi avevo risolto impostando qualche parametro interno alla libreria grafica, non so cosa puoi fare con opengl.
eppure mi sembra tutto giusto...
Avatar utente
condors94
GMI Guru
Messaggi: 2939
Iscritto il: 07/01/2010, 16:53
Contatta:

Re: limitatore fps

Messaggio da condors94 »

LOL hai dimenticato di aver già risposto,rispondendo due volte con un messaggio simile ma non uguale... :lol: :lol: l'età avanza eh :lol: :lol:
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Io avevo risolto usando il counter di precisione di windows dandomi al massimo uno scanso di 3 fps sui 1500 che avevo.
Grazie agli esempi di opengl superbible sembra che ho trovato una piccola funzione che si adatta ai vari os(le classiche macro) usando il corrispondente contatore di precisione, appena riesco ad estrapolarla come si deve avrò finalmente il mio bel contatore di precisione e limiterò gli fps con un while.
Per ora comunque come ho detto ho risolto perfettamente su windows(ed usando sleep(sempre di windows) evito di sovraccaricare troppo il processore)
Alla fine penso sempre al multipiattaforma ma ogni volta mi dico "ma se tato per un bel po userò windows, che me ne frega?" :lol:
In opengl comunque ho a disposizione soltanto cose riguardanti la grafica e l'intero contesto deve essere gestito dal sistema operativo quindi non ho parametri da impostare per riuscire a limitare gli fps(anche perchè ora mi appoggio a freeglut quindi non gestisco nemmeno la finestra ora).
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: limitatore fps

Messaggio da Sla »

Guarda che non devi per forza fare un unica versione della libreria che funzioni su tutti i sistemi operativi!
Ne farai una per Windows, una per Mac, una per Linux. L'importante è che mantieni la stessa interfaccia.
eppure mi sembra tutto giusto...
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Super_Slascio ha scritto:Guarda che non devi per forza fare un unica versione della libreria che funzioni su tutti i sistemi operativi!
Ne farai una per Windows, una per Mac, una per Linux. L'importante è che mantieni la stessa interfaccia.
Lo so ma usare un sistema che vale per tutti gli OS è molto più facile di fare 3 versioni no? :lol:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: limitatore fps

Messaggio da BaronVsCorsar »

non ho mai utilizzato il preprocessore per gestire le varianti di codice,
ma è un metodo molto comodo per gestire lo sviluppo software con un unico codice (in realtà il preprocessore li differenzierà) che giri su più hardware (o s.o.).

Con i microcontrollori programmati in C era pesantemente sfruttato.

Per semplificare cerchi di mantenere il codice sistema-operativo dipendente all'interno di function,
le quali nella loro definizione tramite il preprocessore scrivi tre codici diversi.
Poi all'interno del tuo programma utilizzi la funzione suddetta senza più preoccuparti.

Naturalmente puoi sbocciare e tenere tutte quelle funzioni in 3 include file differenti, i quali sono chiamati solo in funzione del tuo sistema operativo...
Con un po' di progettazione avrai un sorgente pulito, volendo facilmente distribuibile (anche solo inviando l'object perchè ne facciano il link) e multipiattaforma. 8)

Questo in teoria, non l'ho mai fatto, se non appunto con dei microcontrollori che avevano come unica differenza hardware il pin di output :fapensare:
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Bè, è chiaro che poi uso un'unico file di inclusione, sfrutto il preprocessore per lasciare l'interfaccia identica ma che usa diverse funzionalità dipendenti da vari OS. Fatto sta che è ovviamente più facile fare un sistema OS indipendent che fare 3 sistemi diversi per i vari OS(sì, perchè anche se usi il preprocessore devi comunque fare il codice più volte) inoltre usando sistemi diversi, ad esempio con windows uso il contatore di precisione e con gli altri OS no, otterrei risultati chiaramente diversi in base all'OS e ciò non va affatto bene.

PS: Infatti pure il codice che avevo trovato usa il mio stesso sistema che però non è preciso quindi non va bene :(
La soluzione sarebbe quella di far andare il programma a palla senza alcuna considerazione di velocità e basarsi solo ed esclusivamente sulla differenza di tempo che però rende chiaramente la gestione di un gioco notevolmente più difficile anche se è più professionale(così resta a velocità normale anche in caso di basso numero di fps) inoltre surriscalda inutilmente il processore(ma questo è il minore dei problemi, basterà cercarsi la funzione adatta in base al sistema e se non ce l'ha... cosa posso farci? :lol: )

Comunque non capisco il tuo intervento baron. E' chiaro che cercherò di fare l'interfaccia uguale per i vari OS e che farò il tutto nella maniera più pulita possibile 8)

Mi chiedo solo perchè mac e linux non hanno un fottuto contatore di precisione come windows :furiosomedio:

Riedit: ora che ci penso cè sempre la soluzione di usare clock() di ctime(forse l'avevo cambiato manualmente boh, fatto sta che è preciso al millisecondo), la soluzione finale ai miei problemi sarebbe quella di tenere i 60 fps nell'engine senza lasciare la possibilità di cambiare ma la vedo un po una fregatura...
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: limitatore fps

Messaggio da Jak »

Allora, anche se era da quasi due mesi che non ci pensavo più mi sono rimesso a studiare il sistema e penso di avere quasi trovato la soluzione(uso float per essere preciso nelle divisioni senza effettuare conversioni)

Codice: Seleziona tutto

#include <ctime>
#include <iostream>
using namespace std;

float fps=15683;
float actual_step=0;
float scorso_clock;
float actual_frame=0;

int main()
{
	scorso_clock=clock();
	while(true)
	{
		while(clock()<1000/fps*actual_step)
		{
			
		}
		actual_step++;
		actual_frame++;
		if (clock()>=scorso_clock+1000)
		{
			cout << actual_frame << endl;
			actual_frame=0;
			scorso_clock=clock();
		}
	}
}
Facendo partire il programma mi da esattamente ogni secondo il numero di fps del programma e risulta esattamente corretto anche con valore superiori alla precisione del contatore, in teoria dovrebbe distribuire equamente il codice da eseguire, ora l'unica problematica che non ho sistemato(non testata ma teoricamente dovrebbe funzionare in questo modo) è quando gli fps reali son più bassi degli fps che richiede il programma, la variabile actual_step si incrementerebbe con una frequenza minore del normale mentre clock() continuerebbe a segnare il tempo corretto di conseguenza dopo un momento lento questo codice dovrebbe far eseguire di colpo tutti i frame "avanzati" durante il rallentamento e ciò non va affatto bene. Che mi consigliate di fare? Ora magari provo a resettare actual step ad ogni secondo ma credo che al massimo risolvo il problema con precisione di un secondo, se va lento fino a mezzo secondo prima nel mezzo secondo in cui va veloce recupererà gli fps, è già meglio ma non risolve del tutto il problema :fapensare:

EDIT: inoltre non ho previsto cambiamenti degli fps ingame, mi sa che la soluzione migliore è quella di restare sull'aggiornamento ogni secondo.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you