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

1

12.08.2012, 21:09

Hardcoded Values vermeiden

Da ich momentan an einem Framework(ja schlagt mich dafür ich habe den Atrikel "write Games not Engines" schon gelesen) schreibe das ich für mein Spiel benutze stellt sich mir eigentlich bei jeder neuen Klasse die Frage: "Wieviel soll ich im Code festsetzen?" Damit meine ich z.B. Wieviele Buffer soll die Swap Chain haben, welchen Adapter benutze ich für das ID3D11Device etc. Da ich das Framework gerne so schreiben möchte das ich es später auch für andere Spiele nutzen kann habe ich bis jetzt immer versucht sowenig wie möglich im Code der Klassen festzusetzen allerdings komme ich grade jetzt an einen Punkt an dem ich durch die hohe "Einstellbarkeit" von DX11 auch einfach auf eine Klasse verzichten könnte um nicht an Funktionalität zu verlieren allerdings habe ich dann keinen Code den ich wiederverwenden könnte.

Hat jemand einen Tipp für mich wie ich möglichst wiederverwendbaren Code schreiben kann ohne das ich jedes mal die halbe Implementation ändern mus weil ich jetzt doch ein anderes Buffer Format haben möchte?
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

12.08.2012, 21:22

ich bin gerade mit dem gleichen Projekt beschäftigt :)

Du kannst auf abstrakte Klassen setzen und deine Klassen ableitbar machen. Wenn du eine Basisklase für Objekte hast, die z.B. deren Shader und Constantbuffer etc. verwaltet, wird diese Klasse eine virtuelle Rendermethode haben. Eine weitere Klasse, die als Szene fungiert und mit Objekten bestückt wird, kann zum Rendern auf jedem Objekt die Rendermethode aufrufen. So kann es letztendlich der Szenenklasse egal sein, um was für ein Objekt es sich handelt. Auf diesse Weise erzeugst du eine Architektur, deren Inhalt beliebig erweiterbar ist. Du kannst in deinem Framework Klassen für beispielsweise 2D- und 3D-Objekte von der Basisklasse ableiten und zur Verfügung stellen. Möchte der Benutzer später weitere Objekttypen erzeugen, muss er nur von der Basisklasse ableiten.

Klar, beim Erstellen der grundlegenden DirectX-Schnittstellen, muss man Abstriche machen, was die Flexibilität betrifft, um die Komplexität zu senken. Vielleicht hilft es hier schon, Parameter deiner Funktionen mit Standardwerten zu versehen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

12.08.2012, 23:11

Wenn du ein Framework für dein Spiel schreiben willst, dann sollte auch das Interface an dein Spiel angepasst sein. Die Anzahl der Buffer der SwapChain interessiert dein Spiel sicherlich herzlich wenig. Dein Spiel muss lediglich ein Fenster aufmachen und was reinrendern können. Dein Spiel interessiert sich auch nicht für Shader oder Constant Buffer. Dein Spiel interessiert sich dafür, dass eine Spielfigur an einer bestimmten Position gezeichnet wird. Das Interface zwischen deinem Spiel und dem Renderer sollte also wohl auch eher von einem Playermodel an einer bestimmten Position sprechen, als von Projection Matritzen, Shadern, Texturen und Rasterizer States. Wie all diese Dinge kombiniert werden, um am Ende ein Playermodel an eine bestimmte Position zu malen, genau das ist doch eigentlich die Aufgabe des Renderers... ;)

Ich weiß, wie verlockend es ist, ein "Framework" oder eine "Engine" zu schreiben, die de facto einfach nur Direct3D Wrapper ist. Imo fundamentale Erkenntnis: Ein Wrapper bringt keine echte Abstraktion und ist damit am Ende praktisch wertlos.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (12.08.2012, 23:18)


4

13.08.2012, 11:38

Wenn du ein Framework für dein Spiel schreiben...

So wie du die Sache beschreibst hört sich das nach dem Model-View-Controller Design Pattern an. Das Problem das ich mit dem Pattern habe ist das ich zwar schon unmengen dazu gelesen habe aber noch keine vernüftige Beispiel-Implementation gefunden habe die etwas mit Spielen zu tun had und über ein einfaches Pong hinaus geht.

Ich weiß, wie verlockend es ist, ein "Framework" oder eine "Engine" zu schreiben, die de facto einfach nur Direct3D Wrapper ist. Imo fundamentale Erkenntnis: Ein Wrapper bringt keine echte Abstraktion und ist damit am Ende praktisch wertlos.

So schlecht sind Wrapper doch nicht? Wenn ich mich nicht irre ist das XNA-Framework für C# doch auch nur ein DirectX Wrapper oder nicht?


Auf diesse Weise erzeugst du eine Architektur, deren Inhalt beliebig erweiterbar ist. Du kannst in deinem Framework Klassen für beispielsweise 2D- und 3D-Objekte von der Basisklasse ableiten und zur Verfügung stellen. Möchte der Benutzer später weitere Objekttypen erzeugen, muss er nur von der Basisklasse ableiten.

Ich habe schon oft gelesen das man tiefe Klassenhierarchien vermeiden sollte, wäre es dann nicht kontra produktiv wenn man das "Framework" mit Interfaces/Basisklassen schreibt?
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

13.08.2012, 11:48

