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

11

07.09.2009, 09:14

@flyweight-pattern: Es geht darum Speicher zu sparen. Du willst ja tausende von Asteroiden. Also machst du eine Klasse, bei der alle gemeinsame Informationen fest sind und nur veränderliche Informationen variabel sind.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
class Astroid
{
private:
   float x,y,z;              // Positionsangaben unterscheiden sich pro Objekt

   static [DATATYPE] object; // Referenz auf das Bild oder das Modell des Asterodiden. Da statisch, belegt es nur 1 mal speicher

}

In diesem Beispiel brauchst du pro Objekt nur Speicher für die Position. Das Modell oder die Textur des Asteroiden hast du jedoch nur 1 mal im Speicher. Selbst wenn du mit Zeigern arbeitest würdest du 4 Byte pro Zeiger verbrauchen, nötig ist für alle Asteroiden nur 1 Zeiger => Speichergewinn.


@Spiel: Anlegen kannst du mit dieser Technik relativ viele Asteroiden. Auf deinem Server machst du es einfach so, das du dein Spielgebiet in Quadranten einteilst und die Asteroiden diesen zuteilst. Dann bewegst du einfach die Asteroiden in den Quadranten des Spielers (und den direkt angrenzenden) ganz normal. Die weiter entfernten bewegst du einfach nciht so oft und ungenauer oder gar nicht.

Die Spielwelt offen zu lassen halte ich für überflüssig. Ältere Spiele lösen dass so, dass du beim verlassen der einen Seite auf der gegenüberliegenden Seite wieder das Spielfeld betrittst. Wenn du die Quadranten deines Spielfeldes jetzt so behandelst als würde sie wirklich angrenzen, bekommen die Spieler das nocht nicht einmal richtig mit.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

12

07.09.2009, 13:28

boaahhh danke, habs verstanden...
ich benutze ja die Tribase Engine und da gibts eine tbOject Klasse die ich meine asteroiden erben lasse, da steht dann rotation und position und velocity fest kann ich irgendwie dieses velocity static machen, ohne dass ich die tbObject Klasse verändern muss?
weil ich denke die verbraucht viel speicher...
oder geht das nicht?
New Project: Operation CityRacer

13

07.09.2009, 13:49

Würde ich gar nicht machen, da die Umgebung besser wirkt, wenn die Asterodiden sich mit unterschiedlicher Geschwindigkeit bewegen.

Wenn tbOject das Modell beinhaltet solltest du das besser als statische Variable benutzen und eine eigene Basisklasse schreiben.Damit sparst du am meisten Speicher.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

14

07.09.2009, 15:12

also das model vom asteroid is in einem AsteroidType Struct aufbewahrt, da steht dann halt noch movementfriction und rotationfriction und die Masse drin, die könnt ich ja dann auch static machen oder?
New Project: Operation CityRacer

15

07.09.2009, 15:17

ja genau

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

16

07.09.2009, 15:26

okay thx...aber was mach ich wenn ich mehrere Asteroiden Modelle habe...
static tbModel* pModel[8] so vllt. ?
New Project: Operation CityRacer

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

17

08.09.2009, 16:14

mir is aufgefallen dass ich dann gar nicht mehr view frustum benutzen kann da dann alle asteroiden nich gerendert werden wenn ich einen nicht sehe...oder hab ich was falsch gemacht?
New Project: Operation CityRacer

18

08.09.2009, 16:21

Mir fällt kein Grund ein, warum view frustum nicht mehr gehen sollte.

Bei vielen Modellen wäre es dann aber eigentlich sinnvoller das Modell einmal über eine verwaltende Klasse zu laden und den Zeiger darauf in deiner Astroid Klasse zu speichern.
Ob man jetzt die indexposition zu einem Array oder einen Zeiger speichert ist je nach Datentyp eigentlich egal ( bei short wäre der Index kleiner ).

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

19

08.09.2009, 17:03

ich versteh nich, dass manchmal einfach alle asteroiden nich mehr gerendert werden:


die Render Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tbResult Game::RenderAsteroid(float fTime)
{
    for(int p = 0; p < 400; p++)
    {
        if(m_aAsteroid[p].m_bExists)
        {
            if(m_aAsteroid[p].IsVisible())
            {
                m_aAsteroid[p].RenderAsteroid(fTime);
            }
        }
    }
    return TB_OK;
}


die IsVsible() Methode:

C-/C++-Quelltext

1
2
3
4
5
    Update();
    return tbBoxVisible_Inv(m_pType->pModel[0]->GetBoundingBoxMin(),
                            m_pType->pModel[0]->GetBoundingBoxMax(),
                            m_mInvMatrix,
                            m_pGame->m_aViewFrustum);


wie ich des view frustum berechne:

C-/C++-Quelltext

1
2
3
4
5
    mCamera = tbMatrixCamera(m_vCameraPos,m_vCameraLookAt,m_vCameraUp);
    tbDirect3D::Instance().SetTransform(D3DTS_VIEW, mCamera);
    mProjection = tbMatrixProjection(m_fFOV,tbDirect3D::Instance().GetAspect(),5.0f,5000.0f);
    tbDirect3D::Instance().SetTransform(D3DTS_PROJECTION, mProjection);
    tbComputeClipPlanes(mCamera, mProjection, m_aViewFrustum);


manchmal sieht man alle dann dreh ich mich ganz leich nach rechts oder links und dann verschwinden ein paar....obwohl sie sich noch im Sichtfeld befinden
New Project: Operation CityRacer

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

20

08.09.2009, 18:00

Auf die schnelle fällt mir nur ein, dass die Boundingbox nicht stimmt, oder dass die Matrizen nicht aktualisiert werden. Kannst du beides ausschließen?
So wie du es beschreibst ist es, als wären die BoundingBoxen zu klein - zum testen setz einfach mal mit eigenen Vektoren eine große rein.

Werbeanzeige