XNA 4.0 - špatný čas (nerovná se času podle normalních hodin)   zodpovězená otázka

C#, XNA, Algoritmy

Dobrý den,

rozhodl jsem se že si naprogramuju stopky. Aby to pěkně vypdalo rozhodl jsem se to udělat v XNA, aby jsem mohl vykreslovat hodiny s pohybujícími se ručičkami. Ale s hrůzou jsem zjistil, že když jsem měřil na normálních hodinách minutu tak v xna mi to ukazovalo 50 sekund cože je 10 sekund za minutu rozdíl. Absolutně nechápu jak je to možné, čas vy GameTime by měl být přeci přesný nebo ne ? Ale očividně tomu tak není, proto bych se chtěl zeptat jestli nenajdete nějakou chybu v níži přiloženém kódu nebo nenavrhly jinou přesnou alternativu pro měření času v XNA.

první možnost

        private void StopWatchForm_OnUpdate(object sender, UpdateEventArgs e)
        {
            KeyboardState keyboard = Keyboard.GetState();
            MouseState mouse = Mouse.GetState();

            if (IsCount)
            {
                time += (float)e.GameTime.ElapsedGameTime.Milliseconds;
               
                titleLabel.Text = time.ToString();
            }

            if (keyboard.IsKeyDown(Keys.Space) && previousKeyboard.IsKeyUp(Keys.Space))
            {
                IsCount = true;
                time = 0;

            }
            else if (mouse.RightButton == ButtonState.Pressed && previousMouse.RightButton == ButtonState.Released)
            {
                IsCount = false;
            }

            previousKeyboard = keyboard;
            previousMouse = mouse;
        }

druhá možnost

        private void StopWatchForm_OnUpdate(object sender, UpdateEventArgs e)
        {
            KeyboardState keyboard = Keyboard.GetState();
            MouseState mouse = Mouse.GetState();

            if (IsCount)
            {

                titleLabel.Text = ((float)e.GameTime.TotalGameTime.TotalSeconds - time).ToString();
            }

            if (keyboard.IsKeyDown(Keys.Space) && previousKeyboard.IsKeyUp(Keys.Space))
            {
                IsCount = true;
                time = 0;
                time = (float)e.GameTime.TotalGameTime.TotalSeconds;
            }
            else if (mouse.RightButton == ButtonState.Pressed && previousMouse.RightButton == ButtonState.Released)
            {
                IsCount = false;
            }

            previousKeyboard = keyboard;
            previousMouse = mouse;
        }

Časový rozdíl není pokaždé stejný někdy to je třeba 13 jindy zase 8 atd...

předem děkuji za odpovědi

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

Už jsem XNA hodně dlouhou dobu neviděl, ale tipoval bych to na to, že používáte e.GameTime. Jestli se dobře pamatuji, tak třída UpdateEventArgs má vlastnost RealTime, která by měla být použita ve Vaší aplikaci. GameTime měří čas strávený na procesoru pouze Vaší aplikací.

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

Trieda UpdateEventArgs tú vlastnosť mala, ale u XNA 4 si povedali, že je zbytočná a dali to preč.

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

Takže to vypadá, že přesný čas v XNA neexistuej ?

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

Ten UpdateEventArgs jsem si udělal sám pro svoji událost, takže v tomhle případě tam určitě RealTime nebude. A žádnou jinou třídu RealTime jsem na msdn.com nenašel, tak nevím, ale děkuji za snahu. :)

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

http://blogs.msdn.com/b/shawnhar/archive...

Podle tohoto článku tu vlastnost odstranili. A upřímně musím říct, že je to průser a velmi nebezpečný precedens. Brzy bychom se mohli dočkat toho, že nám odstraní i jiné funkce, protože je spousta lidí líná přečíst si dokumentaci a zjistit, k čemu vlastně jsou.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Už jsem o tom taky myslim někde četl. Ale netušli jsem, že by to mohlo dělat takovou paseku. A docela mi to vadí... třeby kdybych dělal hru kde je 1 den 24 min tak by měl třeba 20 min a to už je sakra rozdíl. Takže to teda vypadá že v XNA asi stopky neudělám :(.

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

Píše tam že můžu použít něco z NETu tak se v tom skusim trochu porejt (Stopwatch, Environment.TickCount, DateTime.Now, etc).

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

Tak nakonec jsem použil StopWatch a vše krásně funguje.

tady ještě kód jak to vypadá a mockrát děkuji.

        private void StopWatchForm_OnUpdate(object sender, UpdateEventArgs e)
        {
            KeyboardState keyboard = Keyboard.GetState();
            MouseState mouse = Mouse.GetState();        
            
            if (st.IsRunning)
            {
                bigHand.Rotation = MathHelper.ToRadians((float)360 * (float)st.Elapsed.TotalSeconds / (float)60); //x = 360 * time / 60
                titleLabel.Text = st.Elapsed.TotalSeconds.ToString();
            }

            if (keyboard.IsKeyDown(Keys.Space) && previousKeyboard.IsKeyUp(Keys.Space) && !st.IsRunning)
            {
                st.Restart();
            }
            else if (mouse.RightButton == ButtonState.Pressed && previousMouse.RightButton == ButtonState.Released && st.IsRunning)
            {
                st.Stop();
            }

            previousKeyboard = keyboard;
            previousMouse = mouse;
        }

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

Dobrý nápad, ale keď neskôr budete chcieť hru, v ktorej to pužívate, dať na XBOX, tak máte problém.StopWatch používa WinApi, to na XBOXe nájdete len ťažko.

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

Toto bude jen na pc. Ale zajímalo by mě jak lze zjistit co z .NET funguje na jakých platfomách Xbox, Win Phone, .... Na msdn např: u toho stopwatch je X jako xna (pod titulkem podporované XNA). A to tedy neznamená, že to půjde na Windows, Xbox, Win Phone,.. ?? Jestli ne, kde tedy lze zjistit co půjde na xbox, win phone ....? Xbox a win Phone asi stejně nikdy mít nebudu, ale stejně by mě to zajímalo.

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

Neviem, ako zistiť, čo pôjde na XBOXe, ale začal by som skúmaním zložky C:\Program Files\Microsoft XNA\XNA Game Studio\v4.0\References\Xbox360 .

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

Je to v [mscorlib]System.Diagnostics.Stopwatch , ako na riadnom .nete, ale najekou záhadou mi to Reflector nevedel disassemble -núť.

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