MonoGame API와 기본 그래픽 API를 모두 사용하면 어떤 문제가 발생할 수 있습니까?


10

MonoGame으로 게임을하고 기본 그래픽 API를 호출하기 시작하면 어떤 종류의 문제가 발생할 수 있습니까?

예를 들어, MonoGame이 지원하지 않는 MonoGame 프로젝트에서 무언가를하고 싶거나 적절한 문서 / 예제를 찾을 수 없었지만 OpenTK에서 그것을 수행하는 방법에 대한 예제를 찾을 수 있다면 다른 곳에서 MonoGame API를 사용하는 동안 OpenTK를 사용하여 직접 구현하면 문제가 발생합니까? 특히 나는 이것의 결과로 알려진 큰 문제가 있는지, 매우 드문 경우에 발생하는 모호한 문제가 없는지 알고 싶습니다.

Google과 GD.SE 사이트 자체를 통해 약간의 조사를 시도했지만 찾을 수 없었습니다. 아마도 MonoGame이 대부분의 기반을 다루었을 수도 있지만, 아직 해결되지 않은 기능이나 아직 구현되지 않은 기능 중 하나를 수동으로 해결하려면 어떻게해야합니까?

그렇다면 어떤 종류의 문제가 발생할 수 있으며 이러한 문제를 완화 할 수있는 방법이 있습니까?

답변:


12

대부분의 경우 이러한 문제는 "정의되지 않은 동작"(C ++ 의미가 아니라보다 광범위한 이해) 범주에 속합니다.

당신이하고있는 일은 본질적으로 MonoGame에서 제공하는 추상화를 우회하는 것입니다 (예를 들어, 이것은 기본적으로 모든 상위 수준의 API에 적용됩니다). 이렇게하면 클래스 불변 보증이 위반 될 수 있습니다. 이는 MonoGame 작성자가 코드를 작성할 수 있다는 가정이 더 이상 사실이 아니며 코드가 예기치 않게 작동 할 수 있음을 의미합니다. 자신의 코드는 더 이상 추상화의 고정 보증에 의존 할 수 없습니다.

이 예기치 않은 동작에는 단순한 렌더링 아티팩트에서 충돌 또는 메모리 손상에 이르기까지 이러한 동작의 전체 영역이 포함될 수 있습니다.

  • 예를 들어 MonoGame 자체를 끝까지 실행하여 일부 렌더링 API 상태를 사용하는 경우 해당 상태 변경을 감지하지 못할 수 있습니다 (아마도 기본 API에서 변경 사항을 폴링하지 않기 때문에 더 효율적 임) API를 제어하고 변경 사항을 추적하는 것으로 가정합니다). 결과적으로 다음 렌더 패스에서 실제로 업데이트되어야하는 장면을 업데이트 할 필요가없고 장면이 올바르게 렌더링되지 않을 수 있습니다.

  • 또는 기본 API를 망칠 수 있고 일부 장치 객체의 참조 수를 변경 (D3D 가정)하여 MonoGame에서 조기에 릴리스되거나 실수로 릴리스 되지 않아 충돌 또는 리소스 누수가 발생할 수 있습니다.

  • 또는 작동하는 작업을 수행 할 수 있지만 지원되지 않는 방식으로 문서화되지 않은 기능이나 예기치 않은 액세스 패턴으로 인해 다음 릴리스에서 코드가 끔찍하게 손상 될 수 있습니다.

  • 또는 몇 가지 버전에서는 잘 작동하지만 나중에 다른 버그가 발생하여 추적하기가 어려우므로 MonoGame 담당자에게 도움을 요청하십시오. 그들의 코드에 문제가 있습니다. 물론 버그를 재현 할 수 없으며 마침내 해커가 버그의 근본 원인인지 여부에 관계 없이이 이상한 직접 액세스 해커를 수행하고 있으며 그 시점에서 나타납니다. '지원되지 않는 일을하고 있기 때문에 (또는 적어도 우선 순위를 낮출 가능성이 있음) 단순히 수정에 대한 리소스 소비를 중단 할 것입니다.

물론 어떤 경우 에는 공식 패치가 제 시간에 출시되지 않는 소프트웨어 배송 버그를 해결하기 위해 API를 우회 해야 할 수도 있습니다 . 당신이 절대적 경우 범위를 좁게 가능한 한 직접적인 접근을 시도하고 당신이 당신의 간섭으로 완료되면 가능한 한 변화로서 기본이되는 API의 상태를 떠나려 확인 :이 작업을 수행하기 위해, 당신은 부드러운 접근 방식을 취해야한다 . 성공을 보장하는 것은 아니지만 도움이 될 수 있습니다.

이상적으로는 이런 종류의 것을 완전히 피할 수 있습니다.


3

Josh의 답변에 완전히 동의하지만 몇 가지 생각을 추가하고 싶습니다.

MonoGame의 목적은 XNA API를 여러 플랫폼으로 가져 오는 것입니다. OpenTK를 직접 사용하는 경우이를 지원하는 플랫폼으로 제한됩니다. 따라서 추상화 사용의 주요 이점 중 하나를 잃을 수 있습니다.

MonoGame이 지원하지 않는 문서를 찾거나 문서를 찾는 데 어려움이있는 경우 먼저 수행하려는 작업에 대한보다 구체적인 질문을하십시오. 이미 수행 할 수있는 방법이 있거나 아직 구현되지 않은 계획된 기능 일 수 있습니다.

그것을 논의한 후에, 당신이나 다른 누군가가 MonoGame에서 빠진 기능을 모든 사람의 이익을 위해 구현할 수 있습니다.


3

이 두 가지 아이디어를 결합하여 발생하는 문제를 완화하는 방법과 관련하여 :

MonoGame은 오픈 소스이므로 직접 수정하면 두 가지를 모두 사용하여 발생하는 문제에 대해 걱정할 필요가 없습니다.

추가 물건이 필요하다고 생각되면 반드시 포크를 만드십시오. 이 기본 코드를 사용하고 그 위에 코드를 추가하십시오. MonoGame을 다시 컴파일하면됩니다. 또한 업데이트 될 때 MonoGame 포크를 업데이트 할 수도 있습니다 (물론 프로세스에서 발생할 수있는 충돌을 수정해야합니다).


투표를 한 사람은 이유를 말하십시오. 따라서 다음에 내가 잘못 쓴 것을 느끼면 다음에 배울 수 있습니다.
Timotei

1
이 질문에 어떻게 대답합니까?

1
글쎄, 모노 게임 소스를 직접 수정하여 (즉, 한 곳에서)이 두 가지 (모노 게임 + 밑줄 친 API)를 결합하여 발생하는 문제를 피할 수 있습니다. 그의 마지막 질문에 주목하십시오. "그렇다면 어떤 종류의 문제가 발생할 수 있으며 이러한 문제를 완화 할 수있는 방법이 있습니까?"
Timotei

좋은 점 Timotei, 나는 당신의 대답을 조금 더 명확하게하기 위해 작은 편집을했습니다.
MichaelHouse

나는이 점을 좋아한다. 나는 자신의 게임 라이브러리에서 구체적으로 구현하는 것보다 기능을 구현하기 위해 모노 게임 내에서 적절한 장소를 찾으려고 시도하는 것이 더 합리적이라고 생각합니다. 모노 게임을 제대로 이해하지 못하고 여전히 잘못 구현한다는 분명한 함정이 있지만 그것은 또 다른 문제입니다.
SpartanDonut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.