Welche Probleme können auftreten, wenn Sie sowohl die MonoGame-API als auch die zugrunde liegende Grafik-API verwenden?

10

Auf welche Probleme könnte man stoßen, wenn man ein Spiel mit MonoGame erstellt und auch die zugrunde liegende Grafik-API aufruft?

Wenn ich zum Beispiel etwas in einem MonoGame-Projekt tun wollte, das MonoGame nicht unbedingt unterstützte, oder ich konnte einfach nicht die richtige Dokumentation / das richtige Beispiel dafür finden, aber ich konnte ein Beispiel dafür finden, wie es in OpenTK gemacht wird, oder? Sich auf Probleme einstellen, wenn ich es direkt mit OpenTK implementiere, während ich die MonoGame-API überall sonst verwende? Insbesondere möchte ich herausfinden, ob große Probleme bekannt sind, die daraus resultieren könnten, und nicht etwas Dunkles, das in sehr seltenen Fällen auftreten wird.

Ich habe versucht, ein wenig über Google und die GD.SE-Website selbst zu recherchieren, und konnte nicht viel finden. Vielleicht hat MonoGame die meisten seiner Grundlagen wirklich abgedeckt, aber was wäre, wenn ich eines der noch offenen Probleme oder eine Funktion, die noch nicht implementiert ist, manuell umgehen wollte?

Wenn ja, welche Probleme könnten auftreten, und gibt es Möglichkeiten, diese Probleme zu mindern?

SpartanDonut
quelle

Antworten:

12

In den meisten Fällen fallen diese Probleme in die Kategorie "undefiniertes Verhalten" (nicht im C ++ - Sinne, aber im weiteren Sinne).

Was Sie tun würden, ist im Wesentlichen die von MonoGame bereitgestellte Abstraktion zu umgehen (als Beispiel gilt dies natürlich grundsätzlich für jede solche übergeordnete API). Auf diese Weise können Sie dazu führen, dass klasseninvariante Garantien verletzt werden. Dies bedeutet wiederum, dass die Annahmen, unter denen die MonoGame-Autoren ihren Code schreiben konnten, möglicherweise nicht mehr zutreffen und sich der Code möglicherweise unerwartet verhält. Ihr eigener Code kann sich auch nicht mehr auf die unveränderlichen Garantien der Abstraktion verlassen, da Sie diese gebrochen haben.

