XNA - neplynulá animace   zodpovězená otázka

C#, XNA

Zdravím, v Xna si chci udělat hru, ale když jsem vytvořil jednduchou animaci pohybujícího se objektu po přímce, tak jsem se docela zděsil.Animace sebou každou chvíli "cukala", jako kdyby vynechávala snímky (asi tak po 1 - 2 vteřinách). Prosím o radu, děkuji.

Výstřižek z metody update:

double elapsed = gameTime.ElapsedGameTime.TotalMilliseconds;
pozice.X = (float)(pozice.X + elapsed * rychlost.X);
rectangle.X = (int)(pozice.X);

Výstřižek z metody draw:

spriteBatch.Draw(balon, rectangle, Color.White);
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Příčin může být několik:

1) Pomalé PC nebo nějaký proces, který vytíží CPU na 100% jednou za čas a způsobuje záseky. Případně nějaká nešťastná kombinace hardwaru a driveru grafické karty, zkus updatovat na poslední verzi driverů.

2) Nejsou v aplikaci nějaké složitější výpočty, které občas zaměstnají metodu Update na delší dobu? Nebo je v Updatu jen uvedené?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1) Výkonem to určitě nebude, protože jsem to testoval na dvou počítačích, a ten druhý byl dost silný na to, aby utáhl Crysis 3, natož jeden míček. A mám pocit že na tom druhým bylo zasekávání ještě intenzivnější (možná větším rozlišením).

2) Ne opravdu tam nemám žádné složité výpočty.

Ono se to vcelku neseká, ale vždy když kus urazí plynule, tak jakoby program vynechal pět smímku - vypadá to jako trhnutí dozadu. Kromě toho jsem tam připsal měřič fps - a mám víceméně statických 60, tak jak má být.

Mě to právě odradilo od psaní hry před dávnem, tak jsem se zkusil vrátit a zas nevím co s tím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vystavte nekam cely projekt, zkusim to pustit u sebe. Jeste to muze byt zpusobeno nejakou aplikaci na pozadi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přikládam celý projekt:

http://ulozto.cz/x565SkqP/animace-rar

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zvláštní, kromě použití Timeru, který není úplně nejvhodnější, protože zanáší závislost na Windows Forms, nevidím nic, co by to mohlo zpomalovat. U mě se to nezasekává a to ani nemám moc výkonnou grafickou kartu.

Fakt to nemůže dělat nějaký software na pozadí? Antivirák nebo tak něco?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil jsem tedy pozabíjet co nejvíce aplikací, zastavil jsem antivir a spustil jenom samotnou hru - bez výsledku.

Zastavil jsem časovač a bylo to o trochu lepší, ale pořád to nebylo ono. Na nootebookovým monitoru bych to mohl překousnout, ale když jsem animaci vyskoušel na velké televizní obrazovce s full hd rozlišením, tak byly záseky moc intenzivní. Překvapuje mě že jsem měl stejný výsledek na dvou počítačích... Ještě jsem animaci nechal posoudit od ostatních, kteří na ni měli stejný názor, takže moje iluze to nebude. Asi si hru stejně naprogramuji navzdory problému, ale dost mě to sužuje.

ps. Ještě by mě zájímalo, jestli obsahuje Xna nějaký rozumný časovač. Ten windows.forms jsem tam zatím dal jen provizorně, protože jiný neznám.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ty záseky jsou zvláštní, ještě bych opravdu prověřil driver grafické karty, je možné, že s jinou verzí to dělat nebude.

Ještě mě napadá, že by nějaké nepravidelnosti mohla způsobovat nějaká zaokrouhlovací chyba, ale když jsem to pustil u sebe, nic jsem nepozoroval.

Co se týče časovače, typicky se to u her řeší tak, že v každém updatu si do nějaké proměnné přičtete počet milisekund, kolik trval poslední snímek, a řídíte se podle toho.

Používat Windows Forms timer není vhodné, ten potřebuje message queue, v .NETu je ještě Threading.Timer, ale ten pouští handler zase na jiném vlákně, což také není ideální.

