커스텀 엔진을 사용하여 여러 플랫폼에서 어떻게 실행할 수 있습니까?


13

Unity 및 Unreal과 같은 게임 엔진은 다양한 플랫폼에서 실행될 수 있습니다. 그들이 어떻게하는지 궁금합니다.

나는 C ++과 OpenGL을 오랫동안 사용 해 왔으며 찾고있는 것은 다시 작성하지 않고 다른 플랫폼에서 실행할 수있는 것을 통합하는 리소스입니다. 기본 API를 사용하여 코드를 작성한 다음 API가 HTML, Android, iOS 등으로 변환하는 LibGDX와 같은 것. 직접 작성하는 대신 다른 엔진을 사용할 수 있지만 학습 경험에 관심이 있습니다.

답변:


26

엔진을 각 플랫폼에 이식하십시오. 특별한 것은 없습니다. 당신은 몇 가지 코드가있는 경우 윈도우를 전용, 다음 중 하나를 파일에 일부 #ifdef와 로직을 추가하거나 (당신이 가진 것, 그래서 두 번째 파일을 추가 FooWindows.cpp하고 FooLinux.cpp또는 무엇이든) 구현이 다른 OS의 기능 (들)은 당신이에 대한 관심이 있다는 것을 .

Unity 자체는 최종 사용자가 수정하지 않기 때문에 Unity와 같은 엔진에서 한 번의 클릭으로 게시 할 수 있습니다. 스크립트와 데이터를 작성하기 만하면 엔진에 모든 플랫폼에 대해 사전 빌드 된 바이너리가 있으며 게시 버튼은 해당 바이너리를 데이터와 함께 묶습니다.

다른 엔진은 게임 이외의 플랫폼 간 응용 프로그램에서와 마찬가지로 빌드 시스템과 크로스 컴파일러를 사용하여 필요할 때 컴파일 된 게임을 만듭니다.

HTML5와 같은 것에는 JavaScript에서 실행되도록 C ++ 응용 프로그램을 컴파일 할 수있는 emscripten과 같은 도구가 있습니다. 기본적으로 임의의 C ++ 라이브러리 / 기능을 사용할 수 없으므로 엔진의 다른 포트를 emscripten으로 만들어야합니다.

전체 게임을 다시 작성할 필요는 없지만 지원하려는 각 새로운 플랫폼에 대해 많은 개발, 코딩 및 포팅 작업을 수행해야합니다.


14
내 경험에 크로스 플랫폼 소프트웨어 (가장 큰 프로젝트는 핫스팟 것) 당신이 작업을 정말 코드를 통해 발생 ifdefs를하지 않으려. share/os/<linux>(또는 share/cpu/x86)와 같은 것을 가지고 거기에 모든 플랫폼 특정 코드를 넣은 다음 조건부 포함을 수행하는 것이 좋습니다. 그것은 적어도 gcc, HotSpot 및 Linux 커널이하는 일입니다 (확실히 규칙은 아닙니다). 그렇습니다. 플랫폼에 의존하는 하나의 함수로 시작하여 과도하다고 생각하지만 결코 그렇게 유지되지 않으며 그렇지 않으면 빠르게 엉망이됩니다.
Voo

14

여기에 마법의 총알이 없습니다. 게임을 여러 플랫폼에서 실행하려면 여러 플랫폼에 대한 코드를 작성해야합니다 (또는 이미이 작업을 수행하는 타사 라이브러리를 활용해야 함).

당신이 요구하는 것들이 맞지 않습니다 : 당신은 말합니다 (강조 광산)

내가 찾고있는 것은 다시 작성하지 않고 다른 플랫폼에서 실행할 수있는 것을 통합하는 리소스입니다.

뿐만 아니라 (강조 광산)

나는 내 자신을 작성하는 대신 다른 엔진을 사용할 수 있다는 것을 알고 있지만 학습 경험에 관심이 있습니다 .

크로스 플랫폼 지원을 제공하는 타사 라이브러리, 엔진 및 / 또는 툴체인을 사용하거나 크로스 플랫폼 코드를 작성하여 자체 빌드를 선택하십시오 ( 사용 가능한 플랫폼에 대한 자체 추상화 및 각 플랫폼에 해당 추상화를 구현).

이 중 적절한 플랫폼 추상화에 대해 코드를 컴파일 지원, 또는 그들이 플랫폼 별 드라이버 실행 파일에서로드 내부의 API에 대한 라이브러리 또는 DLL 구축 할 필요 언리얼이나 유니티 같은 게임 엔진 들이 적절한에 대한 컴파일을 플랫폼.


2

