Zdravím, zkouším dělat nějaké blbosti v SDL podle seriálu, ale narazil jsem na jeden problém: po spuštění se využití CPU drží na 100%. Nejde to nějak omezit aby si ten program bral jenom tolik kolik potřebuje?
Tady je ten program aji se zdrojemwww.kamilma.wz.cz/pokus1.rar
Díki za odpovědi.
Fórum › C / C++
CPU
To sin_x : void - jako že nic nevrací. A pokud se ti ta animace seká, tak ji máš špatně navrhnutou - na tvůj kód jsme se ještě nedíval - to po editu odvolávám
EDIT: Tak jsem to zkusil; bez delay mi program žere 29% výkonu CPU, s delay 10ms asi 1%. Delay jsem dal za DrawScene() - animace je plynulá. Netuším čím to může být.
P.S: Oblivion nerozjedu
To yaqwsx : A s tim delayem se ti ten panáček pohybuje (šipkama do stran, nemyslím animaci) stejně rychle?
Já počítal na prstech a vyšlo mě to že bez delaye přejedu celou obrazovku o 1s rychlejš. Myslel sem ale že delay působí jenom na procesor a s tou aplikací to nic neudělá.
To sin_x : Aha, ty myslíš toto...
Ano to je pomalejší, jelikož při delay se kód programu nevykonává, vyjma timerů (ale tím si nejsem jist). A ty nemáš posun postavičky nějak časově ošetřen...
Přečti si http://www.root.cz/clanky/sdl-hry-nejen-pro-linux-16/ a pak nebudeš muset ani na tu animaci postavičky používat timer...
Prvně si musíš počítat FPS; tzn budeš mít globální proměnné:
Uint32 lastt = 1;//Minulý čas před přečtením
Uint32 nwt = 0;//Nový čas po přečtení
double fps = 0;//Fps
double t;//časový rozdíl
A potom budeš pokaždé v herní smyčce počítat FPS:
//Výpočet fps
lastt = nwt;
nwt = SDL_GetTicks();
t = nwt - lastt;
fps = 1000.0 / t;
No a při stisknutí klávesy:
if(keys[SDLK_RIGHT]) image_x += (20/fps);
Proměnnou t klidně můžeš vynechat a počítat napřímo, ale toto jsme prostě jenom ctl + c a ctrl + v z mého současného dílka, kde potřebuji znát i délku smyčky...
No robiš jednu blbu chybu a to ze prekreslujes jak taky pako.
Priprav si nasledujuci zaber a nechaj program zaspat. Zobudit ho nechaj nejakym timerom az vtedy ked to potrebujes (napr aby si dosiahol max 50fps) ked sa program zobudi tak vykresli pripraveny zaber a priprav dalsi.
Tak dosiahnes plynulost a CPU nebude pocitat zbytocnosti.
Samozrejme existuju aj ine podobne techniky. (napr GUI aplikacie cakaju na event a tiez sa neprekresluju stale jak blbe)
To yaqwsx :
if(keys[SDLK_RIGHT]) image_x += (20/fps);
- teď mě napadlo : co když 20/fps nebude celé číslo??
To dfasdf : Díki pochopil jsem to akorát není v mé moci tohle naprogramovat:D
SDL_TimerID timer_fps;
.
.
.
timer_fps = SDL_AddTimer(20, Funkce_Timer, NULL);
Vytvořím časovač. Ale jak udělám, aby se aplikace uspala na tak dlouho než ji vzbudí funkce Funkce_Timer?
- teď mě napadlo : co když 20/fps nebude celé číslo??
Jestli vyjde cislo mensi nez jedna, tak z toho vypadne nula, jinak jedna. Da se to poresit pouzitim typu double nebo vyuzivanim vyssich cisel rychlosti (treba 2000).
> Takže: mohl bys mi prosím napsat jak by to vypadalo, kdybych chtěl aby se postavička posunovala určitou rychlostí?
Ja používam systém, ktorý hýbe objektmi herného sveta na základe uplynulého času od poslednej aktualizácie herného sveta (v prípade že na hráča nepôsobia žiadne vonkajšie sily), implementácia môže vypadať nijako takto:
class player
{
private:
int _position_x;
int _position_y;
float _velocity_x;
float _velocity_y
...
public:
...
void update(int elapsed_time)
{
// update position
_position_x += _velocity_x * elapsed_time;
_position_y += _velocity_y * elapsed_time;
...
}
}
void main()
{
player p;
....
int start_time = get_timer_val();
int curr_time = start_time;
// game loop
while ( ... )
{
// checks game inputs
check_input();
// update game world
...
p.update(curr_time - start_time);
// draw game world
draw();
// game time
start_time = curr_time;
curr_time = get_timer_val();
}
}
EDIT: co je vlastne popisane aj v tom clanku http://www.root.cz/clanky/sdl-hry-nejen-pro-linux-16/
no, kludne mozte 2d hry pisat vo gdi, alebo gdi+, ktore je sucastou win32 api systemu windows
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C++: Zaťaženie CPU — založil gaben
00% zatazenie CPU — založil joker
C# teplota CPU — založil Dingo
CPU Intel Core2Duo — založil remmidemmi
Moderátoři diskuze