【Unity】项目部署Linux服务器
1 Unity打包到Linux平台最近需要将Unity项目放到Linux平台上运行也是研究了下。目前成功在linux的图形界面上正常运行在命令行模式下因为虚拟桌面暂时没找到切换为独显渲染的方法所以还不能运行。下面记录一下部署过程。系统版本CentOS 7.9。1.1 平台切换与设置首先在Build Settings界面中下左侧平台选择WinsowsMacLinux选项在右侧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 SupportIL2CPP。图形API也要选择下在Project Settings-Player-OtherSettings下的Rendering中这里勾选Auto Graphics API for Linux就行若自行想限定OpenGL或Vulkan则取消勾选然后在新增的列表里增删即可。1.2 代码冲突切换平台后大概率会遇到一些代码报错这通常是Window平台下的代码在Linux的不兼容导致的。另外这些错误也可能会在项目打包时才报出来。报出来后解决就行我这边是一些插件中的代码不兼容因为都是没有用到的插件所以有的是直接卸载了有的则是直接把相关代码注释了。如果是用到的插件则需要好好寻找解决方法。1.3 打包产物打包所得内容跟在Window上差不多只不过没有.exe文件了对应的执行文件是.x86_64文件。2 部署Linux服务器直接把部署需求告诉AI基本上AI都会提供一套部署流程。就我的部署经历来看最大的问题就Linux服务器的环境配置Unity本身倒没什么问题。所以先问AI自己操作一遍若没问题自然很好若有问题可参考我的配置经历。接下来我会把我当时如何部署的流程叙述一遍并说明当时遇到的问题所给的命令不一定完整毕竟来回捣鼓了很久所以还是建议先让问AI要套部署流程之后有什么问题问什么即可期间可以参考我的部署经历。提示相关问题中的解决方法不会在基础配置小节中说明会随着问题的列出逐步说明所以想了解我这边都使用了哪些方法来部署基本就要从头看到尾。2.1 基础环境配置这个就直接问AI我这里给个基础的参考。# 步骤 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机器这边看到。直接将打包好的项目拷贝到服务器上进入对应项目目录下执行# 权限设置若需要 chmod 755 xxx.x86_64 # 执行 ./xxx.x86_64 -nographics -logFile /xxx/xxx.log运行后发现log可打印输出输出内容正常确定在运行但云渲染画面加载不出来不过log中说明渲染设备为Null。后来研究半天发现不能使用“-nographics”参数这是关闭图形渲染的意思。我向AI表达的是无显示器的渲染方式但其却理解偏差给了我错误的参数。2.3 libstdc版本低/缺失再执行./xxx.x86_64 -logFile /xxx/xxx.log直接在中断窗口中报错最终提示吐核并终止程序。错误原因是相关libstdc库版本低或缺失解决方案# 步骤 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及以上”也是我的环境下的要求。参考# 安装编译依赖 yum install -y gcc gcc-c make kernel-devel kernel-headers dkms2.4 OpenGL Version低之后再次运行程序./xxx.x86_64 -logFile /xxx/xxx.log终端中不再报错但程序运行后马上就中断。打开输出的log文件可以看到提示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执行命令查看版本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远程连接而是直接跑到服务器那操作。在确定这些都没丢失后就只能从别的角度解决后来通过sudo nvidia-xconfig命令生成了一个配置文件要确定此配置文件内的Device下添的设备是Nvidia独显我用的N卡所以是这个之后重启服务器打开后就使用独显渲染了。无论用之前的opengl version指令还是在设置详情中看都会显示为独显的信息。再去运行Unity程序正常运行。2.5 图形界面下的远程访问这是在图形界面下可以正常运行了。那如果使用远程连接呢如MobaXterm的SSH会话。答案是依旧没问题。不过需要注意在远程连接到服务器后执行Unity程序前需要输入DISPLAY:0这里好像是物理显示器默认是0所以需要切到物理显示器上。之后运行Unity显示器上也会同步打开窗口。另外即使把物理显示器拔掉也没影响。总结一下就是在图形界面下配置好后就可以直接把显示器拔了用远程会话访问切换到显示器0下运行程序即可。2.6 命令行界面除了图形界面外还有命令行界面。我这边的相关命令如下不同的系统命令可能不同。# 查看当前模式 systemctl get-default # 切换为多用户模式命令行 systemctl isolate multi-user.target # 切换为图形界面模式 systemctl isolate graphical.target在命令行模式下查看opengl版本将会出入null因为没有桌面来渲染了需要创建虚拟桌面可以通过Xvfb来创建。# 创建虚拟桌面 Xvfb :99 -screen 0 1920x1080x24 -ac extension GLX render -noreset # 切换到对应虚拟桌面 DISPLAY:99但目前在创建的虚拟桌面上只会用模拟渲染Mesa还没找到切为独显渲染的方法所以无法运行Unity项目。2.7 终端后台执行目前在终端内执行后会卡住终端输入且只能执行一个程序。改为nohup可以不影响终端后续输入且执行多个。# 执行test.x86_64在同目录下输入mylog.log、mylog_nohup.log文件前者存放unitylog后者存放终端log终端错误信息也放入log文件内容不阻塞终端输入 nohup ./test.x86_64 -logFile mylog.log mylog_nohup.log 21 # 另外也可以加上signalingUrl来设置UnityRenderStreaming云渲染连接服务器地址 nohup ./test.x86_64 -signalingUrl ws://xxx.xx.x.xxx:xxxx -logFile mylog.log mylog_nohup.log 21 不过这是执行同一个项目文件若是项目存在项目文件会被修改的情况这样感觉有风险。考虑复制多个项目文件来执行。3 Unity需注意问题3.1 YooAsset资源问题切换linux平台后资源需要重新打包否则会出现贴图丢失问题。3.2 UnityRenderStreaming云渲染鼠标位置丢失问题这个不会影响程序但会在log中一直输出可以在使用InputSystem的鼠标位置前判断下位置是否为nan来决定本次是否使用。3.3 UnityRenderStreaming画面翻转问题在Window中Unity客户端连接上Webserver后因为使用的时广播模式在打开多个网页访问时都会访问到客户端的同一界面最新打开的网页可以交互其他网页不可交互。这种情况在Linux中发生了变化在多网页访问的情况下除了前面说的最新的才可以交互还出现了若刷新网页则会画面翻转的情况不过将多余页面关闭只打开一个再次刷新又会恢复正常。当然最好的解决方法是不要广播可以从unity这边控制也可以从webserver上控制。unity这边可以断开streaming重连也能恢复正常。4 部署结果服务器图形界面下graphical配置好独显渲染本机、远程会话都可以正常运行unity。远程会话需要DISPLAY:0切换为显示器0。只要在图形界面下即使拔掉显示器重启服务器后依旧可识别并切换到显示器0DISPLAY0且为之前配置好的独显渲染。在命令行界面下multi-user无显示器需要使用模拟显示器但模拟显示器目前一直是CPU模拟渲染Mesa暂未找到切换为独显渲染的方式故无法运行unity。5 补充 部署到Rocky Linux 8上依旧模式为图形界面即graphical.target只不过没有硬件显示器。Unity项目的配置如之前一样不过这里Linux服务器上已经安装好了N卡驱动下面只展示之后的部署过程。# 同样选择0显示器这是系统默认的图形管理器 export DISPLAY:0 # 我这边使用的MobaXterm连接的需要开启相关显示器权限这里是拿到开启权限的“密码” export XAUTHORITY/run/user/42/gdm/Xauthority # 为本地root用户开启权限 xhost local:root # 输出以下内容表示成功 # non-network local connections being added to access control list # 限定使用N卡渲染、驱动 export __NV_PRIME_RENDER_OFFLOAD1 export __GLX_VENDOR_LIBRARY_NAMEnvidia # 查询是否成功 glxinfo | grep -E OpenGL version|OpenGL core profile version # 输出类似如下内容表示成功 # OpenGL core profile version string: 4.6.0 NVIDIA 570.133.07 # OpenGL version string: 4.6.0 NVIDIA 570.133.07之后即可运行。不过目前也出现了一些问题显卡占用率偶尔会99导致项目卡死几秒严重时甚至影响模型贴图。出现频率不稳定有时一直没事有时偶尔有时频繁。【暂未解决】