Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CharlesDarwin

Frischling

  • »CharlesDarwin« ist der Autor dieses Themas

Beiträge: 25

Beruf: Visionär

  • Private Nachricht senden

21

24.02.2012, 16:00

Zitat

Den Wertebereich deiner 2. Schleife habe ich schon mit eingerechnet.
Achso.

Zitat

Vector2.Distance berechnet sicherlich die Vektorlänge mit Wurzelziehen, nicht?

Sicher gibt es auch eine Funktion, die die Wurzel nicht zieht und dir
die quadrierte Länge liefert. Dann nimmst du die und vergleichst nicht
mit 9.6, sondern mit 9.6² = 92.16.

Das dürfte dir ein bisschen mehr Leistung geben.
DistanceSquared
Das habe ich Probiert. Ich muss dann auch die Lineare Reduzierung der (geschätzten)Distanz verändern oder entfernen. Zeile 11 im Sourcecode oben. So kann ich komplett auf die Wurzel verzichten und nur DistanceSquared verwenden.

EineModifikation von Zeile 11 auf: Z_Distanz[n1, n2]=Z_Distanz[n1, n2]*0.96 funktioniert, entfernen (samt der dazügehörigen If Schleife Zeile: 12) funktioniert auch. Die FPS sind in beiden fällen jedoch 10%-20% geringer.

Ab wievielen Partikeln macht eine Rasterung Sinn? Hat jemand da Erfahrungswerte? Das Prinzip ist mir zwar klar, aber ich glaube das kostet mich mindestens 1-2 Tage.
Und wenn es dann womöglich erst bei 10.000 Zellen was bringt ist es nicht sinnvoll. Kennt ihr da ein Tutorial oder Vorlagen?

Wenn die Zellen ihre Grundfunktionen haben zeige ich Bilder.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

24.02.2012, 16:06


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
            for (n1 = 0; n1 < MaxZellenGesamt; n1++)
            {
                if (Z_Typ[n1] >-1)//Zellen mit dem Typ -1 sind deaktiviert
                {
                    AnzZellen++;//Zellen Zählen
                    Update_ZellEngine_ZellAktivität(n1);//Zellaktivitäten
                    for (n2 = n1; n2 < MaxZellenGesamt; n2++)
                    {
                        if (Z_Typ[n2] >-1)
                        {
                            Z_Distanz[n1, n2]--;//Lineare Distanzoperation zur Einsparung von Rechenleistung
                            if (Z_Distanz[n1, n2] < 14)//(Die Größe aller Zellen ist 8)
                            {
                                Z_Distanz[n1, n2] = Vector2.Distance(Z_Position[n1], Z_Position[n2]);
                                if (Z_Distanz[n1, n2] < (float)9.6)
                                {
                                    //Zellkontakt
                                    Update_ZellEngine_Physik(n1, n2);//Hier dann der Pythagoras sowie der Austausch von Nahrung und Baumaterial
                                    if (Z_Schlafen[n1] == 1)//Zellen sind nur alle 10 Frames aktiv beim Zellkontakt.
                                    {
                                        Update_ZellEngine_Zellkontakt(n1, n2);
                                        Update_ZellEngine_Zellkontakt(n2, n1);
                                    };
                                };
                            };
                        };
                    };
                };
            };


Ich war mal so frei:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
for (n1 = 0; n1 < MaxZellenGesamt; n1++)
{
    if (Z_Typ[n1] <= -1) //Zellen mit dem Typ -1 sind deaktiviert
        continue;

    AnzZellen++;
    Update_ZellEngine_ZellAktivität(n1); //Zellaktivitäten
    for (n2 = n1; n2 < MaxZellenGesamt; n2++)
    {
        if (Z_Typ[n2] <= -1)
            continue;

        Z_Distanz[n1, n2]--; //Lineare Distanzoperation zur Einsparung von Rechenleistung
        if (Z_Distanz[n1, n2] >= 14) //(Die Größe aller Zellen ist 8)
            continue;

        Z_Distanz[n1, n2] = Vector2.Distance(Z_Position[n1], Z_Position[n2]);
        if (Z_Distanz[n1, n2] >= (float) 9.6)
            continue;

        //Zellkontakt
        Update_ZellEngine_Physik(n1, n2); //Hier dann der Pythagoras sowie der Austausch von Nahrung und Baumaterial
        if (Z_Schlafen[n1] != 1) //Zellen sind nur alle 10 Frames aktiv beim Zellkontakt.
            continue;

        Update_ZellEngine_Zellkontakt(n1, n2);
        Update_ZellEngine_Zellkontakt(n2, n1);
    }
}


PS: Hinter "}" gehört eigentlich kein ";".
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

CharlesDarwin

Frischling

  • »CharlesDarwin« ist der Autor dieses Themas

Beiträge: 25

Beruf: Visionär

  • Private Nachricht senden

23

24.02.2012, 16:21

Dein Vorschlag funktioniert auf Anhieb. Es ist ein bisschen schneller. Vielleicht 5%. Werde es also jetzt so machen. :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

24.02.2012, 16:30

