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

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

1

05.01.2007, 00:18

Engine-Design

Ich habe vor etwa 1.5 Jahren mit meiner eigenen Engine angefangen und die ist nun auch schon seit langer Zeit fertig. Nur ist die leider sehr schnell an ihre Grenzen gestossen, da ich einfach ohne Plan drauflosgecodet habe. Ausserdem habe ich meine Programmierkünste in der Zeit auch einiges weiterentwickelt und jetzt sieht mein Codingstil in der Engine für mich auch sehr lächerlich aus.

Deshalb möchte ich nun noch mal ganz von vorne anfangen und zuerst ausführlich planen. Allerdings habe ich sowas noch nie gemacht und ich kenne mich auch nicht wirklich mit Design Patterns aus. Ich habe mir aber den Aufbau von ein paar OpenSource-Engines angeschaut...

Ich habe aber mal versucht eine kleine Beschreibung zu machen, wie das nachher ausschauen soll (also vorallem die Klassenhierarchien). Es ist noch nicht vollständig aber so wie ich das sehe ist es leicht erweiterbar.

Zum Design-Dokument (PDF)

Ich wäre nun sehr froh darüber wenn mir ein paar erfahrenere Leute die schon grosse Projekte bewältigt haben ein kleines Feedback geben könnte was ich falsch mache oder ob ich gar alles falsch mache, dann sollte ich mir wohl besser zuerst ein paar Bücher kaufen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

2

05.01.2007, 00:48

Der Name "Object" ist schlecht, das könnte z.B. auch die Basisklasse aller anderen Objekte sein. Ich habe schon "renderable" gehört, das ist ein sprechender Name.

"Core" gefällt mir auch nicht wirklich, warum ist ein Vector in "core" und warum nimmst Du nicht den von D3D(X) ?

Was macht "Userdefined" was 3DObject nicht macht?

Lightning soll wohl Lighting heissen.

Ich persönlich sehe GUI neben Grafik, nicht darunter. Es braucht aber natürlich Grafik.

Image würde ich in Grafik packen und Media wäre dann Sound.
"Games are algorithmic entertainment."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

05.01.2007, 01:51

Zitat


"Core" gefällt mir auch nicht wirklich, warum ist ein Vector in "core" und warum nimmst Du nicht den von D3D(X) ?


Warum nicht? Der Mathematische Teil kann zwar allein stehen, ist aber durchaus ein Teil des Kerns einer Grafikengine. Und es macht durchaus auch Sinn eigene Klassen für Vektoren (...) zu entwickeln. Gerade wenn man als GrafikAPI nicht nur DX verwenden will.

Ich würde allerdings den ganzen Matheblock in einen eigenen Namespace (von mir aus auch unter Core) packen.

Warum du allerdings ein Singleton für dein Logfile Objekt verwenden willst ist mir nicht ganz klar. Es kann durchaus mehrere Logdateien geben, daher macht die verwendung des Singletons hier keinen Sinn.

Memory als Klasse mit statischen Funktionen? Ich weiß nicht genau was du da reinpacken willst, aber statisch würd ich sowas nicht unbedingt machen. Bzw, sags mir wenn ich dich hier falsch verstehe.

Ganz nett ist die Dokumentation der NeoEngine2, die du dir evtl mal ansehen solltest: http://www.realityrift.com/technology/neoengine/api/namespaces.html
Hier kannst du bestimmt auch einige Ideen entleihen.

Achja, wieso verwendest du nicht STL Kontainer statt eigener Kontainerklassen? Du kannst mir glauben das du dir viel Arbeit und Ärger ersparst wenn du das tust!

grüße
@D13_Dreinig

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

4

05.01.2007, 09:13

Zitat von »"Osram"«

Der Name "Object" ist schlecht, das könnte z.B. auch die Basisklasse aller anderen Objekte sein. Ich habe schon "renderable" gehört, das ist ein sprechender Name.

Gute Idee, danke!

Zitat von »"Osram"«