다른 두 가지 답변 (정확하게 C ++에만 해당)과 달리 다른 방법이 있습니다. 떠오르는 일부 아키텍처 :

  • 엔진 포팅 : 여러 플랫폼에서 작동하도록 코드를 수정하거나 작성하십시오. 이것은 위의 답변에서 해결되었습니다.
  • 크로스 플랫폼 라이브러리 위에 무언가를 작성하십시오. 이것은 Java에서 실행되는 libGDX의 예입니다. Java는 데스크톱, Android 및 iOS (RoboVM을 통해)에서 실행됩니다. Java와 같은 것을 사용하면 기본 라이브러리 / 도구가 지원할 때 무료로 추가 플랫폼을 이용할 수 있습니다. 이 경우 RoboVM이 나왔을 때 libGDX (거의)가 iOS에서 "작동합니다".
  • 코드 생성기 작성 : Haxe 및 기타 도구의 접근 방식입니다. 핵심 언어 (예 : Haxe / AS3)가 있으며 다른 언어의 출력을 생성하는 변환기를 작성합니다. 예 : Haxe는 데스크탑 용 C ++, Android 용 Java (제 생각에) 등으로 변환합니다.

개인적으로 libGDX의 접근 방식이 가장 간단하다는 것을 알게되었습니다. 여러분의 요구에 맞는 언어 나 플랫폼을 찾아서 글을 쓰십시오. 코드 생성 및 휴대용 엔진은 복잡하고 작성하기가 어렵습니다.

libGDX는 주요 휴대 전화, 데스크톱 및 웹 (애플릿 또는 Google 웹 컴파일러를 통해)에 모두 적용되므로 실제로는 훌륭한 선택입니다.


Java 또는 C #을 사용하더라도 크로스 플랫폼 코드를 마술처럼 얻지 못합니다. 플랫폼 종속성이있을 수있는 타사 라이브러리를 계속 인식해야합니다 (예 : SlimDX 또는 SharpDX는 크로스 플랫폼 C # 프로젝트에 적합하지 않음).

@JoshPetrie 자신의 C ++ 엔진을 굴려서 여러 플랫폼으로 포팅하는 것과 비교하여 확실히 "무료"를 많이 얻을 수 있습니다.
ashes999

@ 좀 더 거기에 사전을 사용하여 라이브러리 또는 엔진을 기존보다 도전에 대한이야, ashes999 감사는 대답을, libGDX 내가 그것을 사용합니까 훌륭하지만 난 그것을 크로스 플랫폼이 다음 CMake를 사용하여 작동 있도록 쓰기거야
DanielCollier

2

현재 크로스 플랫폼 게임 엔진을 구축 중입니다. 나는 그래픽 응용 프로그램을 구축하기위한 우수한 (적절하게 낮은 수준의) 크로스 플랫폼 라이브러리 인 SDL을 사용하여 고통을 덜어줍니다.

그러나이 외에도 각 플랫폼에 대한 많은 "사용자 정의 코드"가 있습니다. 이것은 당신이 통과해야합니다. 나는 지금까지 개발 시간의 아주 작은 부분 인 것을 알았습니다. 대부분 기본 Linux만큼 익숙하지 않은 시스템에 대한 문서를 찾는 데 소비했습니다.

#ifdef코드 전체 에서 사용하지 않는 것이 좋습니다 . 대신, 주요 프리미티브에 대한 추상화를 작성하십시오 (이러한 프리미티브의 예는 TCP 소켓 일 수 있음).

환경마다 다른 솔루션이 필요한 새로운 문제가 발생하면 "내가 이미 구축 한 크로스 플랫폼 프리미티브 만 사용하여이 문제를 해결할 수 있습니까?" 대답이 '예'라면 짜잔 간단한 크로스 플랫폼 코드입니다. 그렇지 않으면 누락 된 기본 요소를 찾아서 구현하십시오.


0

학습 경험으로 "처음부터"이 작업을 수행하려면 MSDN 및 OpenGL 위키 ( http : // www) 에서 창 및 OpenGL 컨텍스트 열기에 대한 정보를 찾을 수있는 Win32 API를 사용해야합니다 . .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Linux의 경우 O'Reilly Xlib Programming ManualXlib Reference Manual 의 초침 사본을 구하고 GLX (OpenGL Extension to X Window System)를 읽어보십시오. http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX) 참조

그런 다음 동일한 작업 (예 : 창 열기)을 수행하지만 각 플랫폼마다 다른 구현을 갖는 함수를 사용하여 동일한 API를 애플리케이션에 제공하면됩니다. 다른 플랫폼에 맞게 엔진의 일부를 다시 작성합니다. 그런 다음 엔진을 사용하여 작성하는 게임은 한 번만 작성하면되지만 다른 플랫폼에서 작동합니다.


답변에 감사드립니다.하지만 SDL2를 창, 크로스 플랫폼 및 사용하기 매우 쉽습니다. LibGDX가 창에 LWJGL을 사용하는 방법
DanielCollier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.