kiep schmeiling
Cadet 4th Year
- Registriert
- Jan. 2009
- Beiträge
- 64
Hi,
der Titel kling ziemlich komisch, aber mein Problem ist sehr schwierig auszudrücken, daher bin ich auch mit Google nicht wirklich weitergekommen...
Ich will ein einfaches Spiel Programmieren, ein bisschen ähnlich wie Billard nur mit beliebig vielen kugeln und einem Schläger, den man von diesen "Air-Hockey" Tischen kennt.
Mein großes Problem ist jedoch die Performance, da das Programm so ab ca. Hundert Bällen anfängt zu ruckeln, später wahrscheinlich noch füher, da die Kollisionsabfrage zweier Bälle noch ein wenig genauer (öfter ausgeführt) sein muss.
Ich versuche meine Kollisionsüberprüfungsfunktion (die eine Elementfunktion der Ball-Klasse ist) so gut wie möglich zu optimieren, und habe jetzt gelesen, dass es schneller ist wenn ich sie Inline Definiere, allerdings greift sie auf elemente eines Vectors zu, die erst einige Zeilen weiter im Code Definiert wird, selbst aber hinter der Ball-Klasse stehen muss, weil er wiederum auf sie zugreift (weil er ja aus objekten dieser klasse besteht).
Den ganzen Code kann ich hier unmöglich posten, ich hab glaube ich schon über 500 Zeilen, deshalb grob schematisiert bzw. auszugsweise:
Ich muss die Klasse vor die Deklaration des Vectors schreiben, sonst spuckt der Compiler einen Fehler aus, benötige ihn aber bereits in der Klasse, da ich auf seine Elemente zugreife. Wie gesagt, bisher hatte ich das Problem gelöst, indem ich die Funktion Outline definiert habe...(Der Vector ist auserhalb der main() funktion deklariert, damit er wirklich global ist...)
Wenn also jemand eine Idee hat wie ich das löse (oder meine chkkol() funktion optimieren kann, denn die wird, bei 100 Bällen, 1000 mal pro Frame aufgerufen) wäre ich sehr dankbar...
der Titel kling ziemlich komisch, aber mein Problem ist sehr schwierig auszudrücken, daher bin ich auch mit Google nicht wirklich weitergekommen...
Ich will ein einfaches Spiel Programmieren, ein bisschen ähnlich wie Billard nur mit beliebig vielen kugeln und einem Schläger, den man von diesen "Air-Hockey" Tischen kennt.
Mein großes Problem ist jedoch die Performance, da das Programm so ab ca. Hundert Bällen anfängt zu ruckeln, später wahrscheinlich noch füher, da die Kollisionsabfrage zweier Bälle noch ein wenig genauer (öfter ausgeführt) sein muss.
Ich versuche meine Kollisionsüberprüfungsfunktion (die eine Elementfunktion der Ball-Klasse ist) so gut wie möglich zu optimieren, und habe jetzt gelesen, dass es schneller ist wenn ich sie Inline Definiere, allerdings greift sie auf elemente eines Vectors zu, die erst einige Zeilen weiter im Code Definiert wird, selbst aber hinter der Ball-Klasse stehen muss, weil er wiederum auf sie zugreift (weil er ja aus objekten dieser klasse besteht).
Den ganzen Code kann ich hier unmöglich posten, ich hab glaube ich schon über 500 Zeilen, deshalb grob schematisiert bzw. auszugsweise:
Code:
class ball
{
void chkkol()
{
int xdst,ydst; //variablen fuer x und yentfernung und absolute entfernun hoch 2
double dst2;
for (int i = 0; i<balls.size(); i++) //alle baelle der rehe nach durchgehen
{
xdst=(xpos-balls[i].xpos); //die x entfernung ist die eigene xposition-die xposition des anderen balls
ydst=(ypos-balls[i].ypos);
if (xdst && ydst) //nicht auf kollision mit sich sellbst ueberpruefen (wenn x und ydst null sind muss es die eigene kugel sein, null nimmt er automatisch als false
{
if(xdst<r+balls[i].r && ydst<r+balls[i].r) //hier wird erst mal ein qudrat um den ball gezogen, dass geht wesentlich schneller, da muss er nicht so viel rechnen, denn in 99,9% aller faele liegt keine kollision vor
{
dst2=(xdst*xdst)+(ydst*ydst);
if(sqrt(dst2)<r+balls[i].r) //wenn der abstand (satz des phytagoras)der beiden kreismittelpunkte kleiner ist als die beisen radien zusammen...
{xspeed=0;yspeed=0;} //bleibe stehen (nur vorlaeufig)
}
}
}
return;
}
};
std::vector<ball> balls;
class schlaeger
{
//benutzt in elementfunktionen (nicht im Konstruktor) Objekte aus "balls"
};
Ich muss die Klasse vor die Deklaration des Vectors schreiben, sonst spuckt der Compiler einen Fehler aus, benötige ihn aber bereits in der Klasse, da ich auf seine Elemente zugreife. Wie gesagt, bisher hatte ich das Problem gelöst, indem ich die Funktion Outline definiert habe...(Der Vector ist auserhalb der main() funktion deklariert, damit er wirklich global ist...)
Wenn also jemand eine Idee hat wie ich das löse (oder meine chkkol() funktion optimieren kann, denn die wird, bei 100 Bällen, 1000 mal pro Frame aufgerufen) wäre ich sehr dankbar...