本文介紹如何使用Unity遠程渲染。

背景信息

Unity Render Streaming是Unity開源的一個高質(zhì)量、高復(fù)雜的3D模型在云端渲染,手機端、瀏覽器顯示的解決方案。 基于Unity Render Streaming容器化Unity應(yīng)用,可以實現(xiàn)畫面在云端渲染、然后實時傳輸?shù)綖g覽器的云游戲場景。關(guān)于Unity Render Streaming的更多信息,請參見UnityRenderStreaming

步驟一:使用Unity Editor開發(fā)Unity Render Streaming應(yīng)用

本文以Unity Editor的2021.3.2f1c1/Mac M1 silicon版本為例進行說明。

  1. Unity Editor中單擊Windows > Package Manager,然后在左上角單擊+ > Add package from git URL
  2. 輸入并搜索com.unity.renderstreaming@3.1.0-exp.2,然后單擊Add
  3. 在彈出的對話框單擊Yes,進行項目重啟。
    重啟后,在Package Manager頁面可以看到Unity Render Streaming包已經(jīng)導(dǎo)入。Unity Render Streaming包
  4. Package Manager頁面的Samples區(qū)域下,單擊Import,導(dǎo)入官方的Example。
    本文以導(dǎo)入官方1.19 MB的Example Samples為例。導(dǎo)入后,可以看到Assets目錄已更新。Assets
  5. 在頁面左上方單擊File > Build Settings,配置PlatformWindows, Mac, LinuxTarget PlatformLinuxScenesWebBrowserInput,然后單擊Build,命名為mac-linux
    創(chuàng)建完成后,文件目錄如下圖所示:Build
  6. 在頁面左上角單擊Edit > Render Streaming > Download web app,下載服務(wù)應(yīng)用。
    除了編譯Unity應(yīng)用,您還需要制作對應(yīng)的Webserver實現(xiàn)瀏覽器對渲染畫面的傳輸訪問。本文使用官方的Sample,因此直接下載對應(yīng)的Webserver即可。
    下載完成后,一個能夠進行Remote Render Streaming的應(yīng)用開發(fā)完成,應(yīng)用包含一個Unity的可執(zhí)行文件和一個Webserver服務(wù)應(yīng)用。關(guān)于RenderStreaming更多的實現(xiàn)方式,請參見About Unity Render Streaming

步驟二:容器化應(yīng)用并部署

本次實驗的操作環(huán)境如下:
  • 集群:ACK托管集群,且版本為1.22.3-aliyun.1。
  • 節(jié)點池操作系統(tǒng):Alibaba Cloud Linux 2.1903。
  • 實例規(guī)格:ecs.gn6v-c8g1.2xlarge。
  • Docker Engine:19.3.15。
  1. 容器化Unity應(yīng)用以及對應(yīng)的Webserver。
    1. 容器化Unity應(yīng)用。具體操作,請參見Linux圖形應(yīng)用最佳實踐
      基礎(chǔ)鏡像請選擇對應(yīng)的版本,具體請參見Editor。本文使用ubuntu-2021.3.2f1-mac-mono-1.0.1作為基礎(chǔ)鏡像,在其基礎(chǔ)上安裝依賴包:vulkan-util 、libc++1 、 libc++abi1。
    2. 容器化Webserver。
      Webserver的容器化和大多Web型應(yīng)用類似,Dockfile示例如下:
      FROM ubuntu:20.04
      WORKDIR /run
      COPY webserver ./
      CMD webserver -w
  2. 編寫并部署YAML文件。
    1. 使用以下內(nèi)容,創(chuàng)建unity-demo.yaml文件。
      得到Unity應(yīng)用和Webserver兩個鏡像后,將其部署至ACK集群上,YAML示例如下,請您結(jié)合Linux圖形應(yīng)用最佳實踐編寫實際的YAML文件。
      apiVersion: v1
      kind: Pod
      metadata:
        name: unity-demo
        namespace: default
      spec:
        # 由于Linux版本的Webserver示例在使用Web Socket時只暴露了127.0.0.1地址,因此此處Pod使用宿主機網(wǎng)絡(luò),通過EIP訪問宿主機的方式讓瀏覽器建立WS連接。
        hostNetwork: true
        nodeName: xxx
        containers:
        - image: xxx:xx
          name: unity
          command: ["/run/mac-linux/mac-linux.x86_64"]
          securityContext:
            privileged: true
        - image: xxx:xx
          name: webserver
          ports:
            - containerPort: 80
              protocol: TCP
        restartPolicy: Always
      將兩個容器放在一個Pod中,共享網(wǎng)絡(luò)命名空間,Unity Demo會與Websever通過127.0.0.1:80進行Websocket連接,而Webserver暴露對應(yīng)端口,等待瀏覽器訪問,建立該端連接。
    2. 執(zhí)行以下命令,部署Pod。
      kubectl apply -f unity-demo.yaml

步驟三:訪問服務(wù)并查看遠程渲染效果

在瀏覽器訪問宿主機的EIP:80,然后單擊VideoPlayer Sample,訪問結(jié)果如下:

說明 通過多次訪問發(fā)現(xiàn),實時顯示效果與網(wǎng)絡(luò)環(huán)境有關(guān),在網(wǎng)絡(luò)通暢的情況下基本不出現(xiàn)卡頓的情況。