Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 16. červenec 2013, 17:34:07 Předmět: XNA a vytazenie procesoru |
|
|
Ahoj
robim jeden projekt v XNA a dost ma trapi vytazenie procesoru aplikaciou.
Ked zapnem holy program co mi vygeneruje prostredie tak mam vytazenie procesoru nasledovne :
Skusal som este spustit aplikaciu v TorqueX 2D a tam je vytazenie taketo :
Ako je mozne ze aplikacia v TorqueX ma ovela nizsie vytazenie na prvom jadre a este k tomu je cela zataz rozlozena rovnomernejsie na vsetky jadra procesoru ? Aky mate nazor na XNA co sa tyka vytazenia procesoru ?[/img] |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 17. červenec 2013, 09:00:07 Předmět: |
|
|
Nevím jak to je v XNA, ale jestli tam máš prázdnej main loop, bez jakýhokoliv brzdění (třeba vertical sync), tak to je uplně normální. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 17. červenec 2013, 19:49:47 Předmět: |
|
|
Ziadne konkretne obrazky si nepostol, takze netusime co za problem vlastne mas, mimo toho, ze "sa ti nieco nepaci", ze to XNA robi inak ako Torque.
Pokial mas ale problem s CPU vykonom, tak problem bude rozhodne vyhradne na tvojej strane, ja som s XNA robil hodne na vsemoznych nehernych PC konfiguraciach, niekolkych XBOX-och a zopar WindowsPhones, ktore su z vyssie uvedeneho suverenne to najpomalsie, na com XNA oficialne bezi, a predsa som ani tam ziaden problem s CPU vykonom nezaregistroval.
XNA runtime na PC ti garantuje GarbageCollection na osobitnom jadre, takze na rozdiel od XBOX-u, kde sa ti runtime surovo zasekne aj na niekolko sekund (ak si kodil prasacky, a leakoval RAMku krista-krazom), na PC tento problem praveze nemas, kedze GC bezi paralelne na inom jadre (takze ti kod moze prasacky chrochtat, co ti srdce raci).
XNA runtime na WP7 ma generational GC, takze tento [podla mna primarny] runtime problem nenastava uz z principu. A predsa vsetko na phone bezi paralelne s tvojou hrou.
CompactFramework runtime na X360 funguje trochen inak, a XNA ma exkluzivne rezervovane jedno jadro pre runtime, hra ti bezi na inom, ktore, bohuzial, je zdielane aj OS XBOX-u, co je teda, hodne naprd - ale predsa dokazes aj s XNA z toho X-ka vytiahnut celkom dost - moj Western tam napr. uplne v pohode bezi v 1920x1080 s kopou efektov.
Ak by som si mal vybrat, ci mi XBOX bezi na 15% vykonu alebo 100%, tak si vyberam 100%, lebo je to konzola, na ktorej mi ma bezat hra, takze musi bezat na plne gule - BTW na PC by si azda chcel, aby ti z 8 jadier 6 lezalo uplne idle, a tie zvysne 2 bezali na 8% zatazi popri renderovani 3D grafiky ?!?
Takze, ak by si nahodou mal nejaky pocit, ze na PC to XNA nebezi dobre, tak si si pomylil platformu, pretoze na PC sa praveze s XNA robi suverenne najlahsie -mozes sa vrhnut na pouzivanie Stringov, enumov, Dictionaries a podobnychn .NET zverstiev, ktore ti leakuju megabajty RAMky za par sekund behu (kazde 2 MB sa ti totiz spusti GC).
Jo, a nezabudaj, ze XNA je de facto len wrapper nad DX9...
Sleepovat si kazdy frame skusal, ze co ti to spravi ? |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 19. červenec 2013, 21:31:19 Předmět: |
|
|
Ono to je cele tak ze som zacal programovat 2D plosinovku. Ked som urobil nejake zakladne veci ako pohyb, skakanie, gravitacia a detekcia kolizii tak som sa pozrel ze ako mi to cele vytazuje procesor a ako vyuziva jednotlive jadra a bol som prekvapeny ze to prve jadro mam zatazene na maximalny vykon. Dakujem za komentar lebo som nevedel ze ako XNA vlastne pravuje a ze na prvom jadre bezi cela "GarbageCollection". Programujem len vo volnom case a do XNA moc nevidim tak ked narazim na urcite veci co neviem v XNA nastavit tak sem urcite este nejake to vlakno postnem. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 20. červenec 2013, 16:57:59 Předmět: |
|
|
Ten garbage collector ti ale nevytěžuje celé CPU, většinu bere tvá hra. Nějaká smyčka apod. V jedný svý hře (ne XNA, ale tam by se to udělalo stejně), jsem po dokončení snímku zbylý čas do požadovaného fps sleepoval a vytížení CPU spadlo na třetinu (a větrák notebooku se ztlumil) . _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 22. červenec 2013, 13:27:11 Předmět: |
|
|
Skusil som to s tym sleepnutim hernej slucky na 10ms a vytazenie procesoru kleslo na minimalne hodnoty. hra ide pekne plynule. dik
este by som sa vas chcel opitat ako pocitate FPS. Ja to robim nasledovne
kód: |
FPS = 1.0f / (float)gameTime.ElapsedGameTime.TotalSeconds" |
Stale aj ked sleepujem hernu slucku mi to pocita 60 FPS. kde robim chybu ? |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 22. červenec 2013, 17:11:17 Předmět: |
|
|
Framy by som ti doporucil inkrementovat a kazdu sekundu to preratat nanovo (s tym, ze si jak cas, tak framecount - logicky - ulozis).
Ad 60 fps - zrejme mas zapnuty VSYNC. Nastav si GraphicsDeviceManager.SynchronizeWithVerticalRetrace, ked inicializujes gfx mod. |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 22. červenec 2013, 18:55:27 Předmět: |
|
|
Sprvil som to ako si napisal. Inkrementujem framy a pricitavam k apsolutnemu casu uplinuly za jedno opakovanie hernej slucky. ked sa apsolutny cas rovna alebo je o nieco vavsi ako 1.0f tak nastavim pocet snimkov a vynulujem premenne a pocitam odznova.
Ten VSYNC a GraphicsDeviceManager.SynchronizeWithVerticalRetrace sa mi doladit nepodarilo lebo ani neviem co to je. Ked sa pocet snimkov rovna nad 50 tak na to kaslem. Idem teraz riesit ine veci. |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 22. červenec 2013, 19:33:32 Předmět: |
|
|
Niekde, v tom sampli co pouzivas, sa ti inicializuje gfx mod a nastavuje sa rozlisenie. Len tam dopln jeden riadok s tou premennou co som ti napisal vyssie.
VSync predpokladam vies, co znamena, ci ? |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 22. červenec 2013, 23:03:50 Předmět: |
|
|
Jinak VSync můžeš mít klidně i 24 fps - když si pouštím 24Hz film na FullHD IPS TV a nechci, aby poskakoval každou sekundu obraz, tak musím na HDMI výstupu nastavit taky 24 Hz (když si pouštíte film přes DLNA, tak to dělá automaticky TV; podobně automaticky to dělaj různá multimediální centra). _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 23. červenec 2013, 18:40:26 Předmět: |
|
|
No stoho co som pochopil ten VSync nastavuje FPS na rovnaku frekvenciu ako je ta obnovovavia monitoru. To znamena ze ked mam tych 60 Hz tak mi to asi ani viac nepojde. Vypol som to GraphicsDeviceManager.SynchronizeWithVerticalRetrace. Teraz som to skusal a stale mi to pocita 50 FPS. Aj ked to vypnem. |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 23. červenec 2013, 19:40:51 Předmět: |
|
|
Tak ono, drivery vedia forcnut VSync, bez ohladu na to, co si ty nastavis, takze este by som to pozrel v driveroch.
Dalsia vec - pises teraz 50 fps, nie 60. To vyzera, ze tam mas uz celkom dost, ze mas CPU tak vytazene.
Skus si odremovat nejake CPU-intensive metody, ze na kolko ti vyskoci FPS v prazdnej scene.
Jaku mas GFX / CPU vlastne ? |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 24. červenec 2013, 12:03:57 Předmět: |
|
|
No to FPS som vyriesil teraz takto :
kód: |
class KalkulatorFPS
{
int pocetSnimkov = 0;
float celkovyCas = 0f;
public double FPS { get; set; }
public void Aktualizuj(float cas)
{
celkovyCas = celkovyCas + cas;
pocetSnimkov = pocetSnimkov + 1;
if (celkovyCas >= 1.0f)
{
FPS = pocetSnimkov;
pocetSnimkov = 0;
celkovyCas = 0f;
}
}
}
|
Tem cas nastavujem cez "gameTime.ElapsedGameTime.TotalSeconds".
Dava mi to teraz 60FPS. Neviem ako je to mozne ale ked som to robil cez Environment.TickCount tak mi to pocitalo iba 50 FPS. Vytazene CPU nemam lebo mam len par objektov v scene. rata to v pohode. Ten program spustam na iMac s nainstalovanym Windowsom cez BootCamp.
Graficku mam Radeon 6770m a procesor Intel Core i5-2500S. Ovladace original Apple. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 24. červenec 2013, 12:23:37 Předmět: |
|
|
Tak mě napadá, jestli tam sleepuješ nebo používáš GetTickCount, že implicitně je ve Windows granularita pro Sleep i GetTickCount nějakých 16 ms (podle verze OSu), takže Sleep(1)..Sleep(16) by mohly dělat totéž.
Jediná možnost je nepoužívat GetTickCount ale timeGetTime a na začátku programu zavolat timeBeginPeriod(1) a na konci timeEndPeriod(1) - tímhle jsi schopen měřit čas/sleepovat s milisekundovou přesností (sleepovat bez záruky). Jediná nevýhoda je, že tohle trochu víc zatíží systém (ale v dnešní době pokud nemáš opravdu něco prastarého, by to neměl být absolutně problém).
Toto ale platí pouze pro C/C++, jak to mají řešené v tom, v čem děláš, nevím, pokud toto už používají (nedivil bych se), tak bude problém jinde.
Trochu OT: Jinak QPC bych nepoužíval vůbec, nemusí na to být spoleh - nevíš totiž, jak to mají řešené.
Myslím, že v poslední době jsou k dispozici speciální high precision časovače, takže tam by neměl být problém.
Dřív nejlepší, co bylo, byl rdtsc a v některých verzích systému se to používalo.
Některé starší multicore procesory ale měly zvlášť čítač pro každé jádro, takže pokud se ti vlákno, kde jsi to měřil, přeplo na jiný procesor, tak výsledek nebyl spolehlivý. No a nakonec tady máme moderní procesory s turbo boostem, takže rdtsc dnes není moc použitelný.
Obecně ve hře high performance časovače nevyužiješ, pokud tedy neprofiluješ. A i tam bych upřednostnil samplovací profilery (pro Windows skvělý open source Very Sleepy), výhoda je, že nemusíš vůbec instrumentovat (jen potřebuješ debug info a dost vzorků). |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 26. červenec 2013, 08:05:13 Předmět: |
|
|
no pri pouziti QPC je nutne uzamknut vlakno kde sa vola na jedno jadro inak to moze robit problemy. mam totiz pocit ze QPC pouzival prave rdtsc. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
|