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

LagRange

Frischling

Beiträge: 26

Wohnort: dzt. Aalborg, DK

Beruf: Student

  • Private Nachricht senden

21

30.06.2007, 17:28

Zitat von »"Eldarion72"«

edit: hat man dann nicht das problem das sich evlt schon koordinaten verschieben während des renderns? weil das müsste dann ja in 2 threads ablaufen.

Man rendert den Zustand vom letzten Update. Wenn sich während des Renderns beim Update was ändert sieht mans erst im nächsten Renderframe.

Mir gefällt die Methode recht gut. Hab bisher immer zuerst das Update gemacht und danach rendern + anzeigen, was ja nicht so günstig zu sein scheint weil dann die gesamte Hauptschleife auf die Grafik warten muss...
Science is common sense applied to evidence.

22

30.06.2007, 18:55

@david: dann brauchst du aber 2 spielzustände. stell dir mal folgendes vor (1 Zustand) :

Du hast 2 Threads die parallel laufen. Der Eine ist der Update Thread und der Andere der Grafik Thread.

Im Update Thread finden 2 Bewegungen statt. Von mir aus Objekt1 und Objekt2.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PseudoCode:

Update()
{
      BewegeObjekt1 um 5 nach Rechts;
      //Punkt 1
      BewegeObjekt2 um 10 nach Links;
}

Render()
{
      RenderObjekt1;
      RenderObjekt2;
}


ich weiß das ist eig. hardcode und damit mist^^ also das soll jetzt nur ein sehr einfaches beispiel werden.

so, aber was ist wenn er jetzt an Punkt 1 den Updatethread pausiert, den Grafikthread komplett durchfürht und dann wieder zum Updatethread springt?
dann gibt es doch verschiebungen. oder hab ich da was falsch verstanden? also für deine methode bräuchte man mmn 2 spielzustände.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

23

30.06.2007, 18:59

Nein, ich habe keine 2 Threads und brauche auch keinen alten Zustand zu speichern.
Beim Rendern schicke ich alle "Aufträge" an die Grafikkarte. Nachdem die Aufträge losgeschickt sind, mache ich das Update. An diesen Aufträgen kann sich im Nachhinein nichts mehr ändern.
Die Grafikkarte kennt keine Spielobjekte, sondern nur Dreiecke. Ob die Objekte, für die die Dreiecke gezeichnet wurden, sich jetzt weiterbewegen, während die Karte die Dreiecke rendert, ist ihr ganz egal.

Vergleichbar mit folgender Situation:
Du machst ein Foto von deinem Zimmer (mit einer normalen Kamera). Du gibst den Film zum Entwickeln. Währenddessen streichst du dein Zimmer neu an. Wirst du auf dem Foto das neu angestrichene Zimmer sehen? ;)

24

30.06.2007, 19:04

ah sry, ich hatte dich falsch verstanden. ich hätte gedacht das Rendern würde die ganze funktion lang dauern. (weiß einer wie das bei ogre gelöst ist? bzw. benutzt hier überhaupt jemand ogre?)
dann ist klar das das besser funktioniert. thx für die anregung. :)

so, noch ein edit, da ich grade ne kleine diskussion hierrüber führe, und einfach nochmal sichergehen will.

David, du machst doch folgendes pro frame:

Daten an die Graka Schicken
Updaten bis wieder Zeit für Rendern ist - Graka Rendert
Wenn Die graka fertig mit rendern ist Bild auf den Bildschirm packen

richtig? also du schickst nur die daten an die graka, updatest wärend die graka rendert und fängst nicht erst mit updaten an wenn die graka fertig gerendert hat, oder?

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

25

30.06.2007, 22:21

ich benutze ogre. ob/wie man davids lösung da implementieren könnte würde mich auch interessieren.

26

03.07.2007, 11:38

@rewb0rn: ich hab mal mit nen paar leuten im ogre chan gesprochen, hatte leider auch keiner ne idee^^.

@all: ich hab nochmal eine design frage:

Ich habe eine Menschklasse.Natürlich soll es mehrer Menschen geben. So, jedes monster braucht jetzt ein Physikbody von meiner Physikklasse. Da ich das Physikhauptobjekt nicht durchs ganze programm reichen will, hab ich eine Methode geschrieben, das meine Physikklasse einen Body returnt. Aber: wie krieg ich jetzt den pointer auf den body am klügsten in meine instanz von meinem menschen?
folgende ideen hatte ich:

1. Ich gebe dem Menschen einen Pointer auf das Physikobjekt und er erstellt sich seinen Body selbst --> wiederspricht mmn dem OOP Prinzip.
2. Ich mache die Physikklasse zum Singleton und hole mir die Instanz per aufruf
3. Ich lasse den Body von meinem Weltobjekt erstellen, welches sowieso einen Pointer auf die Physikklasse braucht, und übergebe den pointer per konstruktor an meinen Menschen

Was findet ihr am besten?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

27

03.07.2007, 12:49

Zitat

1. Ich gebe dem Menschen einen Pointer auf das Physikobjekt und er erstellt sich seinen Body selbst --> wiederspricht mmn dem OOP Prinzip.


Also wenn ich dich richtig verstehe, dann sehe ich da keinen Widerspruch. Warum sollte man nicht die Verwaltungsklasse an den Konstruktor übergeben können, damit dieser seinen Body selbst erstellt?

Aber eine ganz andere Frage: Ist es möglich, dass deine Menschklasse von der PhysikBody-Klasse erbt?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

28

03.07.2007, 13:16

das mit dem erben ist nicht möglich, das die physikbody klasse sehr abstrakt gehalten ist und eig. nru eine geometrische form repräsentiert. außerdem ist die nicht von mir selbst geschrieben sondern ich benutze OgreNewt mit Newton.

bei 1. sehe ich nur den Wiederspruch, wenn cih ersmal 20 Menschen erzeuge, warum sollte jeder mensch einen pointer auf das Physik objekt kriegen? oder meint du das eher so:

C-/C++-Quelltext

1
2
3
4
5
Mensch(Graphic* mGraphic, Physic* mPhysic)
{
     Objekt = Graphic->erstelleObjekt(mesh);
     Body = Physic->erstelleBody(Objekt);
}


das ist jezt pseudocode. so könnte ich mir das sogar auch noch vorstellen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

29

03.07.2007, 14:15

Japp. Halt das der Konstruktor die VerwaltungsObjekte übergeben bekommt und sich da selbst registiert. Vermeidet auch Fehler wie mehrfach Registierung(an verschiedenen Stellen) oder eben, dass man es komplett vergisst.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

30

03.07.2007, 14:41

ok, danke. dann bau ich mal etwas um :)

Werbeanzeige