Speicher sparen in großen 3D-Landschaften

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicher sparen in großen 3D-Landschaften

    Ich entwickle zurzeit ein 3d Shooter mir relativ goßen levels und vielen details.
    Nur zerrt das natürlich sehr an der Performance und ich brauche einen Code der alles was ausserhalb der Sicht ist verschwinden lässt damit es besser läuft. :vogel:
    (Diese Frage wurde wahrscheinlich schon öfter gestellt aber ich finde so etwas nicht)



    Schonmal danke!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Moolt ()

  • RE: Einfache Frage

    Im 3D Bereich ist das mit der Performance immer so eine Sache: Umso mehr Polygone du in einzelne Modelle oder sogar nur in ein einiges verpackst umso besser läuft das Spiel. Ich hatte mir da schonmal zu testzwecken ein example gemacht um zu testen wie viele polygone mein rechner mit einem einzigen 3d modell schaffen würde. Bei 4000 Polygonen und 60fps hab ich aufgehört zu testen, ich hätte noch locker bis 6000 oder mehr weiter machen können.

    Da du wie du sagst, sehr große Level hast würde ich dir aber nicht empfehlen alle Polygone in ein Modell zupacken, sondern nach folgender Methode. Stell dir vor du betrachtest dien Level von oben, also topdown Ansicht. Dann teilst du das komplette Level in ein Gitter von gleichgroßen Quadraten ein. Die Größe dieser Zellen kannst du selber je nach gewünschter Sichtweite wählen. Und jetzt packst du alle Polygone innerhalb einer solchen Zelle in genau ein Modell. Die ID dieser Modelle solltest du dann in der Datenstrucktur Grid ablegen. Wenn sich deine Figur dann durch ein Level bewegt zeichnest du nur das Modell der Zelle in der du dich befindest und noch genau die 8 weiteren um dieser drumrum. Der große Vorteil an diesem System, die Modelle in einem Grid festzuhalten, liegt darin, dass du nicht in jedem Step komplett alle durchgehen musst und prüfen musst ob sie in Reichweite liegen. Dadurch kannst du theoretisch unendlichgroße Level gestalten, ohne einen Performanceinbruch.
  • Ich benutze noch nichteinmal models (die mach ich noch) sondern benutze lediglich die standart sachen vom gamemaker (block usw.). Dein prinzip hab ich wohl verstanden aber das kann ich schwer umsetzen. Wäre da ein Code der alles außerhalb den Views verschwinden lässt nicht einfacher? :ops:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Moolt ()

  • Mhh... hängt davon ab wie du alles zeichnen lässt. Wenn du den kompletten Code zum Zeichnen in einem Objekt im Draw-Event hast, kannst du das schonmal vergessen. Wenn dann musst du schon den code auf viele instancen aufteilen, damit du die dann mit den entsprechenden Funktionen (de)aktivieren kannst.
    Wenn du GML-Fortgeschritten bist, dürfte die Umsetzung dieser Idee ja kein Problem darstellen. Sollte es einzelne Probleme geben, kannst du ja nachfragen. ;)
  • wenn du das einfacher haben willst kannst du das auch mit dem befehl

    GML-Quellcode

    1. distance_to_object(obj_camera)

    machen. Damit kannst du feststellen, wie weit die objecte von der Kamera weg sind. obj_camera musst du natürlich noch ersetzen.
    So eine Abfrage kannst du z.b. in den Step event der objecte (besser in ein Parent dieser objecte) einbauen.

    wenn du schon zu viele objecte gemacht hast und auch keine parents verwendet hast, kannst du den job auch von der Kamera selber erledigen lassen:
    Step-Event der Kamera

    GML-Quellcode

    1. with (obj_ParentAmbiente)
    2. {
    3. if distance_to_object(obj_Camera)<=lod {visible=true;}
    4. else {visible=false;}
    5. }


    obj_ParentAmbiente - ersetzen durch den namen der objecte bzw überornetes object/ bzw all (dann aber an den code noch ein visible=true; anhängen)
    obj_Camera - ersetzen durch den namen den du für die kamera gewählt hast.
    lod - (level of detail) im create event mit ca. 400 definieren oder durch eine zahl ersetzen.

    Diese methode wird normalerweise mit fog kombiniert. Einem, in der Entfernung immer dichter wedender Nebel. Wie das funzt kannst du in der Hilfe nachsehen.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • @Melancor

    Das ist in etwa das Prinzip was ich beschrieben hab, schön dass du den Fachbegriff bringst, wusst ich selber noch nicht zu benennen. Wäre mal interessant so eine engine im GM umzusetzen und als Erweiterung rauszubringen. Vor allem das Teilen von Polygonen dürfte interessant werden, wenn es mehrere Zellen überlappt. So ein System könnte eigentlich für sehr viele 3D-Spiele sehr nützlich sein.
  • ich hab das mal ausprobiert mit dem distance_to_object und den visibles.
    funktioniert soweit, aber was is wenn ich 2 views habe?
    wenn ich die objekte in view1 visible=0 mache sind die in view2 auch auf 0.
    gibts irgendwie ne allternative dass die visibles nur auf bestimmte views funktionieren?

    also z.b.:

    GML-Quellcode

    1. if view_current=0 {
    2. if distance_to_object(object)<200
    3. visible=1
    4. else
    5. visible=0
    6. }

    so hab ich das momentan aber das funzt nich

    "Make love, not Warcraft"
  • Wie wärs wenn du das "if view_current=0" weglässt?
    Ja, das ist jetzt sau bescheuert, aber was genau möchtest du machen?
    Wenn es 2 verschiedene Objekte sind, von denen du den Abstand messen willst:

    GML-Quellcode

    1. if distance_to_object(object1)<200 && distance_to_object(object2)<200 {
    2. visible=1
    3. else
    4. visible=0
    5. }

    PS: Es kann sein, dass ich dich nicht verstanden habe, aber ich möchte nicht ohne einen Code antworten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von copyboy ()

  • Original von copyboy
    Wie wärs wenn du das "if view_current=0" weglässt?
    Ja, das ist jetzt sau bescheuert, aber was genau möchtest du machen?
    Wenn es 2 verschiedene Objekte sind, von denen du den Abstand messen willst:

    GML-Quellcode

    1. if distance_to_object(object1)<200 && distance_to_object(object2)<200 {
    2. visible=1
    3. else
    4. visible=0
    5. }

    PS: Es kann sein, dass ich dich nicht verstanden habe, aber ich möchte nicht ohne einen Code antworten.


    @Copyboy: Ich würd an deiner Stelle keine langen if Abfragen machen. Das wird dann schnell unübersichtlich und zieht nachsehr vielen Objekten ziemlich an der Leistung.
    ~~> Parents benutzen:

    GML-Quellcode

    1. if distance_to_object(obj_gegner_parent)<200
    2. {
    3. visible=1
    4. }
    5. else
    6. {
    7. visible=0
    8. }


    Nur sone Frage: Warum benutzt du keine Deaktivierungsfunktion?
  • also mein spiel läuft mit splitscreen, ich brauche nur den idealen code um "OutOfRange"-objekte zu deaktivieren, "nicht zu zeichnen", oder sonstiges.
    deswegen brauche ich ja auch die views, nur wenn ich in view 1 objekte außerhalb des bildes deaktiviere oder visible auf 0 schalte dann gilt das unglücklicherweise auch für view 2

    "Make love, not Warcraft"
  • Benutzer online 1

    1 Besucher