[c++] Mało wydajny algorytm aplikacji

0

Witam, piszę symulację hodowli (a raczej życia) robaków. Mam pewien problem. Gdy robaki mają się rozmnażać spadają dość sporo fps'y. Przy 3 rozmnażaniach jednocześnie spada o około 30 % fpsów.

void CWorm::checkWormCollision()
{	
	sf::Vector2f ownPos = Sprite.GetPosition();
	for(int i=0;i<CGameplayState::Worms.size();i++) {

		if (CGameplayState::Worms[i]->isFemale && CGameplayState::Worms[i]->canReproduce()) {
			
			CGameplayState::Worms[i]->getSprite().GetPosition();
			if (abs(ownPos.x - CGameplayState::Worms[i]->getSprite().GetPosition().x) < 7 &&
				abs(ownPos.y - CGameplayState::Worms[i]->getSprite().GetPosition().y) < 7)
			{
				CGameplayState::Worms[i]->getSprite().stopAnimation();
				setWormState(REPRODUCE);
				CGameplayState::Worms[i]->setWormState(REPRODUCE);
				TimerReproduction.Reset();
				CGameplayState::Worms[i]->TimerReproduction.Reset();
				break;
			}
		}

	}

}

Ta metoda jest niewydajna, jest ona wywoływana co klatkę, ale nawet po zmianie na wywołanie co 0.1s i co 0.5s nic się nie zmieniło
Sprite to obrazek robaka
Worms to wektor przechowujący wszystkie robaki
isFemale - pole klasy bool, czy robak jest kobietą
canReproduce() - metoda zwracająca bool (sprawdzany jest tylko wiek robaka)
REPRODUCE - enum
TimerReproduction z biblioteki SFML typ Clock, zlicza mili sekundy czy inne części sekundy

Co można byłoby tutaj zmienić?

A i ta metoda checkCollision jest wywoływana tylko dla męskich robaków.

0

http://xion.org.pl/productions/texts/coding/game-programming/real-time-loop/
wyszukaj tam fragmentu:
Osobliwości FPS #2 - Nieliniowość

0

dziękuję za odpowiedź, ale to nie rozwiązuje problemu, ponieważ ilość klatek spada do 1 :|
A przy 300 obiektach powinno być znacznie więcej, przed wywołaniem tej metody osiągam ponad 300 klatek. Więc spadek jest duży bez zwiększania ilości obiektów.

0

Zauważ, że twój algorytm ma złożoność obliczeniową n2. Musisz zrobić coś co zmniejszy złożoność obliczeniową.
Jedną z metod jest podział świata robaków na sektory i sprawdzanie kolizji jedynie z obiektami bieżącego sektora (lub sąsiedniego jeśli robak jest blisko granicy między sektorami).
Może powinieneś mieć też osobne tablice na samice i samce, bo testowanie związków homoseksualnych jest stratą czasu :).

0

racja, ale pierwszy warunek w ifie to isFemale, jeśli on nie zostanie spełniony to reszta się nie wykonuje. myślę, że strata czasu na tym jest niewielka. myślałem raczej, żeby pójść w sortowanie tablic, wektorów.

0
bemol napisał(a)

Gdy robaki mają się rozmnażać spadają dość sporo fps'y.

Czy to znaczy, że fps'y spadają w momencie wykrycia kolizji, czy "rozmnażanie robaków" to jakaś faza programu, gdy kolizje w ogóle brane sa pod uwagę? Jeżeli to pierwsze, to może winna jest tutaj jakaś funkcja (może StopAnimation?), w której przeprowadzasz jakieś operacje graficzne i od razu odświeżasz obraz? Może któraś z funkcji wywoływanych w przypadku kolizji jest jakoś szczególnie czasożerna?

0

Jeżeli masz procesor wielordzeniowy to pomoże ci OpenMP. Bardzo przyjemny w zastosowaniu i nie psuje napisanego dotychczas kodu. Możesz dowolnie podzielić przeszukiwanie ekranu (np.: lewa strona pierwszy rdzeń, prawa strona drugi rdzeń), lub zoptymalizować pętlę for. Wtedy przebieg pętli będzie prowadzony na dwóch rdzeniach (lub więcej jeżeli posiadasz) a na końcu obliczeń wszystko się zsynchronizuje i wynik jak tralala.

1 użytkowników online, w tym zalogowanych: 0, gości: 1