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

Optymalizacja dużego projektu, spadki wydajności

Object Storage Arubacloud
0 głosów
194 wizyt
pytanie zadane 21 grudnia 2017 w C i C++ przez Łukasz Wasilewski Mądrala (5,190 p.)
Cześć,

pracuję nad dość dużym jak na "nowicjusza" projektem gry i od pewnego czasu zacząłem zauważać spadki wydajności w niektórych momentach jej działania. Projekt jest na zaawansowanym stopniu rozwoju, więc powodów może być mnóstwo, lecz jeśli już teraz widzę problemy, później może być gorzej.

Grę piszę w SFMLu, od całkowitych podstaw tworzę fizykę, obiekty, zachowania przeciwników. Zdaję sobie sprawę, że taka osoba jak ja z zerowym doświadczeniem popełnia mnóstwo błędów, a wiele rozwiązań nie jest mi znanych. Jednak ten projekt ma być furtką do mojej programistycznej kariery i chciałbym go zrobić jak najlepiej.

 

Stąd moje pytanie, czy jest możliwość sprawdzenia która część kodu pochłania najwięcej czasu obliczeniowego tj. powoduje spadki wydajności (nie wiem czy dobrze to napisałem)?
1
komentarz 22 grudnia 2017 przez niezalogowany
Może spróbuj pomierzyć timerem i zobaczyć gdzie znajduje się problem. Czy funkcją zamulającą cały program będzie np system kolizji czy jakiś algorytm szukania najbliższej ścieżki... Trudno coś doradzić bez kodu.
komentarz 22 grudnia 2017 przez Łukasz Wasilewski Mądrala (5,190 p.)
To prawda, bez kodu ciężko, ale wątpię by komuś chciało się analizować kilka tysięcy linijek kodu. Na razie próbuje rozgryźć to powtarzając w kółko jeden poziom i zwracać uwagę w którym momencie przy jakiej czynności pojawia się spadek fpsów.

Ale zapewne sam wiesz jak to wygląda w praktyce, wszystko się ze sobą łączy i ciężko wyciągnąć wnioski, możliwe nawet, że wyciągam je złe.

Dlatego napisałem post, choć w sumie zaczyna do mnie docierać, że tak łatwo nie ma. ^^
komentarz 22 grudnia 2017 przez niezalogowany
Będzie łatwiej jeżeli wrzucisz projekt na github ;)
komentarz 22 grudnia 2017 przez Łukasz Wasilewski Mądrala (5,190 p.)
https://github.com/herupu/squadEvil

Chciałbym tylko zaznaczyć że jest to wciąż wersja robocza. :)
komentarz 22 grudnia 2017 przez niezalogowany

Plik game.cpp metoda mainLoop() obsługa eventów:

void game::mainLoop()
{
	while (true)
	{
		// fizyka

		Event handler;
		if (window.pollEvent(handler))

		// cos tam cos tam
	}
}

Zamiast if powinieneś stosować while. Teraz obsługujesz 1 event następnie rysowanie, fizyka i dopiero kolejny event itd. Czyli jeżeli masz wciśnięte np dwa klawisze naraz to pojawi się desynchronizacja. Jeżeli nie masz jakiegoś innego opóźnienia to pół biedy - nic nie zobaczysz :D Ale takie problemy mogą się nawarstwiać. Na takim kodzie widać lepiej (wciśnij dwa klawisze jednocześnie i przestań gdy prostokąt znajdzie się prawie na dole - powinien polecieć dalej):

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

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

	sf::RectangleShape rect1;
	rect1.setFillColor(sf::Color::Red);
	rect1.setSize({200, 300});
	const float velocity = 15;

	while (window.isOpen())
	{
		sf::sleep(sf::milliseconds(50)); // jakies inne opoznienie stale dla podkreslenia efektu :D

		sf::Event event;
		if (window.pollEvent(event)) // pozniej zmien na while
		{
			if (event.type == sf::Event::Closed)
			{
				window.close();
				break;
			}

			if (event.type == sf::Event::LostFocus)
			{
				window.setFramerateLimit(0);
			}
			else if (event.type == sf::Event::GainedFocus)
			{
				window.setFramerateLimit(60);
			}

			if (event.type == sf::Event::KeyPressed)
			{
				if (event.key.code == sf::Keyboard::Up)
				{
					rect1.move({ 0, -velocity });
				}
				else if (event.key.code == sf::Keyboard::Down)
				{
					rect1.move({ 0, velocity });
				}
				else if (event.key.code == sf::Keyboard::Left)
				{
					rect1.move({ -velocity, 0 });
				}
				else if (event.key.code == sf::Keyboard::Right)
				{
					rect1.move({ velocity, 0 });
				}
			}
		}
	
		window.clear();
		window.draw(rect1);
		window.display();
	}

}

Tak na szybko zauważyłem. Pewnie znajdzie się jeszcze kilka innych przyczyn ;)

1 odpowiedź

+3 głosów
odpowiedź 22 grudnia 2017 przez adrian17 Ekspert (344,860 p.)
edycja 22 grudnia 2017 przez adrian17
 
Najlepsza

Stąd moje pytanie, czy jest możliwość sprawdzenia która część kodu pochłania najwięcej czasu obliczeniowego tj. powoduje spadki wydajności (nie wiem czy dobrze to napisałem)?

Profiler.

Visual Studio ma taki wbudowany; jest też kilka innych na Windowsa; na Linuxie też jest kilka dość łatwych w użyciu w repozytorium.

Podobne pytania

0 głosów
2 odpowiedzi 113 wizyt
pytanie zadane 18 lutego 2019 w Sprzęt komputerowy przez Panda Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 173 wizyt
pytanie zadane 23 marca 2020 w Offtop przez JakSky Stary wyjadacz (14,770 p.)
0 głosów
1 odpowiedź 205 wizyt

92,584 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 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!

...