云游戏?在ACK上进行Unity远程渲染

简介: 本文介绍了如何在容器中进行unity远程渲染

 背景概要

一直以来,有关云游戏的讨论层出不穷,各个巨头公司也有过很多尝试,像Google的Stadia、微软的Project xCloud、亚马逊的Luna云游戏等。云游戏的核心思想是游戏客户端上云,利用云端的计算能力渲染画面再传输到终端设备上,减轻终端设备压力,实现跨设备平台、轻量级的游戏场景。

各大游戏引擎也在最近几年推出图形渲染流的相关项目,意向解决游戏画面传输问题,比如 Unreal Engine 的 Pixel Streaming,再比如 Unity3d 的 Render Streaming。这类项目的核心都是通过WebRTC(Web Real-Time Communication)实现媒体流的传输。本文旨在借助UnityRenderStreaming 容器化Unity应用,实现画面在云端渲染、然后实时传输至浏览器这样的云游戏场景。

在实践之前,我们先讨论为何要将Unity应用容器化。我们都知道在游戏场景下,图形计算资源的使用时间和玩家游戏时间是同步的,这意味着在理想情况下图形计算应在玩家游戏时提供,离开游戏时回收。容器轻量化的特点使得调度部署都更加灵活,可以满足上述需求,最大程度上增加资源的利用率。

接下来我们来在ACK上进行一个Unity远程渲染的Demo演示

实践演示

1. 使用Unity Editor开发Unity Render Streaming应用

Unity Editor Version: 2021.3.2f1c1 / Mac M1 silicon

新建Project,在Window选项卡中选中Package Manager

 

单击右上角 + 号按钮选择: Add package from git URL

 

输入com.unity.renderstreaming@3.1.0-exp.2,搜索该package,点击Add

 

跳出弹窗,是否使用新的输入方案,单击Yes,项目重启

 

重启后可以看到Unity Render Streaming包已经导入

 

我们直接使用官方Samples,1.19MB的Example 点击Import,Assets表已更新

 

由于是Demo演示,我们不做任何修改,直接Build,选择Target Platform 为 linux,Scenes仅选择WebBrowserInput,单击Build

 

将其命名为mac-linux,得到以下文件

 

除了编译Unity应用以外,我们需要制作对应的Webserver实现浏览器对其的传输访问。这里由于是官方Sample,所以直接下载对应的webserver即可。如图所示,点击Download web app

 

至此,一个能够进行Remote Render Streaming的应用就开发完成。我们得到了一个Unity的可执行文件,以及一个webserver服务应用。有关RenderStreaming更多的实现方式可以参考: https://docs.unity3d.com/Packages/com.unity.renderstreaming@3.1/manual/index.html

2. 容器化Unity应用

在这一步,我们需要容器化unity和其对应的webserver

webserver的容器化和大多web型应用类似,Dockfile如下:

FROM ubuntu:20.04
WORKDIR /run
COPY webserver ./
CMD webserver -w

unity的容器化可以参考文章《ACK上图形应用(GUI Application)容器化最佳实践》,需要注意的是基础镜像的选择,和unity Render Streaming相关依赖包的安装。基础镜像从https://hub.docker.com/r/unityci/editor选择对应的版本,当前例子我选择的是 ubuntu-2021.3.2f1-mac-mono-1.0.1 。为了使例子正常运行,需要额外安装依赖包:vulkan-util 、libc++1 、 libc++abi1 

得到两个镜像后,我们将其部署至ACK集群上。实践环境如下:

  • ACK托管集群,版本为 1.22.3-aliyun.1
  • 节点池操作系统为 Alibaba Cloud Linux 2.1903
  • 实例规格为 ecs.gn6v-c8g1.2xlarge
  • Docker Engine 版本:为 19.3.15

我们将两个容器放在一个pod中,共享网络命名空间,unity demo会与websever 就127.0.0.1:80进行websocket连接,而webserver暴露对应端口,等待浏览器访问,建立该端连接。该pod的yaml如下:

apiVersion: v1
kind: Pod
metadata:
  name: unity-demo
  namespace: default
spec:
  # 由于linux版本的webserver示例在使用web socket时只暴露了127.0.0.1地址,所以在这里pod使用宿主网络,通过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

3. 访问服务,并查看效果

在浏览器端直接访问宿主EIP:80,界面如下:

选择VideoPlayer Sample的模式,来看看效果如何:

通过多次访问发现实时显示效果跟网络环境有很大关系,在网络通畅的情况下基本上没有卡顿的情况出现。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
图形学 异构计算
蓝易云 - Unity下如何实现低延迟的全景RTMP|RTSP流渲染
以上就是在Unity中实现低延迟的全景RTMP/RTSP流渲染的基本步骤。具体的实现可能会根据你的具体需求和所使用的库有所不同。
230 0
|
图形学
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
1064 1
|
API 图形学
[√]unity渲染一个文本的细节
[√]unity渲染一个文本的细节
164 0
|
定位技术 API 图形学
unity-2D游戏官方案例--带视频案例(1)(层级渲染,物理碰撞,粒子动画,UI等多位基础一体化)
unity-2D游戏官方案例--带视频案例(1)(层级渲染,物理碰撞,粒子动画,UI等多位基础一体化)
688 1
|
编解码 图形学 Android开发
Unity3D平台实现全景实时RTMP|RTSP流渲染
好多开发者的使用场景,需要在Windows特别是Android平台实现Unity3D的全景实时视频渲染,本文以Windows平台为例,简单介绍下具体实现: 如果是RTSP或RTMP流数据,实际上难点,主要在于拉取RTSP或RTMP流,解析解码,然后把解码后的YUV数据,回调到Unity层,Unity创建个Sphere,创建个材质球(Material),并把材质球挂在到Sphere即可。
349 0
|
编解码 缓存 图形学
unity中的渲染优化技术
unity中的渲染优化技术
253 0
|
数据采集 编解码 数据处理
Unity下如何实现低延迟的全景RTMP|RTSP流渲染
Unity下如何实现低延迟的全景RTMP|RTSP流渲染
345 0
|
负载均衡 安全 vr&ar
【Unity渲染】一文看懂!Unity通用渲染管线URP介绍
Unity 的渲染管线包含内置渲染管线、SRP、URP和HDRP。自从Unity2019.3开始,Unity将轻量级渲染管线修改为了通用渲染管线,这是一种快速、可扩展的渲染管线,支持所有的移动设备,适用于 2D、3D、虚拟现实 (VR) 和增强现实 (AR) 项目。
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | 使用代码控制 Image图片层级渲染 顺序
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、r美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】 ☀️ | 使用代码控制 Image图片层级渲染 顺序