네이티브 클라이언트 개발 시작하기

네이티브 클라이언트(NaCl)는 Google에 의한 신기술로, 사용자가 플러그 인을 설치할 필요 없이 아주 고성능의 웹 앱의 배포를 허용하기 위해 네이티브 실행 코드를 웹페이지에 내장할 수 있게 해 줍니다. 현재, NaCl는 Windows, Mac OS X, Linux에서 Google Chrome에서만 지원하나(Chrome OS 지원은 현재 진행 중), 이 기술은 오픈 소스이며, 장래 다른 브라우저 플랫폼에도 포팅(port) 될 수 있습니다.

. Unity 3.5는 NaCl 을 사용하여 Chrome에서 플러그 인을 설치하지 않고 Unity Web Player 콘텐트(.unity3d files)의 실행을 지원합니다. 이는 아직 초기 릴리스 이나 – 안정적으로 사용할 수 있습니다. 하지만 Unity Web Player에서 지원하는 모든 기능을 지원하는 것은 아니고, NaCI가 진화하는 플랫폼이므로, 브라우저 플러그 인에서 수행할 수 있는 모든 것을 지원하지는 않습니다.

NaCl 상의 게임 구축과 시험

NaCl에서 게임을 구축하고 시험하는 것은 간단합니다. 사용자는 Google Chrome을 설치하여야 합니다. Build Settings에서 "Web Player"을 선택하고, "Enable NaCl" 체크상자를 체크합니다. 이는 생성된 unity3d 파일이 NaCI에서 실행될 수 있게 해 줍니다(NaCl에 필요한 GLSL ES 셰이더(Shaders)를 포함함으로써, 그리고 NaCI 가 지원하지 않는 동적(dynamic) 폰트를 비활성화 함으로써). 그리고 NaCi 런타임과 NaCI에서 게임을 시작할 html 파일을 설치합니다. 사용자가 Build & Run을 클릭하면, Unity는 Chrome에 사용자의 플레이어를 하나의 앱으로 설치하고 자동으로 구동할 것 입니다.

NaCl 포함 게임 출시

현재 상태로는, NaCI는 Chrome에서 기본값으로 일반 웹 페이지를 사용할 수 없습니다. 사용자는 모든 웹 페이지에 NaCI 플레이어를 내장 할 수 있고, chrome://flags에서 사용자가 NaCI를 수동으로 바로 활성화하도록 지시할 수 있지만, NaCI 게임을 출시하여 박스 밖에서 실행하도록 만들 수 있는 유일한 방법은 Chrome Web Store 에 배포하는 것입니다 (이에 대하여 NaCI는 기본적으로 비활성화 상태). Chrome Web Store는 상당히 비제한적이라는 점을 유의하고, 사용자 자신의 웹사이트에 내장된 콘텐트를 호스트 할 수 있게 해 주거나, 혹은 사용자가 원할 경우 사용자 자신의 지불 처리 시스템(payment processing system)을 사용할 수 있게 해 줍니다. 현재의 계획은 이러한 제한을 Google이 휴대용 NaCI(PNaCI)라는 신기술을 완성했을 때 풀 것으로 예상하고 있으며, 이렇게 되면 사용자가 이것을 LLVM bitcode로 실행 코드를 출시할 수 있게 해주어서, NaCl 앱이 특정 CPU 구조와 독립시킬 수 있습니다. 그러면 NaCI는 모든 임의의 웹사이트에서 사용할 수 있게 됩니다.

빌드 크기에 관한 노트