"Core" gefällt mir auch nicht wirklich, warum ist ein Vector in "core" und warum nimmst Du nicht den von D3D(X) ?

Wenn ichs mir recht überlege wäre "Math" wohl besser geeignet. Den einzigen Vektor den ich aus DirectX kenne ist D3DVECTOR und das ist eine Struktur (also hat auch keine definierten Operatoren => Zum rechnen unbrauchbar). D3DX will ich nicht verwenden.

Zitat von »"Osram"«

Was macht "Userdefined" was 3DObject nicht macht?

Es stellt Funktionen zum direkten Eingeben der Vertex- und Indexdaten bereit, was ich zum Beispiel in Model eigentlich nicht möchte.

Zitat von »"Osram"«

Lightning soll wohl Lighting heissen.

klar ;)

Zitat von »"Osram"«

Ich persönlich sehe GUI neben Grafik, nicht darunter. Es braucht aber natürlich Grafik.

Eigentlich hast du recht, es verarbeitet ja auch Input (Mausklicks, Texteingabe, ...)

Zitat von »"Osram"«

Image würde ich in Grafik packen und Media wäre dann Sound.

Ich habs eigentlich Media genannt, da ich vielliecht mal Video einbauen will und das könnte man dann auch dort unterbringen, aber Image wäre schon passender in Graphic...

Zitat von »"David_pb"«

Ich würde allerdings den ganzen Matheblock in einen eigenen Namespace (von mir aus auch unter Core) packen.

Wie gesagt werde ich Core wohl ganz in Math umbenennen.

Zitat von »"David_pb"«

Warum du allerdings ein Singleton für dein Logfile Objekt verwenden willst ist mir nicht ganz klar. Es kann durchaus mehrere Logdateien geben, daher macht die verwendung des Singletons hier keinen Sinn.

Ich habe eigentlich nicht vor irgendwann mal mehrere davon zu verwenden, meine Intension ein Singleton daraus zu machen war aber auch das ich dann von überall her einfach auf die Klasse zugreifen kann.

Zitat von »"David_pb"«

Memory als Klasse mit statischen Funktionen? Ich weiß nicht genau was du da reinpacken willst, aber statisch würd ich sowas nicht unbedingt machen. Bzw, sags mir wenn ich dich hier falsch verstehe.

Meine Idee war damit Speicherlecks zu verhindern, indem die Klasse Methoden wie New und Delete bereitstellt, die ich im Release-Modus einfach als Inline-Template durch new und delete ersetze. Im Debug-Mode soll dagegen jede Speicherreservierung registriert und jede Freigabe wieder deregistriert werden. Am Schluss kann man denn genau ausgeben wo es Spiecherlecks gab. Diese Funktionen müssen von überallher aufrufbarsein und da sie auch sehr oft aufgerufen werden müssen, wollte ich es nicht als Singleton implementieren, da ich sonst immer HF::Memory::instance()::New() schreiben muss anstatt HF::Memory::New(). Ich verwende auch nur ungern eine statische Klasse, also wenn jemand eine besser Idee dazu hat: her damit!

Zitat von »"David_pb"«

Ganz nett ist die Dokumentation der NeoEngine2, die du dir evtl mal ansehen solltest:

Danke, mach ich heut Nachmittag dann.

Zitat von »"David_pb"«

Achja, wieso verwendest du nicht STL Kontainer statt eigener Kontainerklassen? Du kannst mir glauben das du dir viel Arbeit und Ärger ersparst wenn du das tust!

Ich habe bis jetzt eigentlich immer meine eigene Listenklasse verwendet da sie einfacher zu handhaben ist und nur das enthält was ich brauche. Im Sinn von sauberem C++-Coding wäre es wohl doch eine gute Idee mehr mit der Standardbibliothek zu arbeiten...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

05.01.2007, 12:02

Zitat von »"big_muff"«


Wie gesagt werde ich Core wohl ganz in Math umbenennen.


