DirectX oder OpenGL [geschlossen]

8

Wenn Sie die nächste 3D-Grafik-intensive Anwendung in C # schreiben (wie eine 3D-Modellierungs- und Animationssoftware), welche wäre die bessere Wahl?

Wenn wir C # als plattformunabhängig betrachten, scheint OpenGL verlockend zu sein, aber was ist mit der Leistung usw.?

Da die verwendete Sprache C # ist, ist die Leistung ziemlich wichtig, um sie zu berücksichtigen.

Bearbeiten: Sie können auch SlimDX und TAO, OpenTK, csGL, usw. in Betracht ziehen.

    
Joan Venge 02.02.2009, 20:31
quelle

15 Antworten

8

Die Leistung in verwaltetem Code in Bezug auf das Grafiksubsystem ist nicht schlecht. SlimDX zahlt bei jedem Aufruf von DirectX eine geringfügige Strafe für den vollständig nativen Code, ist jedoch keineswegs streng. Die tatsächliche Strafe hängt von dem Anruf ab - ein Anruf in DrawPrimitive ist insgesamt wesentlich teurer als ein Aufruf von SetRenderState, so dass Sie prozentual viel mehr bei den SetRenderState-Anrufen verlieren. SlimDX enthält eine abgestimmte Mathematikbibliothek, die im Allgemeinen sehr gut funktioniert, obwohl Sie ein wenig vorsichtig damit sein müssen. Das Profilieren, sogar mit einem Junkertool wie Nprof, hebt dieses Zeug sehr schnell hervor, so dass es nicht schwierig ist, es zu reparieren.

Wenn wir generischen, vollständig optimalen C ++ - und C # -Code betrachten, der Rendering über D3D macht, liegt die C # -Version wahrscheinlich innerhalb von 10-15% der C ++ - Version. Das ist jedoch schwer zu erreichen. Überlegen Sie, wie viel Zeit Sie sparen, indem Sie in C # arbeiten, was Sie auf Grafikoptimierungen auf höherer Ebene anwenden können, für die Sie wahrscheinlich keine Zeit hätten, wenn Sie die gesamte Sache in C ++ erstellen müssten. Und selbst wenn es Ihnen gelingt, die zusätzlichen 10% in C ++ zu erhalten, schrumpft es innerhalb weniger Monate auf 5%, wenn eine neue Hardware-Runde Ihren Anwendungscode schneller als je zuvor durchbricht. Ich weiß, was ich wählen würde - deshalb habe ich SlimDX geschrieben.

OpenTK unterliegt ähnlichen Leistungsmerkmalen, mit der Einschränkung, dass ihre Mathematikbibliothek an manchen Stellen ziemlich langsam ist. Dies ist ein Implementierungsfehler, den ich mit ihnen diskutiert habe, und wird hoffentlich zu lange behoben werden.

    
Promit 17.04.2009, 02:30
quelle
24

Ich würde OpenGL aus folgenden Gründen empfehlen: -

  1. Cross Platform - OpenGLES ist heutzutage besonders wichtig für mobile Plattformen
  2. Die Implementierung der OpenGL-Schattierungssprache ist den DirectX-Shadern inhärent überlegen.
  3. OpenGL ist etwas einfacher zu erlernen, da es möglich ist, einfache Renderings mit sehr wenigen Codezeilen einzurichten
  4. Philosophisch OpenGL wurde als Allzweck-Rendering-Engine entworfen, während DirectX immer auf Spiele ausgerichtet war, also würde OpenGL besser zu Ihrer Frage passen.
  5. OpenGL ist eine stabile Technologie, die es schon seit einiger Zeit gibt und auch weiterhin geben wird. DirectX ist mehr von der Laune von Microsoft abhängig und könnte sofort veraltet sein, wenn MS sich danach fühlt.

Das heißt, die Anforderungen Ihres Systems und Ihre persönlichen Vorlieben könnten es in beide Richtungen lenken, da beide Ansätze solide Implementierungen sind. Auf der anderen Seite ist OpenGL sehr eine Zustandsmaschine und kann schwierig sein, in OO zu passen, obwohl es sicherlich nicht unmöglich ist.

BEARBEITEN: Hinzugefügt, um meinen Kommentar zum OpenGL-Shadermodell zu verdeutlichen, das DirectX inhärent überlegen ist. Dies liegt daran, dass DirectX-Shader mit dem Programm zur Entwicklungszeit gegen ein generisches GPU-Modell kompiliert werden, während OpenGL-Shader als Quellcode gespeichert und zur Laufzeit vom OpenGL-Treiber kompiliert werden. Folglich ist es theoretisch möglich, dass der Treiberschreiber spezifische Funktionen (oder aktualisiert, wenn ein altes Programm ausgeführt wird) Features der GPU nutzt und kompilierten Code erstellt, der schneller als DirectX-Shader ausgeführt werden kann. Es ist ein kleiner Punkt, aber möglicherweise ein ziemlich wichtiger Punkt.

    
Cruachan 02.02.2009 21:02
quelle
11

