Какие проблемы могут возникнуть, если вы используете как MonoGame API, так и базовый графический API?

10

С какими проблемами можно столкнуться, если они делают игру с MonoGame и начинают делать вызовы и для основного графического API?

Например, если я хотел сделать что-то в проекте MonoGame, который MonoGame не обязательно поддерживал, или я просто не смог найти соответствующую документацию / пример, но я мог бы найти пример того, как это сделать в OpenTK, готовится ли я к неприятностям, если я реализую его с помощью OpenTK напрямую, а везде использую API MonoGame? В частности, я хочу выяснить, есть ли какие-либо известные проблемы, которые могут привести к этому, а не что-то неясное, что произойдет в очень редких случаях.

Я попытался сделать небольшое исследование через Google и сам сайт GD.SE, и я не мог найти много. Может быть, MonoGame действительно охватил большую часть своих баз, но что, если бы я хотел вручную обойти одну из ее нерешенных проблем или функцию, которая еще не реализована?

Если да, какие проблемы могут возникнуть, и есть ли способы помочь смягчить эти проблемы?

SpartanDonut
источник

Ответы:

12

В большинстве случаев эти проблемы попадают в категорию «неопределенного поведения» (не в смысле C ++, а в более широком понимании).

То, что вы будете делать, - это, по сути, обойти абстракцию, предоставляемую MonoGame (например, это, конечно, относится в основном к любому такому высокоуровневому API). При этом вы можете нарушить гарантии инварианта класса, что, в свою очередь, означает, что предположения, под которыми авторы MonoGame могли писать свой код, могут больше не соответствовать действительности, и код может вести себя неожиданно. Ваш собственный код больше не может полагаться на инвариантные гарантии абстракции, поскольку вы их нарушили.

Это неожиданное поведение может включать в себя весь спектр такого поведения от простых артефактов рендеринга до сбоев или повреждения памяти.

  • Например, если вы возитесь с некоторым состоянием API рендеринга, выполняя в конечном итоге обход самого MonoGame, он может оказаться не в состоянии обнаружить это изменение состояния (поскольку он, вероятно, не будет опрашивать базовый API на предмет изменений, для него более эффективно просто предположим, что это тот, кто контролирует API и сам отслеживает эти изменения). Следовательно, при следующем проходе рендеринга он может решить, что ему не нужно обновлять что-то, что на самом деле должно быть обновлено, и ваша сцена может отображаться некорректно.

  • Или вы можете связываться с базовым API и изменять счетчик ссылок какого-либо объекта устройства (при условии D3D), что означает, что он может быть преждевременно освобожден из-под MonoGame или случайно не выпущен, что приведет к вероятной аварии или утечке ресурсов.

  • Или вы могли бы сделать что-то, что работает, но поскольку вы копаетесь в неподдерживаемой манере и с недокументированными функциями или неожиданными шаблонами доступа, вы можете обнаружить, что ваш код ужасно сломан в следующем выпуске.

  • Или вы могли бы что-то сделать, это хорошо работает для нескольких версий, но позже вы столкнетесь с какой-то другой ошибкой и столкнетесь с трудностями при ее обнаружении, поэтому вы попросите людей MonoGame о помощи, возможно, отправив отчет об ошибке, потому что вы уверены, что его проблема в их коде. Конечно, они не могут воспроизвести ошибку, и в конце концов выясняется, что вы делаете эту странную хакерскую работу с прямым доступом, и в этот момент - независимо от того, является ли ваша хакерская атака основной причиной ошибки - они Вероятно, вы перестанете тратить ресурсы на ваше исправление просто потому, что вы делаете неподдерживаемую вещь (или, по крайней мере, они, скорее всего, прекратят расставлять приоритеты).

Конечно, в некоторых случаях вы можете абсолютно должны обойти API, возможно работать вокруг ошибки в судоходство программного обеспечения , для которых официальный патч не будет выпущен во времени. Если вам абсолютно необходимо это сделать, вам следует придерживаться мягкого подхода: постарайтесь ограничить свой прямой доступ настолько узко, насколько это возможно, и убедитесь, что вы пытаетесь оставить состояние базового API как можно более неизменным, когда закончите свое вмешательство. , Это не гарантия успеха, но это может помочь.

В идеале, вы должны избегать такого рода вещей полностью.


источник
3

Я полностью согласен с ответом Джоша, но я хотел бы добавить некоторые мысли.

Цель MonoGame - представить API-интерфейс XNA для многих платформ. Если вы используете OpenTK напрямую, вы ограничиваете себя только теми платформами, которые его поддерживают. Следовательно, вы можете потерять одно из главных преимуществ использования абстракции.

Если вы обнаружите, что хотите сделать что-то, что не поддерживает MonoGame или не можете найти документацию, сначала задайте более конкретный вопрос о том, что вы пытаетесь сделать. Вы можете обнаружить, что есть способ сделать это уже или, возможно, это запланированная функция, которая еще не была реализована.

После обсуждения этого вопроса может оказаться, что вы или кто-то другой могли бы реализовать отсутствующие функции в MonoGame для всеобщего блага.

craftworkgames
источник
3

Что касается того, как смягчить проблемы, возникающие при объединении этих двух идей:

MonoGame является открытым исходным кодом, измените его напрямую, и вам не нужно беспокоиться о проблемах при использовании обоих.

Если вы думаете, что вам нужны дополнительные вещи, то во что бы то ни стало: создайте форк. Используйте этот базовый код и добавьте свой поверх него. Перекомпилируйте MonoGame и все готово. Это также позволит вам обновлять форк MonoGame при его обновлении (конечно, вам придется исправлять любые конфликты, которые могут возникнуть в процессе).

Timotei
источник
Кто бы ни проголосовал, пожалуйста, укажите вашу причину, чтобы я мог узнать в следующий раз, если вы чувствуете, что я написал что-то не так.
Тимотей
1
Как это отвечает на вопрос?
1
Что ж, можно обойти любые проблемы, возникающие при объединении этих двух элементов (моногейм + подчеркивающий API), непосредственно изменив источник моногамов (то есть в одном месте). Пожалуйста, обратите внимание на его последний вопрос: «Если это так, какие проблемы могут возникнуть, и есть ли способы помочь смягчить эти проблемы?»
Тимотей
Хороший вопрос Timotei, я сделал небольшое редактирование, чтобы было немного яснее, что вы отвечаете.
MichaelHouse
Мне нравится этот момент. Я думаю, что было бы более разумно попытаться найти подходящее место в моногаме для реализации функции, чем если бы она была реализована специально в вашей собственной игровой библиотеке. Существуют очевидные ловушки, связанные с неправильным пониманием моногамы и ее неправильной реализацией, но это еще одна проблема.
SpartanDonut