Základní herní smyčka – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Základní herní smyčka – .NET – Fórum – Programujte.comZákladní herní smyčka – .NET – Fórum – Programujte.com

 

Coffee
~ Anonymní uživatel
7 příspěvků
30. 7. 2012   #1
-
0
-

Zdravim všechny, chtěl bych si udělat takovou základní herní smyčku, ale nějak jsem se zasekl hned na začátku :(

Hra by měla mít 60fps, takže smyčka by měla mít Sleep na 1000/60 = 16.6s, ale zas to je fixní hodnota bohužel a nebylo by to plynulý, ptoto se používá výpočet na čas delta, ale tady nějak nevim jak udělat tenhle základ :(

Mám zatím tohle 

        private void GameLoop()
        {
            while (!IsGameOver)
            {
                ticks = Environment.TickCount;

                if (ticks > lastTick + 17) // zde nevim pro 17
                {
                    lastTick = ticks;

                    // update, vykresleni apod.
                }
            }
        }

Můžete mi prosím nějak poradit nebo napsat, jak mám udělat ten vypočet fps, delta času a zakomponovat to do ty základní herní smyčky?

Nějak se snažim, aby to bylo plynulý a nebylo limitovaný maximální FPS na 60 (třeba přes VSync to limitovat pak - to ted nevim jak bych měl delat, ale základní herní smyčku nechci mít limitovanou)

Díky

Nahlásit jako SPAM
IP: 213.168.183.–
zlz
~ Anonymní uživatel
634 příspěvků
31. 7. 2012   #2
-
0
-

Vůbec nechápu, co chceš. Omezení na 60 fps tam přece máš. Jestli ho nechceš, tak ho prostě vyhoď.

Nahlásit jako SPAM
IP: 80.188.216.–
Coffee
~ Anonymní uživatel
7 příspěvků
31. 7. 2012   #3
-
0
-

ale ten hlavní cyklus má rychlost jako CPU, takže mi CPU vyskočí na 40% snad a já jsem myslel to nějak limitovat.. přece když ve smyčce nic nemám, nemůže to mít takový využití CPU

a pak nevim ten výpočet delta času a fps a pak nevim proč je v tý podmínce +17 (jsem našel na googlu, že to je snad všude, ale nevim proč)

Nahlásit jako SPAM
IP: 213.168.183.–
KIIV
~ Moderátor
+43
God of flame
31. 7. 2012   #4
-
0
-

nevis proc? Environment.TickCount vraci cas v milisekundach... ty chces prekvapive pockat 16.6 ms na dalsi prekresleni... asi bude lepsi to zaokrouhlit na cele cislo...  sakra, jaka spojitost tu unika?

kazdopadne to stejne nesnizi zatizeni procesoru.. musel bys tam mit idealne aspon nejaky usleep ci tak

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Coffee
~ Anonymní uživatel
7 příspěvků
31. 7. 2012   #5
-
0
-

aha, takže 17 je podstate zaokrouhlených 16.6 nahoru.. čili když bych chtěl zvednou maximální fps, tak jednoduše  snížim 17...

fajn, takže když dole použiju Sleep(..), tak jakou hodnotu tam mám dát? též 17ms ? Není lepší vypočítat delta čas a ten hodit do Sleep(..) aby to nebylo tak trhaný?

Nahlásit jako SPAM
IP: 213.168.183.–
liborb
~ Redaktor
+18
Guru
31. 7. 2012   #6
-
0
-

Principielně bych to viděl nějak takto: 

private void GameLoop()
{
	while (!IsGameOver)
	{
		ticks = Environment.TickCount;

		// update, vykresleni apod.

		updateTime = Environment.TickCount - ticks;

		if (updateTime < 17) Thread.Sleep(17 - updateTime);
	}
}
Nahlásit jako SPAM
IP: 78.80.52.–
Coffee
~ Anonymní uživatel
7 příspěvků
31. 7. 2012   #7
-
0
-

Jsem to ještě nějak spatlal a sice mi to funguje, ale nechápu proč se mi to seká (vykresluju 100 kuliček pod gravitací)

Když to nechám na CPU, že nebudu fixovat max 60FPS, tak to je plynulý, ale žere to strašně CPU, ale když to fixuju na max 60 FPS, tak mi Sleep(..) nastává většinou kolem 16-17ms a stejně mám lagy i když mi to ukazuje že mám 60 FPS

Můžete mi to pls opravit nebo říct kde mám chybu? Nějak jsem předpokládal, že to bude plynulý bez trhání a ono **** :(

        private void GameLoop()
        {
            long lastTicks = Environment.TickCount;
            int lastFps = 0;
            int fps = 0;

            SetGameState(GameState.Started);

            while (IsGameRunning)
            {
                // výpočet času a delta času
                long ticks = Environment.TickCount;
                int updateLength = (int)(ticks - lastTicks);
                lastTicks = ticks;
                double delta = updateLength / 17.0;

                // výpočet FPS
                lastFps += updateLength;
                fps++;

                // aktualizuje FPS každych 500ms
                if (lastFps >= 500)
                {
                    int temp = fps * 2 + 2; // +2 protože při 17ms je max 58FPS
                    FPS = (temp <= 60) ? temp : IsFixedFPS ? 60 : temp; // může nastat i 62FPS
                    lastFps = 0;
                    fps = 0;
                }
                OnGameLogic(delta); // herní logika

                // vykresluje obraz pouze v případě, že hra není pozastavena
                if (State != GameState.Paused)
                    this.SafeRefresh(); // safe thread-cross (invalidate okna)

                updateLength = (int)(Environment.TickCount - ticks);

                // pokud nebude nastaveno fixní FPS na max 60, tak podle updatu bude
                // vyrovnávat rychlost hlavního vlákna
                if (IsFixedFPS && updateLength < 17)
                    Thread.Sleep(17 - updateLength);
            }
            SetGameState(GameState.Stopped);
            FPS = 0;
        }

Doufám, že někdo bude vědět :)

Nahlásit jako SPAM
IP: 213.168.183.–
zlz
~ Anonymní uživatel
634 příspěvků
31. 7. 2012   #8
-
0
-

Zmenšením počtu aktualizací to přece nemůže být plynulejší...

Nahlásit jako SPAM
IP: 80.188.216.–
Coffee
~ Anonymní uživatel
7 příspěvků
31. 7. 2012   #9
-
0
-

#8 zlz
já ale nemluvim o zmenšení počtu.. právě naopak... pokud mám Thread.Sleep(17), tak by to mělo odpovídat 58 FPS, ale i tak se mi to laguje a nechápu proč... pokud tam nedam Thread.Sleep() vubec, tak je to plynulý, ale je melký vytížení CPU...

ty lagy jsou drobný, lehký škubání kuliček při pohybu, i když u nich mám nastavený pohyb po X,Y násobenej s delta časem, tak se to laguje stejně

Nahlásit jako SPAM
IP: 213.168.183.–
zlz
~ Anonymní uživatel
634 příspěvků
31. 7. 2012   #10
-
0
-

Když to jede naplno, tak je těch aktualizací snad víc, než když tam máš sleep a snižuješ fps.

.   .   .   .   .   .
. . . . . . . . . . .
.....................
Nahlásit jako SPAM
IP: 80.188.216.–
Coffee
~ Anonymní uživatel
7 příspěvků
31. 7. 2012   #11
-
0
-

to je hezký, ale nepotřebuju mít bez Sleep CPU na 40% nonstop i když jede jen samotnej cyklus.. tam Sleep prostě bejt musí...

Nahlásit jako SPAM
IP: 213.168.183.–
zlz
~ Anonymní uživatel
634 příspěvků
1. 8. 2012   #12
-
0
-

Ale ty jsi pořád překvapenej z toho, že když přidáš pauzy, ve kterých se nic nedělá, tak se toho udělá míň, než když tam pauzy nejsou. Taky je otázka, jak funguje zbytek kódu, protože si nedovedu představit, co je tak náročného na hýbání pár kuličkama, že ti to laguje.

Nahlásit jako SPAM
IP: 80.188.216.–
Coffee
~ Anonymní uživatel
7 příspěvků
1. 8. 2012   #13
-
0
-

já jsem hlavně překvapenej z toho, proč to laguje když mi to ukazuje 60fps... zbytek kódu je už nic moc, tahle funkce pro hlavní smyčku je ve vlastním vlákně, takže je to jediný co probíhá a pro pohyb kuličky jen měnim hodnoty x,y a hlavně tuhle třídu kuličky jsem zkoušel na XNA a tam to bylo bez problému

aby to bylo víc jasný, tak funkce pro špuštění je: 

        public void StartGame()
        {
            if (!IsGameRunning)
            {
                SetGameState(OGameState.Initialized);

                IsGameRunning = true;
                gameThread = new Thread(new ThreadStart(GameLoop));
                gameThread.Name = "GameLoopThread";
                gameThread.IsBackground = true;
                gameThread.Priority = ThreadPriority.Highest;
                gameThread.SetApartmentState(ApartmentState.STA);
                gameThread.Start();
            }
        }
Nahlásit jako SPAM
IP: 213.168.183.–
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, 24 hostů

Podobná vlákna

Herní engine — založil Big_Ping

Herní Engine — založil Mihulik

C# herní engine — založil Gobik

[C#] Herní vývojář — založil Jan Dolejš

Herni obekty — založil Marvin

 

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