一、宿主机软硬件要求
主要需要关注两部分:对像素流的支持、对linux容器的支持。
1、像素流要求:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-pixel-streaming-reference?application_version=5.3
2、linux容器要求:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/hardware-and-software-requirements-for-container-deployments-in-unreal-engine?application_version=5.3
3、虚幻容器相关文档:
Quickstart Guide | Unreal Containers
这个文档建议好好阅读,在开始之前及过程中都很有帮助。
二、环境及镜像准备
我的流程是在windows上进行像素流工程的业务开发并进行交叉编译进行linux平台构建,基于官方提供的像素流运行时基础镜像进行业务镜像的构建。后续的描述都基于这个流程。
PS:还有一个流程是基于linux平台开发并基于开发镜像进行构建,上述第三个文档有此流程介绍。
1、英伟达容器工具包
https://unrealcontainers.com/docs/concepts/nvidia-docker
容器使用英伟达显卡进行视频编解码加速的必备工具包,在宿主机上安装即可,无需在容器中安装。
2、UE像素流工程进行linux平台构建
需要先下载交叉编译工具链:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/cross-compiling-for-linux?application_version=4.27
3、在宿主机上下载对应版本的像素流工程基础镜像
需要先将git账号关联epic账号,然后在git个人信息-设置-开发者设置-获取个人令牌
有了令牌才可以进行镜像的拉取。
echo后是令牌,-u后是git账号。这一步是在使用git进行登录,以获得ghcr.io仓库的访问权限,否则后续的镜像拉取无法成功。
(1)拉取UE像素流工程运行时基础镜像
docker pull ghcr.io/epicgames/unreal-engine:runtime-pixel-streaming
像素流工程运行时基础镜像不区分版本,任何版本的引擎工程打包出来的linux包都可以基于这个镜像进行业务镜像构建。
(2)拉取信令及web服务运行时镜像
docker pull ghcr.io/epicgames/pixel-streaming-signalling-server:4.27
信令及web服务运行时镜像需要注意版本,要和业务镜像使用的引擎工程版本一致。
4、业务镜像制作
将构建好的Linux包上传到宿主机,在同级目录下编写dockerfile:
FROM ghcr.io/epicgames/unreal-engine:runtime-pixel-streaming
# 将linux文件拷贝到/app/ue下
COPY Linux /app/ue
# 设置权限
#RUN chmod -R 755 /app/ue
#需要root权限才能赋予.sh文件执行权限
USER root
RUN chmod +x /app/ue/linuxTest.sh
#官方设定,需要切换回ue4用户才能启动容器
USER ue4
# 设置入口点
ENTRYPOINT ["/app/ue/linuxTest.sh"]
执行构建命令:
三、部署
1、因为需要对几个服务进行依赖及先后启动关系管理,官方推荐使用docker-compose
(1)安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(2)修改docker-compose文件
UE引擎的安装路径下有官方提供的docker-compose文件及dockerfile文件示例:
\Engine\Extras\Containers\Examples\PixelStreaming\
我的像素流docker-compose如下(也可以直接用启动命令,注意启动参数):
services:
# The Pixel Streaming demo project
project:
image: "ue4"
build:
context: ./
args:
RELEASE: "${UNREAL_ENGINE_RELEASE}"
network_mode: "host"
command: ["-RenderOffscreen", "-AudioMixer", "-Windowed", "-ForceRes", "-ResX=1920", "-ResY=1080", "-PixelStreamingIP=10.1.124.15", "-PixelStreamingPort=8888", "-StdOut", "-FullStdOutLogOutput"]
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
信令及web服务docker-compose(注意端口映射):
version: '3.5'
services:
signalling:
image: "ghcr.io/epicgames/pixel-streaming-signalling-server:4.27.2"
# network_mode: "host"
ports:
- "0.0.0.0:8888:8888/udp"
- "0.0.0.0:8888:8888/tcp"
- "0.0.0.0:80:80"
分别启动两个服务后,可以从服务端看到有用户加入,通过IP+Web端口可以访问像素流应用。
因为对docker和容器那套也是一无所知,完全从0摸索的,过程中踩了不少坑,有问题欢迎交流。