Ich denke daran, eine einfache Spiel-Engine für mein Abschlussjahrprojekt zu machen. Ich möchte, dass es modular und erweiterbar ist, sodass ich neue Teile hinzufügen kann, wenn ich Zeit habe. Zum Beispiel würde ich eine Grafik-Engine machen, die völlig unabhängig von den anderen Systemen wäre, sobald das fertig ist, könnte ich eine Physik-Engine usw. hinzufügen. Ich möchte auch einen Werkzeugsatz machen, der zu diesem Motor passt. Für die Werkzeuge würde ich gerne C # verwenden, aber ich bin mir nicht sicher über die Bibliotheken. Meine Frage ist, wenn ich ein C # GUI-Programm möchte, kann ich auf eine in C ++ geschriebene Bibliothek verweisen? Auch würde es irgendwelche Leistungsprobleme etc. geben, wenn ich einige der Bibliotheken in C # machte, aber sie von einem C ++ Spiel verwenden wollte.
Ich möchte C ++ so gut wie möglich meiden, meine Erfahrungen haben gezeigt, dass die Entwicklungszeit bei einem Projekt viel höher sein kann als bei der Verwendung von C # oder Java etc. Meine Grafikentwicklung würde in OpenGL sein, das ist alles wurden unterrichtet. Wir haben das nur in C ++ gemacht, aber ich habe gesehen, dass Projekte wie SharpGL die Entwicklung mit C # ermöglichen. . Gibt es irgendwelche Leistungsprobleme damit? Ich bin nicht auf der Suche nach einem blitzschnellen Top-Grafik-Spiel. Es wird wahrscheinlich etwas Einfaches sein, um meinen Motor zum Laufen zu bringen. Mein Motor wird wahrscheinlich auch nicht so toll sein, da ich nur ein Jahr habe und alleine arbeite.
Jeder Hinweis hierzu wäre willkommen. Ich bin immer noch wirklich in der Planungsphase, also wäre es nicht zu viel Arbeit, um komplett zu ändern, was ich tun möchte. Ich möchte nur irgendwelche größeren Probleme vorwegnehmen, die ich haben könnte.
Danke
Wenn Sie dies auch unter einer entspannten Reihe von Zielen erreichen können, sind Sie bereit für ein großartiges Projekt. Zuerst müssen Sie den Umfang erfassen:
Eine Game Engine ist eine große Entwicklungsaufgabe. Eine Game Engine mit einer Toolchain ist eine enorme Entwicklungsaufgabe. In vielerlei Hinsicht ist die Auswahl einer kleineren, aber anspruchsvolleren Aufgabe vorzuziehen, weil sie ein höheres Denken über Problemlösung zeigt, was von Akademikern sehr bevorzugt wird - doppelt so, wenn Sie CS sind und nicht [Area of] Engineering. Da Sie in verwalteten Sprachen arbeiten, sollten Sie Folgendes beachten:
Sie sollten sich XNA anschauen. Es funktioniert ziemlich gut, und von dem, was ich gehört habe, ist ziemlich einfach zu arbeiten.
Über den Verweis auf C ++ - Code von C #: Es ist vollkommen machbar, obwohl es einige Anstrengungen von Ihrer Seite erfordern wird, um es richtig zu machen. C ++ / CLI kann als Zwischen-Wrapper arbeiten oder Sie können P / Invoke verwenden. Denken Sie daran, dass C ++ nicht verwaltet wird und dass Sie einige manuelle Garbage Collection durchführen müssen, was in einer verwalteten Umgebung wie .Net etwas eklig sein kann. Leistung in C ++ - & gt; C # -Bridge ist okay, aber ich bin mir nicht sicher, wie es funktionieren wird, wenn Sie jede Sekunde 100.000 Aufrufe an eine Math-Bibliothek ausführen müssen. Ich schätze, ein kleiner Test wäre gut. Ich werde sehen, ob ich später noch Zeit dafür habe, obwohl ich es etwas bezweifle:)
Beim Erstellen einer Grafik-Engine (ich werde nur wirklich über Grafiken sprechen, da dies mein Fachgebiet ist), sind dies einige der Möglichkeiten, die Sie im Projekt EARLY machen müssen:
1) Ist es ein Innen- und / oder Außenmotor?
2) Welche Art von Sichtbarkeitssystem werden Sie verwenden?
3) Forward oder Deferred Renderer?
4) Wie werden Sie Animationshierarchien haben?
5) Dynamische oder statische Beleuchtung?
6) Wie gehen Sie mit Transparenz um?
7) Wie werden Sie mit einem 2D-Overlay umgehen?
8) Welche Mesh-Formate verwenden Sie? Roll dein eigenes?
Denken Sie daran, Sie brauchen eine gute solide Vektor / Matrix-Bibliothek und vorzugsweise eine vollständige Mathematik-Bibliothek, die mit Dingen von Eulers zu Quaternionen zu Achse ausgerichtet Bounding-Boxen helfen wird.
Machen Sie auch viel Forschung. Versuchen Sie herauszufinden, welche potenziellen Probleme Sie haben werden. Denken Sie daran, dass Dinge wie das Ändern einer Textur oder eines Shaders RIESIGE Auswirkungen auf Ihr Pipelining haben können. Sie müssen diese so weit wie möglich minimieren.
Bedenken Sie, dass es einfach ist, ein rotierendes Bump-Mapping auf dem Bildschirm zu erhalten, im Vergleich zu einem laufenden Motor. Lass dich davon nicht abschrecken. Es sollte kein Problem sein, eine relativ einfache Spiel-Rendering-Engine in wenigen Monaten zu schreiben:)
Außerdem ... finden Sie für diesen Bereich spezifische Communities. Sie erhalten viele gute (wenn auch nicht OpenGL-zentrische) Informationen von DirectXDev . Es gibt einige allgemeine Informationen zum Algorithmus zur Spieleentwicklung, die unter GDAlgorithms zur Verfügung stehen. Es gibt auch eine OpenGL-spezifische Mailingliste hier .
Es ist erwähnenswert, dass DirectXDev und GDAlgorithms zumindest (ich weiß nicht so viel auf der GL-Mailingliste) von einigen sehr erfahrenen 3D-Engine- und Spieleentwicklern bevölkert sind. Schreiben Sie nicht viele "Anfänger" -Fragen auf, da dies dazu neigt, Verachtung unter den Mitgliedern zu erzeugen. Obwohl die ungerade Abfrage oder 2 auf jedem Niveau (Anfänger bis Fortgeschrittene) erstaunliche Antworten bekommen werden.
Viel Glück! Ich wünschte, ich hätte das an der Universität machen können. Ich wäre vielleicht nicht weggegangen und der Spieleindustrie beigetreten und hätte ein zusätzliches Jahr des Schlafens genossen;) hehehe
Warum brauchen Sie irgendeinen C ++ - Code?
Es gibt bereits mehrere Wrapper-Bibliotheken, die OpenGL oder DirectX für .NET freigeben, wie zum Beispiel SlimDX (was, wie der Name andeutet, eine Menge ist dünneres, leichteres Wrapper als etwas wie XNA)
Wenn Sie mit C # vertrauter sind, gibt es keinen Grund, warum Sie nicht Ihr gesamtes Spiel darin schreiben könnten.
Leistung wird im Allgemeinen kein Problem sein. In den meisten Fällen ist die Leistung von C # -Code vergleichbar mit C ++. Manchmal ist es schneller, manchmal ist es langsamer. Aber es gibt wenige Fälle, in denen C # nicht schnell genug ist. (Es besteht jedoch ein erheblicher Leistungsaufwand bei der Verbindung zwischen nativem und .NET-Code - dies kann die Performance zu oft beeinträchtigen. Daher ist der Trick, wenn Sie überhaupt nativen Code verwenden, ausreichend große native Operationen zu haben der Sprung nach / von .NET wird oft nicht gemacht
Abgesehen davon, ein Ratschlag: Mach dir keine Mühe, eine "Engine" zu schreiben . Sie werden Ihre Zeit damit verschwenden, einen großen, monolithischen Code zu produzieren, der letztendlich nicht funktioniert, weil er nie an den Anforderungen eines tatsächlichen Spiels getestet wurde, nur was Sie dachten würde dein zukünftiges Spiel brauchen.
Wenn Sie mit der Entwicklung von Spielen experimentieren möchten, machen Sie ein Spiel . Und dann, auf jeden Fall, refactor es und reinigen Sie es und versuchen, wiederverwendbare Teile des Codes zu extrahieren. Wenn der Code jedoch nicht bereits in einem Spiel verwendet wurde, können Sie ihn in Zukunft auch nicht zum Erstellen eines Spiels verwenden.
Die in kommerziellen Spielen verwendeten Engines sind genau das, Code, der aus früheren Spielen extrahiert wurde, Code, der getestet wurde und welcher funktioniert . Im Gegensatz dazu benötigen Hobby-Engines ziemlich oft mehr als 2 Jahre Entwicklerzeit, ohne jemals etwas Nutzbares anzubieten.
Das ganze Konzept einer "Game Engine" ist fehlerhaft. In jeder anderen Bereich der Software-Entwicklung, würden Sie die Idee von eine vage-definierten Komponente im Grunde tun "alles, was ich brauche, um mein Produkt zu machen". Sie sind besonders misstrauisch gegenüber der Idee, dass es sich um eine separate Entität handelt, die vom eigentlichen Produkt, das es unterstützen soll, getrennt entwickelt werden kann.
Nur in der Spieleentwicklung, die im Großen und Ganzen in den Methoden der 80er steckt, ist es ein gemeinsamer Ansatz. Auch wenn es nicht funktioniert.
Wenn es sich um ein Schulprojekt handelt, bin ich mir sicher, dass derjenige, der es bewerten soll, es zu schätzen wissen wird, wenn Sie gängige Software-Praktiken anwenden. Nur weil viele Neulinge in der Spieleentwicklung das nicht tun (und es vorziehen, sich an einen Mythos über "Engines" zu halten), gibt es keinen Grund, warum du es nicht besser machen solltest.
Stellen Sie sicher, dass Ihr Anwendungsbereich realisierbar ist.
Als Teenager ging ich durch die build-my-own-engine-Phase, einige Jahre später wurde mir klar, dass ich viel mehr getan hätte, wenn ich nur pygame und pyopengl verwendet hätte und die Mühe nicht verschwendet hätte. p>
Sieh dir die Foren auf gamedev.net an.
Klingt für mich so, als hätten Sie einen ziemlich guten Plan für Ihr Projekt. (Ich verstehe Ihre Meinung über XNA in Ihrem Kommentar zu @Meeh)
Sie können mit C ++ über P / Invoke direkt oder COM interoperieren, Sie könnten mir auch eine SOA-Methode einfallen lassen, aber um ehrlich zu sein, so würde ich geneigt sein, COM als API zu verwenden Hebel der Wahl ... warum? Denn dann öffnest du deine API für viele gängige Client-Sprachen, nicht nur für C # und VB.NET, sondern auch für Delphi, VBA, Powerbuilder usw.
Die Performance sollte kein Problem sein, da die API-Einstiegspunkte nur den Arbeitsstrukturen und Transportdatenstrukturen entstammen. Die eigentliche Arbeit wird in Ihrer Bibliothek in nativem Code erledigt, also machen Sie sich keine Sorgen über die Perf. ATL ist Ihr Freund beim Erstellen von COM-Klassen, die einen Zugang zu Ihrer Bibliothek bieten.
Obwohl es durchaus möglich ist, zwischen C ++ und C # zu überbrücken (Via verwaltetes C ++ ist ein guter Weg, wenn die Schnittstelle komplex ist, P / Invoke für einen sehr einfachen), für Tool & lt; - & gt; könnte stattdessen eine netzwerkbasierte Schnittstelle vorschlagen. Dies ist ideal für eine High-Level-Schnittstelle, wie Sie sie für einen Level-Editor / Modell-Viewer oder ähnliches benötigen. Ein tatsächlicher Objektmodellierer ist kein so gutes Ziel. Welche Werkzeuge sehen Sie?
Wenn Sie dies auf diese Weise tun, können Sie Verbindungen zu entfernten Instanzen der Engine oder zu mehreren Instanzen oder sogar Instanzen herstellen, die auf verschiedenen Hardwareplattformen ausgeführt werden. Es wird Ihnen auch etwas über Sockets beibringen, wenn Sie sie nicht schon kennen.
Tags und Links c# c++ opengl performance