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

Hra v SDL zatěžuje CPU – C / C++ – Fórum – Programujte.comHra v SDL zatěžuje CPU – C / C++ – Fórum – Programujte.com

 

Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #1
-
0
-

Dobrý den,

Nechce se mi to věřit, ale moje čerstvě vydaná hra má takovou drobnou, ale ve skutečnosti gigantickou nepříjemnost. Na mojem procáku Intel Core i5, což je 4 jádro, mi tato hra zatíží chvilkama až na 100%. Hru jsem poslal kámošce až vyzkouší a jelikož má hodně slabého koma, tak se jí objekt se kterým má uživatel pohybovat nerozjel vůbec. Hra ale pořád jede, takže když se zavírá escapem tak funguje bez problému.

zde je soubor:

http://uloz.to/…cauition-rar

Nahlásit jako SPAM
IP: 46.174.59.–
meqi+1
Newbie
18. 3. 2012   #2
-
0
-

Mě to žere 25% čili jedno jádro na max.. a když jsem tak koukl na kód, tak se ani nedivim, však tam máš doslova samej cyklus... umění je udělat app, která bude mít nejmensí počet cyklů

PS: Teď na to koukám znovu.. a to je strašnej kód.. za to bych se styděl normálně... celej program je složenej snad z desítek cyklů + vnořených a samá duplicita a vše je nacpaný v jednom souboru

Nahlásit jako SPAM
IP: 213.168.183.–
yaqwsx+9
Posthunter
18. 3. 2012   #3
-
0
-

Na kód jsem se nedíval - ale určitě tam máš nějakou nekonečnou smyčku, ve které vykonáváš logiku programu.

Je několik řešení:

  • Veškeré akce provádět pouze na základě příchozích zpráv - pro hru nevhodné
  • Přidat na konec cyklu příkaz Sleep(1) - nejedná se o ideální řešení, ale funguje
  • Reagovat pouze na zprávy a překreslovat okno, popř. vykonávat logiku progamu pomocí timeru např 30× za sekundu
  • Aktivovat vertikální synchrinzaci - při příkazu pro update Surface okna program počká na synchronizaci obrazovky


EDIT: Místo Sleep je lepší použít SDL_Delay - není platformově závislé a dělá to samé.
 

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #4
-
0
-

#2 meqi
A ten jeden soubor vadí tak moc?  A právě já moc nevymyslel to jak to dát bez těch cyklů.

Nahlásit jako SPAM
IP: 46.174.59.–
yaqwsx+9
Posthunter
18. 3. 2012   #5
-
0
-

#4 Adam
Počítači nevadí, ale tobě se musí strašně blbě číst. Navíc při sebenší úpravě se musí znovu kompilovat celý program.

Běžně se programy rozdělují do jednotlichých souborů podle logických celků. Jednak je program přehlednější, ale také se při úpravě musí znovu zkompilovat pouze ten určitý soubor (přínos pochopíš, až rekompilace celého programu bude trvat několik minut). Navíc pokud kód dobře napíšeš, tak je přenositelný mezi programy.

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
meqi+1
Newbie
18. 3. 2012   #6
-
0
-

Ono je to lepší, takto máš všechno napatlaný v jednom souboru a stává se z toho pomalu guláš

Správně bys měl postupovat tak, že budeš mít jednu fuci Update, co se bude vykonávat 30x za vteřinu (aby to bylo plynulý).. SDL sice moc neznám, ale myslim, že bude tuto fci obsahovat

Další věcí je to bludiště... ideální by bylo vykreslit cesty a detekovat pokud čteveček vstoupil do cesty a používat vybarvení okna místo obrázků na takovou jednoduchou věc

Celá hra by pak měla max 300 řádků (spíš míň ještě)

Nahlásit jako SPAM
IP: 213.168.183.–
Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #7
-
0
-

#3 yaqwsx
Ta nekonečná smyčka logiky programu je popsána v tutoriiálnech root, že to tak údajně je. Takže když to nějak načasuju to překreslování tak teoreticky cyklu mohou zůstat?

Nahlásit jako SPAM
IP: 46.174.59.–
Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #8
-
0
-

#6 meqi
Takže vlastně vytvořit vlstní hlavičkové soubory

Nahlásit jako SPAM
IP: 46.174.59.–
meqi+1
Newbie
18. 3. 2012   #9
-
0
-