Takže si klidně napište vlastní třídu Timer, která si bude v updatu přičítat do proměnné počet milisekund a jakmile přesáhne 1000, tak 1000 odečtete a provedete nějaký kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chyba v zaokrouhlování - to mě napadlo, ale pak jsem spustil program hada, který jsem kdysi dělal podle místního tutoriálu, a sekání se v něm projevilo také, ale mnohem mírněji. Když máte oči upřené a zaostřené na ten míček v jednom kuse, tak lze sekání vidět, ale jinak ne. Podle mě až bude hra hotová a bude v ní spustu dalších podnětů, tak si sekání ani hráč nevšimne. Ovladače grafiky mám všechny aktuální. A jinak díky za radu s časovačem. To, že se animace zasekává na dvouch počítačích, a u vás ne, zůstává záhadou...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná jen nemám tak dobré oko.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vyzkoušeno na dalším notebooku, malé záseky 4x za sekundu :( Když se dívám na jiný bod na obrazovce, tak míček krásně valí, ale jakmile upřu zrak na něj, tak se začne kousat. Když o té neplynulosti víte, tak se nedá přehlédnout. Teď tedy nevím, jestli Xna neumí zajistit plynulou animaci, nebo mám něco blbě, protože 3 počítače, to už je dost. No nic, budu se snažit programovat dál.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud to dělá i u 60 FPS, tak to možná je fakt nějaká zaokrouhlovací chyba - zkrátka se míček neposouvá rovnoměrně. Ono to může dělat např. u pomalejších pohybů, kde jsou nepravidelnosti způsobené tím, jak se obrázek zarovnává na jednotlivé pixely.

Ještě můžete zkusit zapnout antialiasing, ten by to mohl trochu vyhladit. http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zaokrouhlením to asi nebude, poněvadž se zasekával, i když jsem tam vepsal přímo "pozice += 1,2,3 atd.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak zrovna u takhle pomalého pohybu (60px / sekundu) to asi může vypadat trhaně, zvlášť pokud se třeba pohybuje neanimovaný objekt po jednobarevné ploše.

Těch 60FPS se nedá garantovat ani na výkonném stroji, přeci jen Windows není real-time OS. V čistém DirectX by to možná bylo nepatrně rychlejší, on ten .NET má také nějakou režii (i když celkem malou). Zkuste napsat zbytek hry a uvidíte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechce se mi zakládat nové téma, a proto se zeptám ještě tady. Jak je to s xna a textboxy? Potřeboval bych, aby mohl v editoru hráč napsat jméno levelu. Existuje na to nějaká třída nebo musím psát vlastní? Bylo by to dost zdlouhavé a náročné. Stačil by mi i savefile dialog a openfile dialog z windows forms, ale nejdou mi použít.

Díky za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nové téma by bylo lepší, tady to zapadne, ale to je jedno.

Buď to napsat vlastními silami, nebo použít nějakou knihovnu, je jich víc, ale jeden příklad za všechny - http://nuclexframework.codeplex.com/wiki...

SaveFileDialog a OpenFileDialog nevím, jestli ta knihovna má, ale určitě půjdou vyrobit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To mě docela překvapuje, že v xna není taková základní věc. No, každopádně děkuji za tip na knihovnu, ale asi si to stejně napíšu sám. A savefiledialog z windows forms nelze do hry zakomponovat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ono XNA je framework, ne engine, proto řeší jen základní věci.

Kombinovat SaveFileDialog půjde možná jen pokud aplikace běží v okně, ale na fullscreen módu to určitě nejde. Musíte si to udělat sám.

A tu knihovnu klidně použijte, psát si textboxy sám je docela otrava a udělat to správně není tak úplně jednoduché.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://ulozto.cz/x565SkqP/animace-rar

Majitel souboru si nepřeje soubor zveřejnit a označil jej jako soukromý. Jedná-li se o tvůj soubor, přihlaš se na svůj účet.

Tak na to se asi nepodivu. :(

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback