由于公司目前只有一臺(tái)圖形渲染服務(wù)器是linux系統(tǒng)的,現(xiàn)在需要運(yùn)行一個(gè)UE4的像素流程序圣拄,但是Epic官方說明并不支持linux系統(tǒng)媚污,然后就看到了這片文章
https://adamrehn.com/articles/pixel-streaming-in-linux-containers/
一個(gè)第三方做的支持linux系統(tǒng)像素流的兼容富纸,使用的是docker來打包鏡像方式解決環(huán)境的問題,由于該文檔很多東西說的不是特別詳細(xì)近弟,我也摸索了很久才弄好,目前它只支持4.23.1版本的UE4挺智,所以這里也是按照4.23.1版本來做祷愉。
整個(gè)過程非常的漫長,需要有耐心。
關(guān)于UE4像素流原理
由于移動(dòng)設(shè)備二鳄,或者我們家庭電腦都可能在配置上無法支撐渲染UE4這么龐大的工程迫摔,所以官方提供做法是在服務(wù)器上進(jìn)行運(yùn)行UE4工程進(jìn)行圖形渲染,并轉(zhuǎn)化成視頻流的方式泥从,然后把視頻流傳輸?shù)揭苿?dòng)設(shè)備上觀看句占,并且支持互動(dòng)操作并反饋到服務(wù)器,然后服務(wù)器在做模型上的變化反饋躯嫉。道理大概就是這樣的纱烘。
如上圖所示,運(yùn)行像素流主要需要三個(gè)部分:
- UE4主程序祈餐,也就是3D模型了
- WebRTC代理服務(wù)擂啥,主要是用于觀看設(shè)備端直接建立p2p連接來進(jìn)行傳輸像素流數(shù)據(jù) ;
- Signaling and WebServer帆阳,這個(gè)就是web服務(wù)器了哺壶,主要是提供http接口,設(shè)備端先通過web服務(wù)器的接口來訪問WebRTC服務(wù)器蜒谤,然后建立p2p連接山宾。
環(huán)境說明
下面是我的環(huán)境,僅做參考鳍徽。
系統(tǒng):我使用的是物理機(jī)安裝的Centos7.4版本系統(tǒng)
CPU:i9第10代
顯卡: RTX3090, 獨(dú)立顯卡肯定是必須的了资锰,而且根據(jù)文檔提示,必須是N卡的
內(nèi)存:32G
硬盤:500G阶祭, 最少得有這個(gè)大小绷杜,越大越好,安裝完之后大概會(huì)使用180G左右濒募,不包含你后續(xù)打包自己的工程
PS:
linux系統(tǒng)的/boot目錄最好是400M以上
NVIDIA 驅(qū)動(dòng)安裝
在所有操作之前先保證顯卡驅(qū)動(dòng)的安裝并能正常工作
//安裝依賴
yum install kernel-devel gcc -y
//檢查內(nèi)核版本和源碼版本鞭盟,保證一致
ls /boot | grep vmlinu
rpm -aq | grep kernel-devel
//屏蔽系統(tǒng)自帶的nouveau
查看命令:
lsmod | grep nouveau
//修改dist-blacklist.conf文件:
vim /lib/modprobe.d/dist-blacklist.conf
//將nvidiafb注釋掉:
#blacklist nvidiafb
//然后添加以下語句:
blacklist nouveau
options nouveau modeset=0
//重建initramfs image步驟
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)
//修改運(yùn)行級(jí)別為文本模式
systemctl set-default multi-user.target
//重啟系統(tǒng)
reboot
//關(guān)閉boot secure, 啟動(dòng)按F2
根據(jù)不同的UEFI版本,安全啟動(dòng)選項(xiàng)通常在一個(gè)選項(xiàng)卡下瑰剃,這個(gè)選項(xiàng)卡可能被命名為“Boot”齿诉、“Security”或者“Authentication”,在類似的選項(xiàng)卡中查找培他,我們會(huì)發(fā)現(xiàn)一個(gè)“Secure Boot”選項(xiàng)鹃两,該選項(xiàng)默認(rèn)設(shè)置為“Enabled”,選中它并回車舀凛,將其設(shè)置為“Disabled”俊扳,按[Apply]鍵存儲(chǔ)設(shè)置
如果不關(guān)閉待會(huì)安裝的時(shí)候會(huì)有如下提示
The target kernel has CONFIG_MODULE_SIG set,which means that it supports cryptographic signatures on kernel module. On some systems, the kernel may refuse to load modules without a valid signature from a trusted key.This system also UEFI Secure Boot enabled; many distributions enforce module signature verification on UEFI systems when Secure Boot is enabled. Would you like to sign the NVIDIA kernel module?
//下載對應(yīng)的顯卡驅(qū)動(dòng)
https://www.nvidia.cn/Download/index.aspx?lang=cn
//添加執(zhí)行權(quán)限
chmod +x NVIDIA-Linux-x86_64-440.64.run
//開始安裝
./NVIDIA-Linux-x86_64-440.64.run --kernel-source-path=/usr/src/kernels/3.10.0-1062.18.1.el7.x86_64 -k $(uname -r)
安裝的時(shí)候可能會(huì)有如下提示
WARNING: nvidia-installer was forced to guess the X library path '/usr/lib64' and X module path '/usr/lib64/xorg/modules'; these paths were not queryable from the system. If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.
選擇OK,忽略
Nvidia's 32-bit compatibility libraries? 選擇 No 繼續(xù)猛遍。
Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up. 選擇 Yes 繼續(xù)
掛載Nvidia驅(qū)動(dòng):
modprobe nvidia
顯示驅(qū)動(dòng)信息
nvidia-smi
reboot重啟
正常的話就會(huì)顯示如下信息
安裝docker
由于整個(gè)過程都是在docker下編譯鏡像容器的形式來完成的馋记,所有首先需要安裝docker号坡,安裝如下步驟操作即可, 我的服務(wù)器環(huán)境是Centos7.4的,所以我的所有安裝都是使用yum來安裝的梯醒,你可以根據(jù)你的具體環(huán)境來調(diào)整
//安裝依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
使用阿里云鏡像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝最新版本docker
yum install docker-ce docker-ce-cli containerd.io
//啟動(dòng)docker
systemctl start docker
安裝Python3
由于安裝過程依賴python3宽堆,所以有必要安裝一下
//安裝依賴
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
yum install libffi-devel -y
//下載Python安裝包
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
//解壓
tar -zxvf Python-3.7.0.tgz
//編譯安裝
cd Python-3.7.0
./configure
make
make install
//下面是修改一下系統(tǒng)環(huán)境的一些東西,使得系統(tǒng)默認(rèn)使用Python3茸习,但是由于centos系統(tǒng)默認(rèn)是安裝了Python2的畜隶,而且yum使用的也是Python2,所以這里需要做一下兼容修改
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3 /usr/bin/python
mv /usr/bin/pip /usr/bin/pip.bak
ln -s /usr/local/bin/pip3 /usr/bin/pip
vi /usr/libexec/urlgrabber-ext-down
修改第一行:#! /usr/bin/python2.7
vi /usr/bin/yum
修改第一行:#! /usr/bin/python2.7
關(guān)聯(lián)git賬號(hào)和Epic游戲賬號(hào)
這個(gè)是十分重要的号胚,如果你不關(guān)聯(lián)的話籽慢,你是看不到下面這個(gè)git倉庫的:https://github.com/adamrehn/UnrealEngine.git
- 如果你沒有g(shù)it賬號(hào)的話,先注冊git賬號(hào)
- linux服務(wù)器上安裝git客戶端
- 注冊Epic游戲賬號(hào):https://www.unrealengine.com/
-
進(jìn)行g(shù)it賬號(hào)和Epic賬號(hào)關(guān)聯(lián)猫胁, 如下圖所示:
在你賬號(hào)里選擇Personal箱亿,進(jìn)入如下界面
安裝UE4 docker
//安裝
pip3 install ue4-docker
ue4-docker setup
安裝NVIDIA container-toolkit (nvidia-docker)
根據(jù)不同系統(tǒng)可以在這里找到安裝步驟
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
我的Centos7就按照如下安裝即可
//導(dǎo)入GPG指紋信息
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
//安裝
yum clean expire-cache
yum install -y nvidia-docker2
重啟docker
systemctl restart docker
//安裝運(yùn)行cuda容器
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
安裝支持linux的UE4像素流環(huán)境鏡像
ue4-docker build custom:4.23.1-pixelstreaming -repo=https://github.com/adamrehn/UnrealEngine.git -branch=4.23.1-pixelstreaming
這個(gè)安裝過程非常久堂鲤,我?guī)缀蹙鸵蛟谶@里了舱呻。由于我們網(wǎng)絡(luò)很不穩(wěn)定的情況下經(jīng)常會(huì)安裝到半路中斷并提示錯(cuò)誤,不用理它奄薇,直接重新運(yùn)行這個(gè)指令菠赚,在安裝一次脑豹,已安裝的依賴不會(huì)重新下載的。
安裝完之后锈至,磁盤會(huì)消耗一百多G晨缴,所以分配的硬盤一定不能少。
看到如下信息代表安裝成功了
打包demo工程進(jìn)行測試
把demo工程克隆到本地
git clone https://github.com/adamrehn/ue4-example-dockerfiles.git
進(jìn)入如下路徑
cd ./ue4-example-dockerfiles/pixel-streaming/4.23
這里有三個(gè)目錄峡捡。分別就是文章一開始說的,一個(gè)WebRTC筑悴、一個(gè)WebService们拙,還有一個(gè)就是demo游戲程序。
分別用docker進(jìn)行build鏡像
cd server
docker build -t ue4webserver .
cd proxy
docker build -t ue4webrtc .
cd project
docker build -t demoproject .
接下來運(yùn)行三個(gè)鏡像的容器
docker run -itd --name=ue4_webserver --network=host ue4webserver
docker run -itd --name ue4_webrtc --network=host ue4webrtc
docker run -itd --gpus=all --name=demoproject --network=host demoproject
然后關(guān)閉一下防火墻
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
OK !!!
接下來看一下效果
打開瀏覽器阁吝,輸入ip地址