NaCl 빌드를 작성 시, 사용자는 unity_nacl_files_3.x.x 폴더가 100MB 이상으로 매우 크다는 것을 알게 될 것입니다. 이렇게 많은 데이터가 NaCI 콘텐트를 실행할 때 마다 다운로드 되어야 하는지 우려된다면, 그 대답은 일반적으로 "no" 입니다. Chrome Web Store에서 앱을 제공하는 방법은 두 가지가 있는데, 호스트 방식과 패키지 앱 방식입니다. 만일 사용자가 자신의 콘텐트를 패키지 앱으로 제공한다면, 모든 데이터는 압축 아카이브로 다운되고 설치될 것이고, 이 경우 사용자의 디스크에 저장될 것 입니다. 만일 사용자가 자신의 콘텐트를 호스트 앱으로 제공한다면, 데이터는 웹에서 매번 다운로드 될 것입니다. 하지만 NaCl 런타임은 unity_nacl_files_3.x.x 폴더에서 관련 아키텍처(i686 or x86_64)만 다운로드 할 것이며, 웹 서버가 올바로 설정되었다면, 이 데이터는 전송 시 압축될 것이고, 그리하여 실제로 전송되는 데이터의 양은 약 10MB (물리 스트리핑(stripping)이 사용될 경우 그 이하)정도일 것 입니다. unity_nacl_files_3.x.x 폴더는 전송 시 데이터를 압축하기 위하여 Apache를 설정하는 하나의 .htaccess 파일을 포함하고 있습니다. 만일 사용자가 다른 웹 서버를 사용할 경우, 사용자는 이를 스스로 설정해야 할 수 있습니다.

NaCl의 한계점

NaCl는 일반적인 Unity Web Player에 있는 모든 기능을 아직 지원하지는 않습니다. 여기에 대한 많은 지원은 Chrome과 Unity의 미래 버전에 포함될 것 입니다. 현재 NaCI는 다음과 같은 기능은 지원하지 않습니다:

  • Webcam Textures
  • Joystick Input
  • Caching
  • Dynamic Fonts
  • WWW 클래스 이외 다른 종류의 네트워크.
  • Profiler는 편집기로의 네트워크 연결이 필요하므로 작동하지 않습니다.
  • 표준 웹 플레이어 플러그 인과 마찬가지고, NaCl 는 네이티브 C/C++ 플러그 인을 지원하지 않습니다.

다음 기능은 지원하지만, 일부 한계점이 존재합니다:

  • 깊이 텍스처(Depth textures):

→ 깊이 텍스처는 실시간 그림자와 다른 효과에 필요합니다. 깊이 텍스처는 Unity NaCl에서 지원되나, Chrome's OpenGL ES 2.0 구현은 Windows에 필요한 확장(extensions)을 지원하지 않습니다. 그러므로 깊이 텍스처는 OS X 와 Linux에서만 동작합니다.

  • 다른 그래픽 기능들:

→ NaCl는 OpenGL ES 2.0을 사용하고, 이는 일반 OpenGL에 포함된 모든 확장을 지원하지는 않습니다. 이는 선형 및 HDR 라이팅과 같이 확장에 의존하는 일부 기능은 현재 NaCI에서 동작하지 못함을 의미합니다. 또한 셰이더(Shadrs)도 GLSL 셰이더로 컴파일 될 수 있어야 하며, 모든 내장된 Unity 셰이더가 이를 지원하지는 않습니다. 예를 들어, Screen Space Ambient Occlusion은 GLSL에서는 지원하지 않습니다.

  • 커서 잠그기(Cursor locking):

→ 커서 잠그기는 지원하지만, 풀 스크린 모드에서만 지원됩니다. 윈도우 된(windowed) 모드에서의 커서 잠금은 장래의 Chrome 출시에서 지원할 계획입니다.

  • NullReferenceExceptions:

→ NaCI는 하드웨어 에러 처리(exception handling)은 지원하지 않습니다. 이는 스크립트 코드에서 NullReferenceException이 발생하면 NaCI가 중단(crash) 한다는 것을 의미합니다. 하지만, 사용자는 softexceptions="1"을 내장 매개변수(embed parameters)로 전달하여 (개발 플레이어를 빌드 할 때 자동으로 Unity에 의해 설정), mono로 하여금 소프트웨어에서 NullReferences에 대한 확인을 수행해 줄 것을 요청할 수 있으며, 이렇게 하면 스크립트의 수행은 느려지나 crash는 발생하지 않습니다.

