100 likes | 309 Views
이민웅 참고 ) ShaderX6 8.2. 3D Engine Tools with C++/ CLR. 3D Engine Tools. 엔진은 C++ 로 툴은 C# 으로 개발하고 싶을때 사용 엔진 / 툴 독립적으로 유지 관리 툴 개발시 GUI 부분의 시간 단축 약간의 노가다 작업 필요 서버와 클라이언트 같은 작업 필요. CLR. CLR(Common Language Runtime) 공통 언어 런타임 성능 향상
E N D
이민웅 참고 ) ShaderX6 8.2 3D Engine Tools with C++/CLR
3D Engine Tools • 엔진은 C++로 툴은 C#으로 개발하고 싶을때 사용 • 엔진/툴 독립적으로 유지 관리 • 툴 개발시GUI부분의 시간 단축 • 약간의 노가다 작업 필요 • 서버와 클라이언트 같은 작업 필요
CLR • CLR(Common Language Runtime) 공통 언어 런타임 • 성능 향상 • CLR의 JIT 컴파일러를 통해 만들어진 코드는 unmanaged code에 비해 성능이 우수 • 개체 수명을 관리하는 가비지 수집 • CLR의 장점이라기 보다는 .NET Framework 차원에서 지원하는 장점
C# • .Net Framework 사용 • Java 와 비슷함 • 툴 개발이 쉽다 • GUI 개발이 편리함 • Windows Form • WPF • Xaml방식, DirectX 랜더링, Shader도 사용가능 • C++과 연동하기 위해 CLR를 사용
C++/CLR C++ CLR C# Wrapper
C++과 CLR 코딩 방식 • 포인터의 사용 • C++ : test * temp = new test() • CLR : test^ temp = gcnew temp() • 주소값사용은& -> % • NULL 체크 NULL -> nullptr • 클래스 • C++ : class Test • CLR : public ref class Test
String 변환 • C#은 기본적으로 Unicode만 지원 • Marshal 라이브러리를 사용하여 간단히 C++용으로 변환 • 닷넷 프레임워크 3.0부터 지원 • 3.0이전 버전에는 문제가 많았음 • C# 외부 DLL 링크도 가능 msclr::interop::marshal_contextctx; const char* ch = ctx.marshal_as<const char*> (str); public sealed class DevilAPI { private const string DEVIL_LIBRARY = "Devil.dll"; [DllImport(DEVIL_LIBRARY, CallingConvention = CallingConvention.Winapi), SuppressUnmanagedCodeSecurity] public static extern void ilInit(); }
Wrapper(CLR) • C++의 데이터를 C#에서 사용하기 위해서는 C++에 사용하는 데이터 구조를 C#쪽에 새로 만듬 • 저의 경우는 CLR 부분에서는 C++ <-> C#쪽의 데이터의 변환 부분만 해줌 • 툴 기능 코드들은 CLR과 C#쪽에서 모두 처리 Engine AData Tool ADataInfo Wrapper(CLR) SetAData UpdateAData
Wrapper ※ 이런식의 구조도 될 수 가 있음 참고 ) 툴과 오버 엔지니어링 그리고 벽돌 http://gamedevforever.com/23