XNA als DirectX-Wrapper macht aber durchaus Sinn, weil es sonst keinen nativen Zugriff aus .Net heraus zu DirectX gäbe.
Andernfalls sind Wrapper wirklich nicht sonderlich sinnvoll. Sie sollen eben wrappen, was man wrappen *muss*, weil es anders nicht geht. Ich denke dot hat schon sehr gut beschrieben, was für Dein Spiel relevant ist. Und dem ist die Anzahl der Buffer oder die Swapchain wirklich total egal, genau genommen ist ihm sogar egal mit welcher Engine das Zeug gerendert wird, solange es überhaupt gerendert wird. Folglich sind viele der intern notwendigen Parameter total egal. Falls nicht, dann lass die Engine ein Konfig-File einlesen, wo diese Parameter spezifiziert werden können. Aber sie als Parameter in der API wie in einem Wrapper durchschleifen, das ist wirklich nicht sinnvoll.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

13.08.2012, 11:57

Wenn du ein Framework für dein Spiel schreiben...

So wie du die Sache beschreibst hört sich das nach dem Model-View-Controller Design Pattern an. Das Problem das ich mit dem Pattern habe ist das ich zwar schon unmengen dazu gelesen habe aber noch keine vernüftige Beispiel-Implementation gefunden habe die etwas mit Spielen zu tun had und über ein einfaches Pong hinaus geht.

Ich hab jetzt eigentlich nicht unbedingt an MVC gedacht, auch wenn das am Ende tatsächlich wohl etwas in die Richtung geht.


Ich weiß, wie verlockend es ist, ein "Framework" oder eine "Engine" zu schreiben, die de facto einfach nur Direct3D Wrapper ist. Imo fundamentale Erkenntnis: Ein Wrapper bringt keine echte Abstraktion und ist damit am Ende praktisch wertlos.

So schlecht sind Wrapper doch nicht? Wenn ich mich nicht irre ist das XNA-Framework für C# doch auch nur ein DirectX Wrapper oder nicht?

Ich hab nie mit XNA gearbeitet, afaik ist es jedoch wesentlich mehr als einfach nur ein DirectX Wrapper. Und selbst wenn, würde das im Fall von XNA Sinn machen, wie BlueCobold schon gesagt hat. Aber überleg mal, was ein Wrapper dir bringt. Was bringt dir ein "Renderer", der am Ende das selbe Interface bietet wie die darunterliegende API selbst!? Wenn du mich fragst, hast du dadurch nichts gewonnen, du könntest stattdessen gleich auch einfach wieder Direct3D direkt benutzen. Ein Renderer für dein Spiel sollte eben das Rendern deines Spiels kapseln...

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

13.08.2012, 12:11

Ich finde eine Klassenhierarchie alles andere als Kontraproduktiv. Was mich persönlich immer ärgert ist, wenn ich in einer Klasse genau denselben größeren Codeausschnitt oder sogar mehrere Funktionen verwenden muss, die ich schon in einer anderen Klasse verwendet habe. Dann nämlich haben diese Klassen eine Beziehung zueinander (sie benötigen teilweise die selbe Funktionalität). In diesem Fall hätte man das besser modellieren können, indem beide Klassen von einer Klasse erben, die genau diese Funktionen zur Verfügung stellt. Natürlich kann man das übertreiben. Vererbung muss auch einer gewissen Logik folgen. Nur weil zufällig 2 Klassen Daten sortieren (was nicht ihre Hauptaufgabe ist) und dazu den gleichen Algorithmus verwenden, heißt das noch lange nicht, dass sie diese Funktionalität von einer Basisklasse erben sollten. Bei den von mir geschilderten Objekttypen halte ich das im Gegensatz für sehr sinnvoll. Ein Renderer kann jedes Objekt gleich behandeln, wenn jedes ein Basisinterface implementiert und muss sich nicht darum kümmern, wie das jeweilige Objekt aufgebaut ist. Das steigert in jedem Fall die Erweiterbarkeit deines Frameworks.

Anbei ein Ausschnitt aus einem Klassendiagramm, das ich aus meinem Framework erstellt habe. Die dort angewandte Vererbungshierarchie halte ich persönlich für sinnvoll.
»BurningWave« hat folgendes Bild angehängt:
  • DXFrameworkClassDiagram.jpg

8

13.08.2012, 12:42

Ich finde eine Klassenhierarchie alles andere als Kontraproduktiv.

Deine Hierarchie ist auch sehr flach ich hab da eher an sowas wie das hier gedacht: IGameObject->IDrawableGameObject->ISprite->IAnimatedSprite->ICharacterSprite->IPlayerSprite...

Ich glaube ich werde das ganze nochmal mit dem MVC Pattern versuchen da mein Buch das auch verwendet. Dazu ist mir aber grade eine Frage eingefallen. Wenn ich wie in einem klassischem RPG Textboxen mit "Ja-Nein" auswahlanzeigen lassen möchte gehört der Textbox Code dann zum Model oder zum Controller?
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

13.08.2012, 12:49

Ich würde eher sagen, GUI gehört zum View und zum Controller, bin aber kein MVC Experte...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

13.08.2012, 14:03

Ein "IDrawableGameObject" oder "ICharacterSprite" oder "IPlayerSprite" verstößt schon vom Namen her vermutlich gegen MVC. Player und GameObject sind Models, Drawables und Sprites sind Views.
Ich finde in Games MVC oft aber sehr kontraproduktiv.
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]

Werbeanzeige