2012-11-12 2 views
2

저는 게임 프로젝트에서 일하고 있습니다. 그래서 C#으로 편집기를 개발하고 있습니다. 왜냐하면 C#에서 그것을하는 데 많은 시간이 걸릴 것이기 때문에 효율성을 높이기 위해 편집자의 기본 언어로 C#을 사용하여 결과를 빨리 얻습니다.C#에서 C++ 개체를 만들 수 있습니까?

그러나 C#에서 읽을 수있는 C# 개체를 만드는 C#에서 게임 편집기를 만들거나 C++에서 사용할 수있는 C++ 개체를 만드는 C#의 게임 편집기를 만들 수 있습니까?

이것은 C#이 RAD 환경이므로 Windows 응용 프로그램을 빠르게 개발할 수 있기 때문입니다. C++/DirectX는 아마도 게임을위한 최상의 환경 일 것입니다.

둘 다 .NET Framework의 일부이기 때문에 둘을 결합하는 방법이 있습니까?

+0

[COM 개체] (http://www.csharphelp.com/2006/08/building-com-objects-in-c/)를 찾으십니까? –

+2

엔진이 C++로되어 있어야하는 이유를 알려주십시오.일반 C++은 .NET Framework의 일부가 아닙니다. 관리되는 C++을 참조하면 C#과 동일하지만 C++ 구문을 사용합니다. – LightStriker

+0

편집기에서 게임 엔진에 직접 객체를 전달할 필요는 없다고 생각합니다. 대신 편집기에서 만든 객체를 파일에 저장 한 다음 C++ 코드에서 객체를 읽을 수 있어야합니다. 이를 위해서는 JSON 또는 XML이 유용해야합니다. – piokuc

답변

1

C#과 C++ (또는 관리되는 언어와 관리되지 않는 언어) 사이의 통신은 엉덩이의 통증이며 사용하지 않는 것이 좋은 이유가없는 한 피해야합니다.

통신의 경우 파이프, WCF, COM, P/Invoke 및 기타 사용자 정의 상업 옵션을 사용할 수 있습니다. 그물을 검색 할 수 있습니다. 우리가 작업 한 엔진에서 우리는 익명의 MemoryStream을 여러 프로세스에서 공유합니다.

하지만 항상 문제가되는 것은 C++의 모든 구조적 변경에 대해 C#에 반영해야한다는 것입니다. param을 변경하는 경우처럼 메소드가 취하거나 struct의 정의를 취합니다. 자동으로 C#을 C++로 항상 최신 상태로 유지할 수있는 솔루션이 있지만 비용이 많이 들고 구현하기가 무거워요.

이제 왜 신경 써야하지 않습니까? 사실, 당신은 C++이 아닌 다른 곳에서 하이 엔드 상용 엔진을 발견하지 못할 것입니다. 언리얼? C++. 출처? C++. 크라이시스? C++. C++은 관리되는 언어에서 제공 할 수없는 성능을 제공하기 때문에. 또한 객체를 생성하고 지우는 방법에 대한 메모리 및 마이크로 제어를 직접 제어 할 수 있습니다.

왜 신경 쓰지 않아야하나요? Assassin 's Creed, Half-Life 또는 Skyrim의 크기 나 범위를 트리플 A 게임에 제공하려는 계획이 없으면 XNA Framework에서 C#을 사용하면 많은 공간과 성능이 제공됩니다. 당신이 필요로하는 것보다 훨씬 더. 실제로 성능 문제가있는 경우 관리 언어가 문제가되지 않을 가능성이 높으며 수행 할 코드에 여전히 많은 최적화가 있어야합니다. 기회가 C#에서 성능 문제가 있다면, 당신도 C + +에서 그들을 것입니다.

또한 XNA는 Windows, Xbox 및 다른 Microsoft 휴대용 장치에서 출하 할 수있는 기능을 제공합니다. 게다가 DirectX를 사용하면 어쨌든 해당 플랫폼으로 제한됩니다.

+0

C++/CLI는이 모든 것을 수정합니다. 그것은 .NET 유형을 인식하고 C++ 유형을 인식합니다. 이것은 각 (.NET 메타 데이터 및 C++ 헤더 파일)의 기본 설명을 사용합니다. 두 환경을 동기화 상태로 유지하는 추가 작업은 없습니다. Heck, 심지어 "Managed Extensions for C++"(이전 버전, 버그, 현재 지원되지 않으므로 사용하지 않음)가이 문제를 처리했습니다. –

+0

@BenVoigt : 관리되는 C++ 솔루션과 동일한 프로젝트에 관리되지 않는 C++ 솔루션을 넣습니다. 관리되는 C++에서는 번역이 필요없는 관리되지 않는 C++ 객체를 직접 만들 수 있습니까? – LightStriker

+0

예. 당신이하는 일은 언 매니지드 C++ 타입의 헤더 파일을'#include '하고 정적 라이브러리와 링크하는 것뿐입니다. 다른 관리되지 않는 C++ 프로젝트와 마찬가지로 할 수 있습니다. –

0

이전에는 C++/Cli를 사용하여 C++에서 C++ 개체를 만들었습니다. 기본적으로 c/C++ (관리되지 않는) 객체를로드/생성하는 C++ (관리되는) 라이브러리를 만들 수 있습니다. 관리되는 (C#/vb) 라이브러리/응용 프로그램에서이 관리되는 라이브러리를 사용할 수 있습니다.

  • C++/당신의 관리 편집기를 구축 할 필요가 단지 특정 플랫폼에 내장 (86/64) 그렇게 할 수 CLI는 이에 따라
  • 비주얼 스튜디오 2012가 지원하지 않는 인텔리 다음의주의 Microsoft가이 시나리오를 너무 좋아하지 않는 한 C++/cli 용

또한 COM 및 p/invoke는 실행 가능한 대안입니다.

관련 문제