Wo endet das Framework (XNA) und wo beginnt die API (DX)?

7

Ich habe viele interessante Fragen zu XNA vs. OpenTK vs. SlimDX vs. OpenGL vs. DX gelesen, und obwohl es wirklich nützlich ist, mit diesen verschiedenen APIs / Frameworks andere allgemeine Eindrücke aus Hunderten von Stunden zu erhalten, habe ich dies nicht getan jede Antwort gesehen, die klar definiert, was der Umfang von jedem ist.

Es ist klar, was der Unterschied zwischen einer API, einer Engine und einem Framework in der Theorie ist, aber für jemanden, der nur begrenzte Erfahrung mit Grafiksystemen hat, ist es schwieriger zu erkennen, was auf der praktischen Seite in jede Kategorie fällt. (Nicht einfacher durch all die Überlappungen! ZB XNA, das eine Inhaltspipeline als integralen Bestandteil implementiert)

Nehmen wir zum Beispiel das Keulen von Gesichtern - XNA "macht" dies im Hintergrund, ohne dass der Programmierer darüber nachdenken muss, aber wo passiert es? Gibt es in DX eine 'Cull Face'-Funktion, die aufgerufen werden muss, oder vielleicht oben in XNA? Oder macht es die GPU oder ihr Treiber?

Ich habe in der Dokumentation zu einem der verwalteten Projekte gelesen (ärgerlicherweise kann ich mich nicht erinnern, welches), wie schwierig es war, effizienten Rendering-Code zu implementieren, und wie dieses Projekt ihn abstrahierte. Dies irritierte mich ein wenig und ließ mich fragen, was XNA unter DrawIndexedPrimitives tut, was manuell durchgeführt werden müsste, wenn das Framework für etwas Flexibleres belassen würde.

Was macht XNA im Hintergrund beim Rendern dieses Cubes, was eine verwaltete API nicht tun würde?

sebf
quelle
gamedev.stackexchange.com/questions/12701/... Summiert den Motor vs Rahmen part..an API ist einfach , wie das Framework / Bibliothek / Motor präsentiert.
Die kommunistische Ente
Abgesehen von Ihrer Beispielfrage zum Ausmerzen von Gesichtern ist diese Frage eher vage. Was für eine Antwort suchen Sie? Es scheint mir, dass Sie nach einer Liste von allem fragen, was jede Bibliothek tut, damit Sie erkennen können, welche Ebenen was tun. Ich denke, vielleicht sollten Sie die relevante Dokumentation und, falls verfügbar, den Quellcode von Fall zu Fall konsultieren. Ihre Frage zum Ausmerzen des Gesichts kann beantwortet werden, aber der Rest der eingekapselten Frage scheint mir offen zu sein.
Ricket
Ich denke, die Hauptfrage ist im Titel. OP möchte wissen, wie viel "beschäftigt" XNA im Vergleich zur Programmierung in C ++ und Direct X
Nate am
@Ricket, Entschuldigung, es ist wahrscheinlich ein wenig vage, weil ich nicht sicher bin, wie ich die Antwort am besten ausdrücken kann. In Bezug auf eine Liste von Ebenen haben Sie Recht. Keine großen, vollständigen Listen, aber vielleicht ein paar Beispiele für die Art von Funktionen, die XNA im Hintergrund aufruft, oder Methoden, die für das Rendern in OpenGL, aber nicht in XNA erforderlich sind, würden einen guten Job machen, um zu veranschaulichen, wie groß der Unterschied in der Ebene ist ist. Nate ist richtig; Wenn Sie von einem niedrigen Level kommen, ist es ziemlich einfach zu sehen, was versteckt wurde , aber wenn Sie mit XNA angefangen haben, ist es schwieriger zu sehen, was fehlt (und somit wie hoch Sie sind).
September
(Ich habe die Frage etwas präziser bearbeitet.) @The Communist Duck, danke, ich finde diesen Thread hilfreich - insbesondere Ihre letzte Einstellung zu Game Seperated From The Engine zeigt meiner Meinung nach sehr gut, was eine Engine wirklich ist.
8.

Antworten:

0

Ich denke, die Frage wäre besser zu beantworten, wenn Sie sie umkehren würden. Wie genau funktioniert eine Grafikkarte und welche Anrufe werden von DirectX oder OpenGL getätigt, um diese Funktionen zu nutzen?

Dies würde Ihre Frage per se nicht beantworten, aber da DirectX und OpenGL viele übergeordnete Klassen hinzufügen, um die Dinge für Sie zu vereinfachen, glaube ich, dass der Unterschied zu vage ist, was beispielsweise XNA bietet.

Für die Grundlagen finden Sie Ähnlichkeiten in DirectX / XNA-Aufrufen, da auf einer bestimmten (niedrigeren) Ebene die Dinge nicht mehr abstrakt sein können und die Anrufe von Ihnen selbst getätigt werden müssen.