Google은 Mac에서 OS X 10.6.7 이상의 사양 이외는 NaCI에 대한 어떠한 시스템 요구사항도 제시하지 않고 있지만, 우리가 본 바로는 옛날 시스템에는 잘 작동하지 않으며 – 특히 시스템이 오래된 GPU나 그래픽 드라이버 혹은 저용량의 메모리가 있을 경우에 그러합니다. 만일 사용자가 오래된 하드웨어를 대상으로 개발한다면, Web Player가 더 나은 결과를 제공하는 것을 볼 수 있을 것 입니다.

풀 스크린 모드:

풀 스크린 모드는 Screen.fullScreen을 설정하여 지원하나, 사용자가 마우스 버튼을 놓은 프레임에서만 풀 스크린 모드를 입력할 수 있습니다. NaCI는 실제적으로 하드웨어 해상도를 변경하지는 않으며, 이러한 이유로 Screen.fullScreen은 현재 데스크탑의 해상도만을 결과값으로 보여주는 것 입니다. 하지만, Chrome은 더 작은 버퍼로 랜더링 수행을 지원하고, 화면이 느려지면 이 규모를 상향합니다. 그러므로, 풀 스크린 모드에서는 일반적으로 데스크 탑 해상도보다 저 사양을 요구하지만, 스크린 모드를 바꾸는 대신 CPU 에 따른 사양변경을 합니다.

WWW 클래스:

NaCI는 WWW 클래스를 지원하지만, Unity Web Player와는 다른 보안정책을 따릅니다. Unity Web Player가 플래시와 유사하게 crossdomain.xml 정책파일을 사용하는 반면, Unity NaCI는 here에 기록되고 NaCI가 따르는 근원지간 보안 모델(the cross-origin security model)을 따라야 합니다. 기본적으로, 해당 플레이어가 호스트 하는 도메인과 다른 도메인 상에 있는 html 문서를 접근하려면, 사용자는 웹 서버의가 요청 시 헤더(header)에 Access-Control-Allow-Origin을 보내어 해당 플레이어가 그 도메인을 호스트 할 수 있도록 설정해야 합니다.

NaCl에서 브라우저 javascript와의 통신

JavaScript을 사용하여 웹 페이지와의 대화는 지원되며, 한 가지만 제외하고 using the Unity Web Player와 매우 유사합니다: html javascript 에서 Unity로 메시지를 보내는 문법(syntax)이 다르며, 그 이유는 그것이 NaCI 모듈을 통과해야 하기 때문입니다. 사용자가 기본적은 Unity가 생성한 html을 사용할 경우, 이 코드는 동작할 것 입니다:

document.getElementById('UnityEmbed').postMessage("GameObject.Message(parameter");

기록하기(Logging)

NaCl는 사용자 파일 시스템으로 접근을 허락하지 않기 때문에 로그 파일을 작성하지 않을 것 입니다. 대신 모든 로그를 stdout으로 보냅니다. NaCI로부터 플레이어 로그를 보려면:

  • 편집기에서 Build & Run을 한번 수행하여 사용자가 Chrome에 앱 으로 게임을 설치했는지 확인하기 바랍니다.
  • Mac OS X에서 Chrome을 Terminal로 시작하고, 그 아이콘 위를 클릭하여 앱을 시작합니다. Unity 플레이어가 로그를 터미널로 출력하는 것이 보일 것 입니다.
  • Windows에서도 마찬가지이나, NACL_EXE_STDOUT 과 NACL_EXE_STDERR 환경 변수를 설정해야 하고, Chrome을 –no-sandbox 옵션으로 시작해야 합니다. Google의 documentation을 참조하십시오.

역링크