1 Unity打包到Linux平台
最近需要将Unity项目放到Linux平台上运行,也是研究了下。目前成功在linux的图形界面上正常运行;在命令行模式下因为虚拟桌面暂时没找到切换为独显渲染的方法,所以还不能运行。下面记录一下部署过程。
1.1 平台切换与设置
首先在Build Settings界面中,下左侧平台选择Winsows,Mac,Linux选项,在右侧Target Platform选择Linux。
然后还需要一些设置。
-
在Project Settings-Player-Resolution and Presentation中:
-
设置Fullscreen Mode为Windowed,然后输入我们需要的分辨率,这样做是为了保证分辨率固定。
-
Run In Background勾选。
-
Resizable Window取消勾选。
-
-
在Project Settings-Player-Other Settings中:
-
AutoGraphicsAPIforLinux默认是勾选的,可以取消勾选然后选择需要的API,一般勾选即可。
-
Graphics Jobs取消勾选。
-
Scripting Backend改为IL2CPP。
-
ApiCompatibilityLevel,选Framwork、standard2.1都可。
-
另外第一次打包的话,可能还需要在UnityHub里为编辑器下载相关模块:Linux Build Support(IL2CPP)。
1.2 代码冲突
切换平台后,大概率会遇到一些代码报错,这通常是Window平台下的代码在Linux的不兼容导致的。另外,这些错误也可能会在项目打包时才报出来。
报出来后解决就行,我这边是一些插件中的代码不兼容,因为都是没有用到的插件,所以有的是直接卸载了,有的则是直接把相关代码注释了。如果是用到的插件,则需要好好寻找解决方法。
1.3 打包产物
打包所得内容跟在Window上差不多,只不过没有.exe文件了,对应的执行文件是.x86_64文件。
2 部署Linux服务器
直接把部署需求告诉AI,基本上AI都会提供一套部署流程。就我的部署经历来看,最大的问题就Linux服务器的环境配置,Unity本身倒没什么问题。所以先问AI自己操作一遍,若没问题自然很好,若有问题可参考我的配置经历。
接下来我会把我当时如何部署的流程叙述一遍,并说明当时遇到的问题,所给的命令不一定完整,毕竟来回捣鼓了很久,所以还是建议先让问AI要套部署流程,之后有什么问题问什么即可,期间可以参考我的部署经历。
提示:相关问题中的解决方法不会在基础配置小节中说明,会随着问题的列出逐步说明,所以想了解我这边都使用了哪些方法来部署,基本就要从头看到尾。
2.1 基础环境配置
这个就直接问AI,我这里给个基础的参考。
bash
# 步骤 1:系统基础检查与依赖源配置
# 1. 安装EPEL源(必须,否则部分依赖包无法找到)
yum install -y epel-release
# 步骤 2:验证 NVIDIA 驱动与 OpenGL 基础环境
# 1. 检查NVIDIA驱动状态
nvidia-smi
# 正常输出应显示GPU信息、驱动版本,无"Failed to initialize NVML"错误
# 2. 安装OpenGL基础依赖(必须,Unity运行依赖)
yum install -y mesa-libGL mesa-libGL-devel mesa-libGLES mesa-libGLES-devel
yum install -y glx-utils libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel
yum install -y libstdc++ libgomp glibc-devel libuuid-devel
# 3. 临时检查OpenGL版本(无显示器时暂无法直接输出,后续配虚拟显示后验证)
glxinfo | grep "OpenGL version"
#步骤 3:配置无显示器的虚拟显示(Xvfb)
#Unity 依赖图形上下文,无物理显示器时必须通过 Xvfb 创建虚拟帧缓冲区:
# 1. 安装Xvfb(虚拟显示服务)
yum install -y xorg-x11-server-Xvfb xorg-x11-apps
# 虚拟显示器实际我并未用到,因为存在一些问题,但最好还是安装下↑↑↑↑↑↑
然后先给linux服务器先装一个物理显示器,再在系统内装一个图形界面,这里就不展开说明了,确保安装好后能进入图形界面即可。
2.2 图形渲染开关问题
最初我是通过MobaXterm通过SSH会话连接Linux服务器来操作。因为服务器之前有在用在别的地方,所以有一定的环境配置(显卡驱动、图形界面等等),所以我开始并未配置环境。另外,我的项目中使用了UnityRenderStreaming云渲染,渲染画面理论上可以在我Window机器这边看到。直接将打包好的项目拷贝到服务器上,进入对应项目目录下执行:
bash
# 权限设置(若需要)
chmod 755 xxx.x86_64
# 执行
./xxx.x86_64 -nographics -logFile /xxx/xxx.log
运行后发现log可打印输出,输出内容正常,确定在运行,但云渲染画面加载不出来,不过log中说明渲染设备为Null。后来研究半天发现,不能使用"-nographics"参数,这是关闭图形渲染的意思。我向AI表达的是无显示器的渲染方式,但其却理解偏差,给了我错误的参数。
2.3 libstdc++版本低/缺失
再执行:
bash
./xxx.x86_64 -logFile /xxx/xxx.log
直接在中断窗口中报错,最终提示吐核,并终止程序。错误原因是相关libstdc++库版本低或缺失,解决方案:
bash
# 步骤 1:升级 libstdc++ 并配置库路径
# 1. 先备份系统原有libstdc++(防止系统崩溃)
mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak
# 2. 从GCC目录复制高版本libstdc++(替换为你的GCC安装路径)
cp /usr/local/gcc-9.3.0/lib64/libstdc++.so.6.0.28 /usr/lib64/
# 3. 创建新的软链接
ln -s /usr/lib64/libstdc++.so.6.0.28 /usr/lib64/libstdc++.so.6
# 4. 验证版本(需显示GLIBCXX_3.4.26及以上)
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
若没有gcc的话则需要自己安装下,建议根据自己的情况问AI。
具体按自己的来,930也只是我在使用的版本而已,"需显示GLIBCXX_3.4.26及以上"也是我的环境下的要求。
参考:
bash
# 安装编译依赖
yum install -y gcc gcc-c++ make kernel-devel kernel-headers dkms
2.4 OpenGL Version低
之后再次运行程序:
bash
./xxx.x86_64 -logFile /xxx/xxx.log
终端中不再报错,但程序运行后马上就中断。打开输出的log文件可以看到提示:
bash
Display 0 'screen': 1920x1080 (primary device).
Desktop is 1920 x 1080 @ 0 Hz
Unable to find a supported OpenGL core profile
Failed to create valid graphics context: please ensure you meet the minimum requirements
E.g. OpenGL core profile 3.2 or later for OpenGL Core renderer
No supported renderers found, exiting
执行命令查看版本:
bash
glxinfo | grep -E "OpenGL version|OpenGL core profile version"
# 正常输出示例:(只是例子,不用在意版本号不同)
# OpenGL core profile version string: 4.6.0 NVIDIA 545.23.06
# OpenGL version string: 3.3.0 NVIDIA 535.261.03(≥3.2即可)
# 但我这边输出为
OpenGL version string: 2.1 Mesa 18.3.4。
原因是:默认加载了 CentOS 系统自带的 Mesa 软件渲染库(OpenGL 2.1),而非 NVIDIA 显卡驱动提供的硬件加速 OpenGL 库(3.2+)。
另外,在图形界面下,也可以在设置-详情中看到当前是用什么渲染的,在我这边,若是模拟渲染则会显示"llvmpipe相关字样",若是显卡渲染则会显示对应的显卡信息,如"RTX4080"。
问题解决过程
开始AI让我在"/usr/lib64/nvidia/"去寻找相关lib文件,然后让"/usr/lib64/"下的相关lib文件去关联。但我这边"/usr/lib64/nvidia/"下根本没lib文件。驱动重装、换版本,试了好多次,依旧是没有,到后来才发现,这边的lib文件会直接放到"/usr/lib64/"下,虽然期间也用find命令找到过,但因为一直是模拟渲染,所以被AI认定为不是,后来通过每次安装驱动发现这些lib会更新才确定是我要找的东西。
期间不再使用MobaXterm远程连接,而是直接跑到服务器那操作。
在确定这些都没丢失后就只能从别的角度解决,后来通过
bash
sudo nividia-xconfig
命令生成了一个配置文件,要确定此配置文件内的Device下添的设备是Nvidia(独显,我用的N卡,所以是这个),之后重启服务器,打开后就使用独显渲染了。
无论用之前的opengl version指令还是在设置详情中看,都会显示为独显的信息。
再去运行Unity程序,正常运行。
2.5 图形界面下的远程访问
这是在图形界面下可以正常运行了。那如果使用远程连接呢,如MobaXterm的SSH会话。答案是依旧没问题。
不过需要注意在远程连接到服务器后,执行Unity程序前,需要输入
bash
DISPLAY=:0
这里好像是物理显示器默认是0,所以需要切到物理显示器上。之后运行Unity,显示器上也会同步打开窗口。
另外,即使把物理显示器拔掉也没影响。
总结一下就是:在图形界面下配置好后就可以直接把显示器拔了,用远程会话访问切换到显示器0下,运行程序即可。
2.6 命令行界面
除了图形界面外还有命令行界面。我这边的相关命令如下,不同的系统命令可能不同。
bash
# 查看当前模式
systemctl get-default
# 切换为多用户模式(命令行)
systemctl isolate multi-user.target
# 切换为图形界面模式
systemctl isolate graphical.target
在命令行模式下,查看opengl版本将会出入null,因为没有桌面来渲染了,需要创建虚拟桌面,可以通过Xvfb来创建。
bash
# 创建虚拟桌面
Xvfb :99 -screen 0 1920x1080x24 -ac +extension GLX +render -noreset &
# 切换到对应虚拟桌面
DISPLAY=:99
但目前在创建的虚拟桌面上只会用模拟渲染(Mesa),还没找到切为独显渲染的方法,所以无法运行Unity项目。
2.7 终端后台执行
目前在终端内执行后,会卡住终端输入,且只能执行一个程序。改为nohup可以不影响终端后续输入且执行多个。
bash
# 执行test.x86_64,在同目录下输入mylog.log、mylog_nohup.log文件,前者存放unitylog,后者存放终端log,终端错误信息也放入log文件内容,不阻塞终端输入
nohup ./test.x86_64 -logFile mylog.log > mylog_nohup.log 2>&1 &
不过这是执行同一个项目文件,若是项目存在项目文件会被修改的情况,这样感觉有风险。考虑复制多个项目文件来执行。
3 Unity需注意问题
3.1 YooAsset资源问题
切换linux平台后,资源需要重新打包,否则会出现贴图丢失问题。
3.2 UnityRenderStreaming云渲染鼠标位置丢失问题
这个不会影响程序,但会在log中一直输出,可以在使用InputSystem的鼠标位置前,判断下位置是否为nan,来决定本次是否使用。
4 部署结果
服务器图形界面下(graphical),配置好独显渲染,本机、远程会话都可以正常运行unity。远程会话需要DISPLAY=:0切换为显示器0。只要在图形界面下,即使拔掉显示器,重启服务器后,依旧可识别并切换到显示器0(DISPLAY0),且为之前配置好的独显渲染。
在命令行界面下(multi-user),无显示器,需要使用模拟显示器,但模拟显示器目前一直是CPU模拟渲染(Mesa),暂未找到切换为独显渲染的方式,故无法运行unity。