Also würde ich sagen, erstellen Sie eine einfache Rendering-Engine in OpenGL (ich würde sagen, zugänglicher, um eine niedrigere Ebene zu erreichen) und sehen Sie, wohin Sie das führt!

Jonathan Connell
quelle
Es ist schwierig, Antworten zu finden, wenn der Konsens zwischen allen im Wesentlichen darin besteht, dass die Frage keine hat, aber dies ist im Wesentlichen das, was ich tun werde, da ich denke, dass der einzige Weg, den Unterschied zu verstehen, darin besteht, mit SlimDX oder OpenTK zu spielen (obwohl ich es bin) begann mit Assembly Ich war so verwöhnt von C # Ich glaube nicht, dass ich jetzt noch auf den GC verzichten werde;)) und es aus erster Hand sehen.
September
1

Ein Framework bietet im Wesentlichen eine API. Oft werden dazu andere APIs verwendet oder umbrochen. Die beiden Begriffe sind nicht unbedingt unterschiedlich, es gibt keinen klaren Unterschied im Umfang und es ist nicht wirklich wichtig, dass Sie den Unterschied erkennen können. Wichtig ist, dass Sie wissen, auf welcher Abstraktionsebene eine bestimmte API, Bibliothek, ein Framework, eine Engine, eine Plattform oder Paket arbeitet bei. Dies herauszufinden, ist leider von Fall zu Fall unterschiedlich.

Kylotan
quelle
0

Das Framework beginnt ... wo die API endet. Die API besteht aus einer begrenzten Anzahl von Funktionen / Klassen / was auch immer Sie verwenden können, und das Framework fasst nur all diese Dinge zusammen.

Wenn du fragst, wie viel Zeug geht auf in zwischen Ihrem Anruf zu , was Framework - Funktion verwenden Sie, was auch immer API - Methode ihrer Berufung zu bekommen, das ist wirklich nicht beantwortbar im allgemeinen Fall ist. Einige Dinge sind einfach, andere sind wirklich abstrahiert und verbergen möglicherweise Dinge, über die es nützlich wäre, Bescheid zu wissen (weshalb ich davon ausgehe, dass Sie diese Frage stellen).

Speziell für XNA können Sie den Code wahrscheinlich mithilfe eines Tools wie ILSpy anzeigen , um die XNA-DLLs aufzubrechen und zu sehen, was unter der Haube vor sich geht.

Tetrad
quelle
Ich habe mir die DrawIndexedPrimitives-Methode mit .NET Reflector angesehen und sie war in vielerlei Hinsicht hilfreich, in anderen jedoch unvollständig. Einerseits glaube ich nicht, dass Navigations-DX-Programmierer Geometrie zeichnen, indem sie einen Zeiger auf ein Gerät erhalten, durch eine fest codierte Konstante in dieses versetzen, um einen Funktionszeiger abzurufen, und dies dann aufrufen (zumindest hoffe ich wirklich nicht !: -O ). Auf der anderen Seite scheint es, dass die DrawUserPrimitives-Funktion zumindest für diese Funktion nur ein Wrapper mit viel Fehlerprüfung ist und XNA nichts darüber hinaus tut.
8.
Ich glaube, ich habe falsch eingeschätzt, wie unterschiedlich der Umfang der von mir aufgelisteten Beispiele ist, und wie Sie und Kylotan sagen, besteht die einzige Möglichkeit darin, eine verwaltete API zu erlernen.
8.
2
Die fest codierte Konstante zum Abrufen des Funktionszeigers ist ein Ergebnis der Dekompilierung von C ++ / CLI. Wenn Sie eine C ++ / CLI-Konsolen-App schreiben und auf die native Direct3D-API verweisen und etwas wie 'pDirect3DDevice-> EndScene ();' Es wird in das dekompiliert, was Sie in Reflector als C # gesehen haben (oder ähnliches). Ich glaube, dass viel XNA in C ++ / CLI geschrieben ist, nicht in C #.
Jeffora
@jeffora, das macht mehr Sinn. Führt der .NET Reflector selbst die Dekompilierung bei Bedarf beim Öffnen einer Bibliothek durch?
September
RedGates Reflector ordnet IL im Wesentlichen seinem verwalteten Sprachäquivalent zu. Sie werden feststellen, dass Sie die Sprache ändern und sogar nur die IL anzeigen können. Der angezeigte Quellcode stimmt nicht immer mit der Eingabe überein - er dekompiliert genau, was der Compiler generiert hat. Der C # -Code aus Teilen von dekompiliertem XNA wird nicht einmal kompiliert, wenn Sie versuchen, ihn selbst zu schreiben (in C #)
jeffora