#8 Adam
Ano, např. pro hráče a pro mapu.. hlavně pro překreslování použít hotovou fci update(), pokud existuje v SDL knihovně... potom generovat mapu buď podle patternu, kterej si vytvoříš nebo nechat generovat přes cyklus nějakej... a to ošetření by mohlo fungovat i na rozdílu barvy, když to mas takto barevně udělaný == žádnej další cyklus

Nahlásit jako SPAM
IP: 213.168.183.–
Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #10
-
0
-

#9 meqi
Takže pokud jsem to správně pochopil, tak mapu nevykreslit přez cykly ale zobrazit jako pozadí a pak ošetřovat, zda-li uživatel nepřekročil pevně dané souřadnice a nebo ošetřit barvou což ještě neumim. Navíc jsem se s funkcí update() zatím nesetkal. Něco podobného je SDL_Flip(), která převrací buffery.

Nahlásit jako SPAM
IP: 46.174.59.–
meqi+1
Newbie
18. 3. 2012   #11
-
0
-

#10 Adam
Noo, jak říkám.. SDL neznam moc, takže nevim co má a co ne, ale pokud se SDL používá na hry, tak by něco jako update() měla mít, co by překreslovalo obrazovku

Všechno můžeš i dělat přes malování, že jednoduše na pozadí namaluješ bludiště přes cesty a potom to vyplníš barvou, takže nemusíš použít skoro žádný bitmapy, co mají snad 6MB+

No, ještě se na to podívej, páč tohle nemá cenu někomu posílat, když to sežere zbytečně celý CPU

A ještě jedna rada na závěr, pokud máš stejný úseky kódu nebo se to liší jen v něčem (pokud se to používá na více místech než jednom), tak to hoď do funkce!!!

Nahlásit jako SPAM
IP: 213.168.183.–
yaqwsx+9
Posthunter
18. 3. 2012   #12
-
0
-

#7 Adam
Logika je v pořádku, ale tvá hra trpí na vykreslování... A ty cykly - přijdou mi jednak nepřehledné, ale hlavně zbytečné. Navíc mícháš logiku hry s vykreslováním a sám se v tom asi ztrácíš...

  for (int i = 0; i <= 450; ++i){
         rect.x = i + 30;
         rect.y = 370;
         rect.w = 15;
         rect.h = 15;
         SDL_BlitSurface(wall, &rect, screen, &rect);
         
         x = rect.x;
         for (int j = 0; j <= 15; ++j){
             y = rect.y + j;
             if (((x == oxy.x + 10) && (y == oxy.y)) || (x == oxy.x + 10) && (y == oxy.y + 10)){
                oxy.x = 470;
                oxy.y = 470;
             }
         }
         
         if ((rect.x == oxy.x) && (rect.y + 15 == oxy.y)){
            oxy.x = 470;
            oxy.y = 470;
         }
         if ((rect.x == oxy.x) && (rect.y == oxy.y + 10)){
            oxy.x = 470;
            oxy.y = 470;
         }
     } 

Proč vykresluješ čtvreček 15×15px (když pominu fakt, že ho celkem zbytečně vyřezáváš z velké surface) několikrát přes sebe? Vykreslíš čtvreček 15×15 px a posuneš se o jeden pixel (místo 15). Navíc s tím, jak to máš vytvořené ani nepotřebuješ cyklus (tedy jakékoliv vykreslování po čtvrečcích) - můžeš na jedno volání SDL_BlitSurface vykreslit celý obdélník. Pamatuj - s voláním BlitSurface je vždy spojena nějaká režie. Tzn vykreslit stejnou oblast po pixelech tvá MNOHEM déle, než po celém obdélníku (při použití BlitSurface).

Začal bych znovu a přehodnotil celý program. Nakreslil si na papír graf. Zjednoduš to. Logika by měla být v tomto pořadí - obsloužit hráče (podle šipek jím posunout, otestovat kolizi), vykreslit pozadí, vykreslit hráče.

Nahlásit jako SPAM
IP: 85.160.33.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Adam
~ Anonymní uživatel
176 příspěvků
18. 3. 2012   #13
-
0
-

#12 yaqwsx
No páni, já něco tušil že ten kód není v pořádku.

Samozřejmě velké díky za rady. Doufám že ty hlavičkové soubory nějak zkutim, a jestli to někdy celé překopu, tak možná pošlu i odkat. DÍKY MOC KLUCI

Nahlásit jako SPAM
IP: 46.174.59.–
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, 83 hostů

Podobná vlákna

SDL hra — založil Erik

CPU — založil sin_x

C# teplota CPU — založil Dingo

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ý