Quels problèmes peuvent survenir si vous utilisez à la fois l'API MonoGame et l'API graphique sous-jacente?

10

Quels types de problèmes pourrait-on rencontrer s'ils faisaient un jeu avec MonoGame et commençaient également à appeler l'API graphique sous-jacente?

Par exemple, si je voulais faire quelque chose dans un projet MonoGame que MonoGame ne supportait pas nécessairement, ou je ne pouvais tout simplement pas trouver la documentation / l'exemple approprié mais je pouvais trouver un exemple de la façon de le faire dans OpenTK, suis-je me mettre en place pour des problèmes si je l'implémente en utilisant OpenTK directement tout en utilisant l'API MonoGame partout ailleurs? Plus précisément, je cherche à savoir s'il existe des problèmes importants qui pourraient en résulter et non quelque chose d'obscur qui se produirait dans de très rares cas.

J'ai essayé de faire un peu de recherche via Google et le site GD.SE lui-même et je n'ai pas trouvé grand-chose. Peut-être que MonoGame a vraiment couvert la plupart de ses bases, mais que faire si je voulais manuellement contourner l'un de ses problèmes en suspens ou une fonctionnalité qui n'est pas encore implémentée?

Dans l'affirmative, quels types de problèmes pourraient survenir et existe-t-il des moyens d'aider à atténuer ces problèmes?

SpartanDonut
la source

Réponses:

12

Dans la plupart des cas, ces problèmes entrent dans la catégorie des "comportements indéfinis" (pas au sens C ++, mais dans une compréhension plus large).

Ce que vous feriez serait de contourner essentiellement l'abstraction fournie par MonoGame (à titre d'exemple, cela s'applique bien sûr à n'importe quelle API de niveau supérieur). Ce faisant, vous pouvez provoquer une violation des garanties invariantes de classe, ce qui signifie que les hypothèses sous lesquelles les auteurs de MonoGame ont pu écrire leur code peuvent ne plus être vraies et que le code peut se comporter de manière inattendue. Votre propre code ne peut plus vraiment compter sur les garanties invariantes de l'abstraction, puisque vous les avez brisées.

Ce comportement inattendu comprendra potentiellement toute la gamme de ces comportements, du simple artefact de rendu aux plantages ou à la corruption de mémoire.

  • Par exemple, si vous manipulez certains états de l'API de rendu en exécutant autour de MonoGame lui-même, il peut ne pas être en mesure de détecter ce changement d'état (car il ne sondera probablement pas l'API sous-jacente pour les changements, il est plus efficace pour lui de simplement supposons que c'est celui qui contrôle l'API et suivez ces changements lui-même). Par conséquent, il peut décider, lors de la prochaine passe de rendu, qu'il n'a pas besoin de mettre à jour quelque chose qui devrait en fait être mis à jour et que votre scène peut ne pas s'afficher correctement.

  • Ou vous pouvez jouer avec l'API sous-jacente et modifier le nombre de références de certains objets de périphérique (en supposant D3D), ce qui signifie qu'il peut être libéré prématurément sous MonoGame ou accidentellement non libéré, entraînant un plantage probable ou une fuite de ressources.

  • Ou vous pourriez faire quelque chose qui fonctionne, mais parce que vous vous trompez d'une manière non prise en charge et avec des fonctionnalités non documentées ou des modèles d'accès inattendus, vous pourriez trouver votre code horriblement cassé dans la prochaine version.

  • Ou vous pouvez faire quelque chose, cela fonctionne bien pour quelques versions, mais plus tard vous rencontrez un autre bug et avez du mal à le localiser, alors vous demandez de l'aide aux gens de MonoGame, peut-être en envoyant un rapport de bug parce que vous êtes sûr que son un problème dans leur code. Ils ne peuvent pas reproduire le bogue, bien sûr, et il apparaît finalement que vous faites ce piratage à accès direct bizarre et à ce stade - indépendamment du fait que votre piratage soit la cause racine du bogue - ils Je vais probablement arrêter de dépenser des ressources pour votre correctif simplement parce que vous faites une chose non prise en charge (ou du moins, ils vous donneront probablement un ordre de priorité).

Bien sûr, dans certains cas , vous pourriez absolument avoir à contourner l'API, peut - être au travail autour d' un bogue dans le logiciel d' expédition pour lequel le patch officiel ne sera pas libéré dans le temps. Si vous absolument devez faire cela, vous devez prendre l'approche douce: essayer de champ votre accès direct aussi étroitement que possible, et vous faire vous essayez de sortir de l'état de l'API sous - jacente inchangée que possible lorsque vous avez terminé votre ingérence . Ce n'est pas une garantie de succès, mais cela peut aider.

Idéalement, vous éviterez complètement ce genre de chose.


la source
3

Je suis entièrement d'accord avec la réponse de Josh mais j'aimerais ajouter quelques réflexions.

Le but de MonoGame est d'apporter l'API XNA à de nombreuses plateformes. Si vous utilisez directement OpenTK, vous vous limitez uniquement aux plates-formes qui le prennent en charge. Par conséquent, vous pourriez perdre l'un des principaux avantages de l'utilisation de l'abstraction.

Si vous souhaitez faire quelque chose que MonoGame ne prend pas en charge ou avez des difficultés à trouver la documentation, posez d'abord la question plus précise de ce que vous essayez de faire. Vous constaterez peut-être qu'il existe déjà un moyen de le faire ou peut-être qu'il s'agit d'une fonctionnalité planifiée qui n'a pas encore été implémentée.

Après en avoir discuté, il se peut que vous, ou quelqu'un d'autre, puissiez implémenter les fonctionnalités manquantes dans MonoGame pour le bénéfice de tous.

jeux d'artisanat
la source
3

En ce qui concerne la manière d'atténuer les problèmes liés à la combinaison de ces deux idées:

MonoGame est open source, modifiez-le directement et vous n'avez pas à vous soucier des problèmes liés à l'utilisation des deux.

Si vous pensez que vous avez besoin de quelque chose de plus, alors certainement: créez une fourchette. Utilisez ce code de base et ajoutez le vôtre par-dessus. Recompilez MonoGame et c'est parti. Cela vous permettrait également de mettre à jour la fourche MonoGame lorsqu'elle est mise à jour (bien sûr, vous devrez résoudre tout conflit pouvant survenir au cours du processus).

Timotei
la source
Quiconque a voté contre, dites votre raison, afin que je puisse apprendre la prochaine fois si vous pensez que j'ai écrit quelque chose de mal.
Timotei
1
Comment cela répond-il à la question?
1
Eh bien, on pourrait contourner tous les problèmes résultant de la combinaison de ces deux (jeu unique + l'API soulignée) en modifiant directement la source du jeu unique (c'est-à-dire en un seul endroit). Veuillez noter sa dernière question: "Dans l'affirmative, quels types de problèmes pourraient survenir et existe-t-il des moyens de les atténuer?"
Timotei
Bon point Timotei, j'ai fait un petit montage pour rendre un peu plus clair ce que tu réponds.
MichaelHouse
J'aime ce point. Je pense qu'il serait vraiment plus logique d'essayer de trouver une place appropriée dans un jeu pour implémenter une fonctionnalité plutôt que de l'implémenter spécifiquement dans votre propre bibliothèque de jeux. Il y a les pièges évidents de ne pas comprendre correctement le jeu unique et de toujours l'implémenter incorrectement, mais c'est un autre problème.
SpartanDonut