Dann stecken deine Kontainer ja auch in Core?

Zitat von »"big_muff"«


Ich habe eigentlich nicht vor irgendwann mal mehrere davon zu verwenden, meine Intension ein Singleton daraus zu machen war aber auch das ich dann von überall her einfach auf die Klasse zugreifen kann.


Der Sinn von Singletons ist es ein Objekt einzigartig zu machen. Logfiles sind das aber nicht, schon das du Logfiles sagen kannst sollte dich darauf aufmerksam machen.
Wenn du korrekte Objektorientierung machen willst musst du auf so feinheiten achten. Lös es lieber über einen Manager oder eine externe Variable.

Zitat von »"big_muff"«


Meine Idee war damit Speicherlecks zu verhindern, indem die Klasse Methoden wie New und Delete bereitstellt, die ich im Release-Modus einfach als Inline-Template durch new und delete ersetze. Im Debug-Mode soll dagegen jede Speicherreservierung registriert und jede Freigabe wieder deregistriert werden. Am Schluss kann man denn genau ausgeben wo es Spiecherlecks gab. Diese Funktionen müssen von überallher aufrufbarsein und da sie auch sehr oft aufgerufen werden müssen, wollte ich es nicht als Singleton implementieren, da ich sonst immer HF::Memory::instance()::New() schreiben muss anstatt HF::Memory::New(). Ich verwende auch nur ungern eine statische Klasse, also wenn jemand eine besser Idee dazu hat: her damit!


Halt ich für weniger geschickt. Hier würde eine Singleton wesentlich mehr Sinn ergeben. Zur not kannst du ja per Makro eine "Umleitung" basteln.

Zitat von »"big_muff"«



Ich habe bis jetzt eigentlich immer meine eigene Listenklasse verwendet da sie einfacher zu handhaben ist und nur das enthält was ich brauche. Im Sinn von sauberem C++-Coding wäre es wohl doch eine gute Idee mehr mit der Standardbibliothek zu arbeiten...


Durchaus!
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

6

05.01.2007, 12:04

Zitat von »"big_muff"«


Zitat von »"David_pb"«

Warum du allerdings ein Singleton für dein Logfile Objekt verwenden willst ist mir nicht ganz klar. Es kann durchaus mehrere Logdateien geben, daher macht die verwendung des Singletons hier keinen Sinn.

Ich habe eigentlich nicht vor irgendwann mal mehrere davon zu verwenden, meine Intension ein Singleton daraus zu machen war aber auch das ich dann von überall her einfach auf die Klasse zugreifen kann.

Blos weil du eine Instanz direkt in die Klasse legst muss es doch nicht gleich eine Singleton sein. Ich würde an deiner Stelle garnicht viel ändern sondern nur den Konstruktor public machen (Copy private lassen). Damit behältst du deine überall verfügbare Instanz, andere die die Engine verwenden können aber auch weitere Logs erstellen.

// man kann das nat. auch anders lösen

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

7

05.01.2007, 13:45

Zitat von »"David_pb"«

Dann stecken deine Kontainer ja auch in Core?

Nein, ich hab die Listenklasse gestrichen und werde std::list verwenden. Dann bleiben nur noch mathematische Dinge und die kann man dann ruhig in den Namespace "Math" packen.

Zitat von »"David_pb"«

Halt ich für weniger geschickt. Hier würde eine Singleton wesentlich mehr Sinn ergeben. Zur not kannst du ja per Makro eine "Umleitung" basteln.

Ich wollte Makros ja nach möglichkeit vermeiden, aber hier scheint es wohl doch die beste Lösung zu sein, danke.

Zitat von »"grek40"«

Ich würde an deiner Stelle garnicht viel ändern sondern nur den Konstruktor public machen (Copy private lassen). Damit behältst du deine überall verfügbare Instanz, andere die die Engine verwenden können aber auch weitere Logs erstellen.

Vielen Dank, klingt nach einer guten Lösung, so werd ichs machen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige