CPU – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

CPU – C / C++ – Fórum – Programujte.comCPU – C / C++ – Fórum – Programujte.com

 

sin_x0
Newbie
11. 8. 2008   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 77.92.218.–
yaqwsx+9
Posthunter
11. 8. 2008   #2
-
0
-

Je to sice v tématu cca 10. pod tímto, ale...
Stačí přidat funkci void SDL_Delay(Uint32 ms) - ta uspí program na daný počet milisekund

Nahlásit jako SPAM
IP: 85.160.96.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
sin_x0
Newbie
11. 8. 2008   #3
-
0
-

To yaqwsx : Dal jsem do toho vykreslovacího cyklu SDL_Delay(10);, vytížení CPU kolem 70%, ale ta animace se začla trochu sekat kvůli té prodlevě. Když todle dělá 70% tak jak je možný že sem rozjel Oblivion??:D

Nahlásit jako SPAM
IP: 77.92.218.–
sin_x0
Newbie
11. 8. 2008   #4
-
0
-

Jo ještě jsem se chtěl zeptat: Co znamená to void? Vím že před funkcí je typ návratové hodnoty ale o proměnné typu void jsem nikde nečetl.

Nahlásit jako SPAM
IP: 77.92.218.–
yaqwsx+9
Posthunter
11. 8. 2008   #5
-
0
-

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

Nahlásit jako SPAM
IP: 85.160.96.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
sin_x0
Newbie
11. 8. 2008   #6
-
0
-

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

Nahlásit jako SPAM
IP: 77.92.218.–
yaqwsx+9
Posthunter
11. 8. 2008   #7
-
0
-

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

Nahlásit jako SPAM
IP: 85.160.96.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
sin_x0
Newbie
11. 8. 2008   #8
-
0
-

To yaqwsx : Uff... začíná toho být na mě moc:D
Takže: mohl bys mi prosím napsat jak by to vypadalo, kdybych chtěl aby se postavička posunovala určitou rychlostí? třeba 20px/s

Nahlásit jako SPAM
IP: 77.92.218.–
yaqwsx+9
Posthunter
11. 8. 2008   #9
-
0
-

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

Nahlásit jako SPAM
IP: 85.160.96.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
sin_x0
Newbie
11. 8. 2008   #10
-
0
-

To yaqwsx : Díki moc fakt si mi pomohl já musím jít takže to vyzkouším až zítra:D

Nahlásit jako SPAM
IP: 77.92.218.–
dfasdf
~ Anonymní uživatel
1 příspěvek
11. 8. 2008   #11
-
0
-

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)

Nahlásit jako SPAM
IP: 91.127.0.–
sin_x0
Newbie
11. 8. 2008   #12
-
0
-

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?

Nahlásit jako SPAM
IP: 77.92.218.–
12. 8. 2008   #13
-
0
-

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

Nahlásit jako SPAM
IP: 78.102.164.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
AdamHlavatovic0
Stálý člen
12. 8. 2008   #14
-
0
-

> 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/

Nahlásit jako SPAM
IP: 217.73.16.–
sin_x0
Newbie
12. 8. 2008   #15
-
0
-

To AdamHlavatovic : Díki ale myslím že se vrátím ke konzoli:DD
Vydím že SDL je na mě zatím moc složitý. A to sem si myslel že po prázdinách už budu dělat v OpenGL:DD

Nahlásit jako SPAM
IP: 77.92.218.–
AdamHlavatovic0
Stálý člen
13. 8. 2008   #16
-
0
-

no, kludne mozte 2d hry pisat vo gdi, alebo gdi+, ktore je sucastou win32 api systemu windows

Nahlásit jako SPAM
IP: 217.73.16.–
asdf
~ Anonymní uživatel
26 příspěvků
20. 8. 2008   #17
-
0
-

To sin_x : Pozri funkcie sleep/usleep (systemove nie SDL, neviem či sdl ma nejake ich ekvivalenty nerobím s ním)

Nahlásit jako SPAM
IP: 84.47.39.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Podobná vlákna

C++: Zaťaženie CPU — založil gaben

00% zatazenie CPU — založil joker

CPU info — založil praxc

C# teplota CPU — založil Dingo

CPU Intel Core2Duo — založil remmidemmi

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý