• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML pętla stałorokowa

Object Storage Arubacloud
0 głosów
215 wizyt
pytanie zadane 14 sierpnia 2017 w C i C++ przez Programeł Gaduła (3,500 p.)

Witam

Od kilku dni mam problem z pętlą stałokrokową. Szukałem na różnych stronach takiej albo innej pętli i żadna mi nie zadziałała. I mam problem z pokazaniem ile jest aktualnie fps w grze :P

Dlatego zwracam się tutaj o pomoc w wytłumaczeniu tego mechanizmu (?)  lub pokazanie kodu i go przetłumaczenie krok po kroku.

Za wszelką pomoc dzięki ;)

komentarz 14 sierpnia 2017 przez criss Mędrzec (172,590 p.)
Dosłownie kilka dni temu było na forum na ten temat:
https://forum.pasja-informatyki.pl/276445/jak-dziala-petla-stalokrokowa

Stamtąd linkami dojdziesz do kilku innych tematów.

1 odpowiedź

+1 głos
odpowiedź 14 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
edycja 14 sierpnia 2017 przez Ehlert
//...

sf::Clock 		timer;
sf::Time		fps,
				accumulator = sf::seconds(0);

//ustal ile razy na sekundę ma być updateowna logika
//dajmy 33 razy
const sf:::Time	updateTime = sf::seconds(0.03f);

while (app.isOpen()) 
{
	//od tego momentu poniżej tej linijki 
	//zmienna fps przechowuje wartość czasu
	//którego pc potrzebował do wygenerowania 
	//klatki
	fps = timer.restart();

	
	//dodajesz wartość do akumulatora
	accumulator += fps;
	if (accumulator >= updateTime) 
	{
		//tutaj wykonujesz update całej logiki
		//NIE ZAPOMNIJ O:
		accumulator = sf::Time::Zero;
	}
}
komentarz 14 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)

Dla każdego obiektu który będzie zmieniał swój stan możesz zastosować dziedziczenie po "interfejsie":

class Updateable{

    virtual void update() = 0;

};

Jak zaczynasz bardziej ogarniać zacznij izolować i separować konkretne mechanizmy. 

1
komentarz 14 sierpnia 2017 przez niezalogowany
const sf:::Time updateTime = sf::seconds(1/30);

1/30 daje po rzutowaniu 0. 

komentarz 14 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)

Dzięki, updated smiley

komentarz 14 sierpnia 2017 przez niezalogowany
edycja 15 sierpnia 2017

Wrzucam jeszcze z dodatkowym prostym mierzeniem FPSów (autor chyba też to chciał):

#include <iostream>
#include <SFML/Graphics.hpp>

int main()
{
	sf::RenderWindow window(sf::VideoMode(1024, 720), "Czesc");

	size_t frames = 0;
	sf::Clock timer;
	sf::Time fps, accumulator;
	sf::Time frame_accumulator;
	const sf::Time updateTime = sf::seconds(1.f / 30); // ewentualnie 0.033 bo blizej 30 FPS :)

	while (window.isOpen())
	{

		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed) window.close();
		}

		
		fps = timer.restart();
		accumulator += fps;
		if (accumulator >= updateTime)
		{
			accumulator = sf::Time::Zero;
            window.clear(); 
            window.display();
			frames++;
		}

		frame_accumulator += fps;
		if (frame_accumulator >= sf::seconds(1))
		{
			std::cout << frames << "\n";
			frame_accumulator = sf::Time::Zero;
			frames = 0u;
		}
		

		
	}
	std::cin.get();
}
komentarz 14 sierpnia 2017 przez Programeł Gaduła (3,500 p.)

A czy to zlicza dobrze FPS ? 

sf::Clock timer;

int frames = 0;
if(timer.getElapsedTime().asSeconds() > 1)
{
    std::cout<<frames<<std::endl;
    timer.restart();
    frames = NULL;
}

 

komentarz 14 sierpnia 2017 przez niezalogowany
Liczy ile w ciągu sekundy wykonał się blok kodu z linią frames++. Możesz sprawdzić ile będziesz miał tysięcy FPS bez żadnej obsługi czasu. Widzę, że zmieniłeś nazwę frameClock'a na timer. Nie wiem czy to na pewno jest dobry pomysł robić to na jednym zegarze, bez dodatkowej zmiennej na czas.
komentarz 14 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
@Hipcio IMO Twój sposób jest strasznie przekombinowany. Nie wiem po co dwa zegary. Całą grę można obsłużyć jednym zegarem. Bez względu na to, czy chcesz liczyć fpsy, czy korzystać z pętli stałokrokowej.
komentarz 14 sierpnia 2017 przez niezalogowany
@Ehlert muszę się zgodzić. Wrzucę edita

Podobne pytania

0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 10 stycznia 2023 w C i C++ przez Rykez Początkujący (250 p.)
0 głosów
0 odpowiedzi 464 wizyt
0 głosów
0 odpowiedzi 483 wizyt
pytanie zadane 9 lutego 2022 w C i C++ przez CheF123 Początkujący (450 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...