Ich habe eigentlich gar keinen Vorschlag zur Performance gemacht, lediglich zur Lesbarkeit.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

CharlesDarwin

Frischling

  • »CharlesDarwin« ist der Autor dieses Themas

Beiträge: 25

Beruf: Visionär

  • Private Nachricht senden

25

24.02.2012, 19:18

Achso. Ich hatte den Eindruck statt 20 ms nur 19 ms pro Frame zu brauchen bei 1000 Zellen. Lesbarer ist es allemal. C# ist Neuland für mich.

Die Wesentlichen Funktionen stehen jetzt. Bei der Zuordnung des richtigen Index zu den Gensätzen ist Chaos. Ich habe den Code etwas nachlässig geschrieben. Jetzt muss ich wieder alles auseinanderpulen.

So einigermaßen wackelig läuft es jetzt alles. Hier:


A sind die Räuber. Die Killerzellen sind Gelb und stachelig. Die Räuber bewegen sich.
B sind Sporen. sie enthalten Erbmaterial und "keimen" an einem ruhigen Ort.
C sind die Beute. Sie bewegen sich zumindest in dieser Simulation nicht.

Jede Zelle hat einen Energie und einen Baustoffwechsel und tauscht sich mit nebenliegenden Zellen des selben Genträgers aus.

Verletzte Genträger sterben oft. Verletzte Räuber trudeln oder bleiben stehen. Je nach Verletzung.
Wenn sie vorher gut gefressen haben produzueren sie aber noch einige Zeit viele Sporen.

Leider stürzt alles nach einigen Minuten zusammen. Jetzt heißt es also erstmal debuggen.

LG


EDIT: Gibt es eine automatische Zoomfunktion oder müsste ich alles einzeln Umrechnen?

idontknow

unregistriert

26

24.02.2012, 20:06

Ich hab irgendwie den Eindruck, dass man bei dem Gewussel nich mehr soviel erkennen kann :P. Bin aber auch ein Laie ohne Ahnung^^

CharlesDarwin

Frischling

  • »CharlesDarwin« ist der Autor dieses Themas

Beiträge: 25

Beruf: Visionär

  • Private Nachricht senden

27

24.02.2012, 21:22

Dies ist ein mit Paint.Net Vergrößerter Screenshot. Gibt es eine automatische Zoomfunktion?


Es ist ein Räuber gekennzeichnet. Das gelbe gezackte ist eine Killerzelle, Die Schwarzen sind Panzerzellen. Weiße und Grüne Zellen hat der Jäger wenig. Nährstoffe und Baumaterial produziert die Killerzelle nach dem Fressen von Fremdzellen. Die Rote Zelle hinten am Räuber ist der Antrieb.

Die Beute hat mehr Grüne und Weiße Zellen und Produziert hier die Baumaterialien und Energie.


Das Leuchten um die Zellen herum zeigt das Energielevel. Das Leuchten im Inneren das Baustofflevel.

Hat jemand C# und XNA und Zeit mal den Quellcode mit den Augen eines Informatikers zu begutachten? Dann würde ich nochmal mehr Kommentare in den Code machen und das Projekt hochladen.

CharlesDarwin

Frischling

  • »CharlesDarwin« ist der Autor dieses Themas

Beiträge: 25

Beruf: Visionär

  • Private Nachricht senden

28

25.02.2012, 12:23

Hier gibt es das komplette Projekt als Download:

http://www.mediafire.com/?6ddy7az2n2rn2rw

Diese Version läuft ganz gut. Habe alles noch vereinfacht.
(mit F1 und F2 verändert man die Mutationsrate)

Das mit der Rasterung geht mir nicht aus dem Kopf. Ich versuch das. Ist das sehr schwierig? Hat das schonmal jemand hier gemacht? Würde das zu gerne mal sehen.

Was haltet ihr von einer beweglichen Kamera + Zoom? Wenn es da keine Funktion gibt mache ich das halt Schritt für Schritt selbst. Das ist ja nicht so schwer wie das Rastern nehme ich an.

LG

idontknow

unregistriert

29

25.02.2012, 12:49

Meinst du mit der Rasterung das aufteilen der Objekte in einen Grid um dann nur die Zellen zu berechnen? Das is nich schwer.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

30

25.02.2012, 12:50

Das mit der Rasterung geht mir nicht aus dem Kopf. Ich versuch das. Ist das sehr schwierig?

Wenn ich richtig verstanden hab was du vor hast ists nicht schwer. Du erstellst dir ein 2d Array aus Listen mit deinen Zellen. Je nach Pixelposition der Zelle sortierst du sie ins das 2d Array. Bewegt sich die Zelle im Laufe der Simulation auf ein anderes Feld musst du sie verschieben. Das kannst du dir wie ein Schachbrett vorstellen. Wenn du nun auf Interaktion testest, berechnest du in welchen Feldern sich die Zelle befindet(es kann ja sein, dass sie auf einer Ecke, also auf bis zu 4 Feldern gleichzeitig steht) und prüfst nur alle Zellen die sich auf den Feldern befinden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige