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
}
-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.
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.