Der Leistungsunterschied zwischen Direct3D und OpenGL liegt nahe Null. Die Feature-Sets der beiden werden nicht eins zu eins zugeordnet, aber sie sind nah. Der Hauptvorteil von OpenGL ist die plattformübergreifende Unterstützung.

    
Ronny Vindenes 02.02.2009 20:40
quelle
7

OpenGL ist in der Vergangenheit in Bezug auf Leistungsmerkmale zurückgeblieben, aber die Dinge wurden schließlich behoben. Um ein Beispiel zu geben, betrachten Sie bindbare Uniformen, bei denen Direct3D einen schnelleren Mechanismus hatte, bevor OpenGL ein ähnliches System erlangte. Abgesehen von der Unterstützung verschiedener Feature-Sets gibt es keinen Unterschied.

Wenn Sie also nicht mit den neuesten GPU-Funktionen arbeiten wollen, rate ich Ihnen, mit OpenGL zu arbeiten. Es ist sicher zu sagen, dass es nicht viele Bereiche gibt, in denen OpenGL leistungsabhängige Funktionen zurückschickt.

Übrigens sind C # und .NET nur dann plattformunabhängig, wenn Sie bestimmte Vorsichtsmaßnahmen treffen.

    
quelle
4

Hier ist mein ehrlicher Vorschlag für Sie: Nutzen Sie beide .

Hinweis

Ich würde jeden Tag abwägen, welcher einen mehr Werkzeuge zur Verfügung hat, um ein Programm fertig zu stellen, und dann würde ich aus Performancegründen den anderen nutzen, um maximale Leistung auf verschiedenen Systemen zu gewährleisten.

Gedanken zur Debatte

Sehen wir uns an: Die Leistung des Programms hängt von vielen Dingen ab, hauptsächlich von Ihrem Aufwand (dem Code der Anwendung) und den Treibern auf dem gegebenen Computer. Grafik-APIs sind ein Mittel, mit dem Ihre Anwendung mit der GPU kommunizieren kann, und machen Sie dadurch unglaublich abhängig davon, wie gut ein bestimmter Treiber für eine installierte GPU implementiert ist.

Meine Wahl

Direct3D ist auf manchen Grafikkarten manchmal schneller als OpenGL, und das liegt an den Grafikherstellern und ihren Treibern.

DirectX bietet viele Tools, um die Entwicklung zu beschleunigen. Ich weiß, dass es zunächst eine sehr steile Lernkurve hat, aber erlaube mir, daran zu erinnern, dass du zufällig ein Programmierer bist. Ich wage sogar, einen sehr guten zu sagen.

Fazit

Daher müssen Sie in der Lage sein, sich einzukämpfen und langsam Ihr eigenes Framework zu entwickeln, das beide APIs verwendet und Sie so in die Lage versetzt, das Programm, das Sie im Sinn haben, zu testen und zu implementieren.

Mit freundlichen Grüßen

Mossa Nova Merhi

    
Mossa Nova 05.06.2009 14:05
quelle
2

Wenn Sie XNA nicht mögen, können Sie SlimDX verwenden. Im Gegensatz zu XNA unterstützt SlimDX DirectX 10.

    
Michael Kelley 02.02.2009 21:15
quelle
2

Mit OpenGL können Sie "DirectX 10-Funktionen" wie Geometrieshader unter Windows XP und Linux verwenden. Mit GLUT ist es sehr einfach, innerhalb weniger Minuten eine Demo-Anwendung zu starten.

    
heeen 02.02.2009 21:19
quelle
2

Ich habe OpenGL und DirectX verwendet. Ich denke, die Leistung ist ziemlich ähnlich. Ich bevorzuge das Programmiermodell von OpenGL - insbesondere die Handhabung von Transformationen und die direkte Unterstützung von Kommissioniervorgängen. Ich mag es nicht, wie MS bei jeder Aktualisierung des Betriebssystems die gleiche Funktionalität neu schreibt, und ich denke, OpenGL schützt Sie davor.

Allerdings sind beide skurril und Sie müssen viel Zeit darauf verwenden, sicherzustellen, dass es gut mit dem Hosting-Anwendungsframework interagiert, egal ob Windows oder etwas anderes.

    
Jeff Kotula 02.02.2009 21:22
quelle
1

Ich glaube nicht, dass OpenGL fast genauso gut in eine reine OO-Umgebung passt wie etwa XNA. Das heißt, wenn Sie wirklich an plattformübergreifender Kompatibilität interessiert sind, sollte es nicht wichtig sein, auf was Sie zurückgreifen.