Dieses unerwartete Verhalten umfasst möglicherweise die gesamte Bandbreite eines solchen Verhaltens, von einfachen Rendering-Artefakten bis hin zu Abstürzen oder Speicherbeschädigungen.

  • Wenn Sie beispielsweise mit einem Rendering-API-Status herumspielen, indem Sie MonoGame selbst ausführen, kann es diese Statusänderung möglicherweise nicht erkennen (da die zugrunde liegende API wahrscheinlich nicht nach Änderungen abgefragt wird, ist dies effizienter Angenommen, es ist derjenige, der die API steuert, und verfolgen Sie diese Änderungen selbst. Infolgedessen kann es beim nächsten Renderdurchlauf entscheiden, dass nichts aktualisiert werden muss, was tatsächlich aktualisiert werden sollte, und dass Ihre Szene möglicherweise nicht korrekt gerendert wird.

  • Oder Sie könnten mit der zugrunde liegenden API herumspielen und die Referenzanzahl eines Geräteobjekts ändern (unter der Annahme von D3D). Dies bedeutet, dass es unter MonoGame vorzeitig freigegeben oder versehentlich nicht freigegeben wird, was zu einem wahrscheinlichen Absturz oder einem Ressourcenleck führt.

  • Oder Sie könnten etwas tun, das funktioniert, aber weil Sie auf nicht unterstützte Weise und mit undokumentierten Funktionen oder unerwarteten Zugriffsmustern herumspielen, könnte Ihr Code in der nächsten Version schrecklich kaputt sein.

  • Oder Sie könnten etwas tun, es funktioniert gut für einige Versionen, aber später stoßen Sie auf einen anderen Fehler und haben Schwierigkeiten, ihn aufzuspüren. Deshalb bitten Sie die MonoGame-Leute um Hilfe und senden möglicherweise einen Fehlerbericht, weil Sie sicher sind, dass dies der Fall ist ein Problem in ihrem Code. Sie können den Fehler natürlich nicht reproduzieren, und es stellt sich schließlich heraus, dass Sie dieses seltsame Hackery mit direktem Zugriff ausführen und an diesem Punkt - unabhängig davon, ob Ihr Hackery die Hauptursache des Fehlers ist oder nicht - sie Ich werde wahrscheinlich aufhören, Ressourcen für Ihr Update auszugeben, nur weil Sie eine nicht unterstützte Sache tun (oder zumindest werden sie Sie wahrscheinlich weniger priorisieren).

Natürlich, in einigen Fällen könnten Sie unbedingt haben die API zu umgehen, vielleicht zu arbeiten um einen Fehler in der Software - Versand , für die die offiziellen Patch nicht rechtzeitig freigegeben werden. Wenn Sie unbedingt haben , dies zu tun, sollten Sie den weichen Ansatz: Versuch Umfang Ihren direkten Zugang so eng wie möglich, und stellen Sie sicher , dass Sie versuchen , den Zustand des zugrunde liegenden API möglichst unverändert zu lassen , wenn Sie fertig sind mit Ihrem einmischen . Es ist keine Garantie für den Erfolg, aber es kann helfen.

Im Idealfall vermeiden Sie solche Dinge jedoch vollständig.


quelle
3

Ich stimme Joshs Antwort voll und ganz zu, aber ich möchte einige Gedanken hinzufügen.

Der Zweck von MonoGame besteht darin, die XNA-API auf viele Plattformen zu bringen. Wenn Sie OpenTK direkt verwenden, beschränken Sie sich nur auf die Plattformen, die es unterstützen. Daher könnten Sie einen der Hauptvorteile der Verwendung der Abstraktion verlieren.

Wenn Sie etwas tun möchten, das MonoGame nicht unterstützt, oder Probleme beim Auffinden der Dokumentation haben, stellen Sie zunächst die spezifischere Frage, was Sie tun möchten. Möglicherweise gibt es bereits eine Möglichkeit, dies zu tun, oder es handelt sich um eine geplante Funktion, die noch nicht implementiert wurde.

Nach der Diskussion kann es sein, dass Sie oder eine andere Person die fehlenden Funktionen in MonoGame zum Nutzen aller implementieren.

Handwerksspiele
quelle
3

In Bezug darauf, wie die Probleme, die sich aus der Kombination dieser beiden Ideen ergeben, gemindert werden können:

MonoGame ist Open Source, ändern Sie es direkt und Sie müssen sich keine Sorgen über Probleme machen, wenn Sie beide verwenden.

Wenn Sie glauben, dass Sie zusätzliche Dinge benötigen, dann erstellen Sie auf jeden Fall eine Gabel. Verwenden Sie diesen Basiscode und fügen Sie Ihren hinzu. Kompilieren Sie MonoGame neu und los geht's. Auf diese Weise können Sie auch die MonoGame-Gabel aktualisieren, wenn sie aktualisiert wird (natürlich müssen Sie alle Konflikte beheben, die dabei auftreten können).

Timotei
quelle
Wer auch immer abgestimmt hat, bitte geben Sie Ihren Grund an, damit ich beim nächsten Mal erfahren kann, ob Sie das Gefühl haben, dass ich etwas falsch geschrieben habe.
Timotei
1
Wie beantwortet dies die Frage?
1
Nun, man könnte alle Probleme umgehen, die sich aus der Kombination dieser beiden (Monogame + die unterstreichende API) ergeben, indem man die Monogame-Quelle direkt modifiziert (dh an einem einzigen Ort). Bitte beachten Sie seine letzte Frage: "Wenn ja, welche Probleme könnten auftreten, und gibt es Möglichkeiten, diese Probleme zu mindern?"
Timotei
Guter Punkt, Timotei, ich habe eine kleine Änderung vorgenommen, um etwas klarer zu machen, was Sie antworten.
MichaelHouse
Ich mag diesen Punkt. Ich denke, es wäre wirklich sinnvoller, einen geeigneten Platz innerhalb des Monogames zu finden, um ein Feature zu implementieren, als es speziell in Ihrer eigenen Spielbibliothek zu implementieren. Es gibt die offensichtlichen Gefahren, Monogame nicht richtig zu verstehen und es dennoch falsch zu implementieren, aber das ist insgesamt ein anderes Problem.
SpartanDonut