Entwerfen Sie die Geschäftslogik Ihrer Anwendung so, dass sie unabhängig vom Rendering-Backend ist. Sie sollten in der Lage sein, ein OpenGL-Rendering-Objekt einstecken und dann für einen XNA-Renderer kein Problem auslagern. Dies erhöht nicht nur Ihren potenziellen Kundenstamm (indem es Unterstützung für beide ermöglicht), sondern macht das Design Ihrer Anwendung viel schöner.

Auch eine kleine Anmerkung, DX sollte nicht von .NET verwendet werden, da Managed DirectX veraltet ist; benutze XNA.

    
Cody Brocious 02.02.2009 20:36
quelle
1

Es hängt davon ab, auf welche Plattform Sie zielen wollen.

Wenn Sie nur Windows als Ziel verwenden müssen, verwenden Sie XNA

Für plattformübergreifendes Arbeiten hat vielleicht jemand anderes etwas Arbeit mit mono mit openGL gemacht - ich gehe davon aus, dass Sie eher Grafiksoftware als ein Spiel entwickeln wollen, also wäre es sehr hilfreich, ein Framework wie winForms zu haben für alle Ihre UI-Steuerelemente.

    
JSmyth 02.02.2009 20:58
quelle
1

Sie werden wahrscheinlich in die IrrLicht-Engine schauen wollen, sie hat sowohl eine C ++ - als auch eine .Net-API, und sie ist völlig agnostisch (dh Sie können den gleichen Code verwenden, um OpenGL oder DirectX auszuführen, und der Programmierer muss es nicht einmal tun) wissen, was Sie verwenden)

Sie sollten auch SlimDX, eine sehr schnelle, leichte Open-Source-Alternative zu XNA

, betrachten     
Neil N 02.02.2009 21:24
quelle
1

DirectX wird eine bessere Unterstützung für Grafiktreiber unter Windows haben, da MSFT damit Karten zertifiziert. Wir haben festgestellt, dass die OpenGL-Unterstützung fehlt, crashig oder einfach falsch für billigere Karten unter Windows.

    
i_am_jorf 17.04.2009 02:37
quelle
1

Vielleicht möchten Sie Folgendes sehen: Ссылка

Die verwaltete API wird jetzt nicht unterstützt, daher könnte OpenGL die beste Wahl sein, es sei denn, Sie möchten mit XNA arbeiten.

Je nachdem, welche anderen Plattformen Sie unterstützen möchten, z. B. mobile Geräte oder XBox360, können Sie dann entscheiden, welche API zu verwenden ist.

    
James Black 17.04.2009 02:44
quelle
1

Im Hinblick auf die Leistung sind beide praktisch gleich, Ihr Code und Ihr Design sind die wichtigsten Faktoren, die die Geschwindigkeit beeinflussen. Darüber hinaus sind beide APIs gut gepflegt (im Vergleich zu vor 5 Jahren, als dx viel voraus war).

In diesen Fällen besteht eine Möglichkeit darin, basierend auf Ihrer Philosophie und der Philosophie hinter jeder API zu wählen.

Einige könnten einen kommerziellen Fokus benötigen; Software verkaufen, Geld invertieren, Geschäfte machen. Aus einem Geschäftsumfeld kommend, in dem Geld die Dinge beschleunigen kann, eignet sich dx für diese Fälle, in denen Sie unter anderem interessante Angebote mit microsoft at capacitations und Tools entwickeln können.

Auf der anderen Seite ist OpenGL ein offener Standard, das bedeutet, dass die Leute diskutieren, bewerten und dazu beitragen können, die Standard-API zu verbessern, die zum Nutzen der Gesellschaft in erster Linie garantiert ist. Dies ist kompatibler mit einem wissenschaftlichen Ansatz, bei dem das Ziel darin besteht, eine Forschung zu veröffentlichen, freie Software zu veröffentlichen, eine Komunität zu entwickeln und Feedback von Entwicklern auf der ganzen Welt, Multiplattform, zu erhalten.

Sie sind unterschiedliche Ansichten der Software-Entwicklung, ich denke, dass beide ihre Stärken haben, es ist gut, dass wir immer noch zwischen zwei APIs mit sehr unterschiedlichen Hintergründen wählen können, aber sehr ähnliche Dinge tun.

    
labotsirc 22.09.2011 15:32
quelle
0

Es gibt eine verwaltete API für DirectX, mit der Sie Zugriff auf die DirectX-API als "native" C # -Objekte erhalten. Das ist ein großer Vorteil gegenüber OpenGL.

    
Joel Coehoorn 02.02.2009 20:35
quelle

Tags und Links