【Unity】云渲染

1 前言

        最近在搞Unity云渲染的东西,所以研究了下官方提供的云渲染方案Unity Renderstreaming。注:本文使用的Unity渲染管线是URP。

2 文档

        本文也只是介绍基本的使用方法,更详细内容参阅官方文档。官方文档:Unity Renderstreaming文档。

3 简单云渲染实现

3.1 系统结构

        如上图,一个Web服务器,两个对等用户。在渲染流媒体中,两个对等方之间会创建一个P2P网络,并且这个网络会发送视频/音频/二进制数据。 Web服务器 使两个对等方之间能够进行通信。这种通信被称为 信令(signaling)

        这是文档中的部分内容,这里提一下可以先对整体结构有个了解。

3.2 安装Unity Renderstreaming

        在Unity 的Package Manager中通过git URL来添加包:

之后将com.unity.renderstreaming填入其中点击Add即可。

添加时可能会提示需要Unity新的输入系统Input System Package,点击Yes即可。

        之后可打开RenderStreaming的设置窗口,Unity Editor→Window→Render Streaming→Render Streaming Wizard:

初次打开时是设置窗口中会报有错误,点击Fix All按钮修复即可:

3.3 安装WebRTC

        这里通过Render Streaming提供的示例项目来导入WebRTC包,导入示例项目,然后WebRTC包就自动安装了。

点击Import安装,这里因为我安装过了,所以显示的是Reimport。之后就可以看到WebRTC安装完毕了:

3.4 安装NodeJS

        需要安装到电脑上,来提供一个JavaScript运行环境。这个可以选择安装,具体什么时候需要会在后面说明,这里可以先不安装。

NodeJS官网链接

        进入官网,点击左上角的Download按钮,进入下载页面:

这里我选择的是Windows平台64位,然后下载了安装文件Windows installer。之后点击安装即可,路径若无要求,则一路往下按就行。

        安装完成后需要检查是否安装成功。在电脑左下角搜索框输入cmd,点击回车打开命令行窗口,输入如下命令检查:

若安装成功,将会如上图所示输出版本号;若失败,则会无法识别输入命令。

3.5 下载WebServer

        官方提供的有一个WebServer,我们下载使用即可。GIt地址:WebServer。

【图略,网页当时打不开就没截图了】

        在Release页面中可以找到不同版本的WebServer。这里我们选择3.1.0-exp.7版本,下载其中的webserver.exe,这是编译好的可执行程序。源码也可以下载一份留存,其中包含对应版本的UnityRenderStreaming包、webserver源码。

        3.1.0-exp.9版本则没有提供可执行程序下载,若想使用此版本的,则需要自己编译源代码生成webserver.exe,那么这时就需要安装NodeJS,按照前面章节的操作安装即可。编译源码生成.exe可执行程序的方法如下:

  1. cmd打开命令行窗口。
  2. cd命令进入WebServer源码文件中的WebApp文件夹。
  3. npm install,安装依赖。
  4. npm run build,构建项目。
  5. npm run start,启动项目(服务),等价于webserver.exe启动,启动后看看是否正常。
  6. npm run pack,启动没问题后使用此命令打包生成.exe可执行程序,方便后续启动。

参考官方文档:Customize web application。

        那么如何使用webserver.exe启动服务?这里不能点击执行,需要通过命令行执行。流程如下:

  1. cmd打开命令行窗口。
  2. 进入到webserver.exe所在的文件夹(命令:cd + 路径)。
  3. 执行webserver.exe(命令:webserver.exe,如果要制定端口的话为webserver.exe -p 端口号)。

如图,启动成功,此状态即为服务运行中。

3.6 创建Unity场景

        服务启动成功了,但在开始体验云渲染之前,我们还需要搭建好一个Unity场景。在Unity中创建一个空场景。

3.6.1 配置Renderstreaming组件

        需要对Renderstreaming组件进行一些配置。这里主要是在Unity场景中配置一些包中提供的可用组件。

        在场景中创建一个空对象命名随意,这里我命名为“UnityRenderStreaming”。然后给此物体添加如下组件:

  • SignalingManager
  • Broadcast
  • VideoStreamSender
  • AudioStreamSender

然后对各组件进行设置:

这里设置了组件间的索引,同时将Video Source Type修改为Screen,Audio Listener设置为相机身上的Audio Listener。至于组件的其他属性设置,目前保持默认即可。属性具体含义可参考官方文档。

3.6.2 配置Renderstreaming设置

        点击SignalingManager组件中的Open Project Setings按钮,打开设置窗口。

若我们执行websever.exe时没有指定端口,则这里使用默认的配置内容即可。若我们当时指定了端口,比如这里我指定的是8088,那么就要修改URL了。这里可以点击Create New Settings Asset按钮创一个新的配置资源文件(不是必须的),然后再修改URL,如图:

使用了一个新的配置资源文件,并修改URL加上了端口号。

3.6.3 搭建场景

        然后在场景中随意创些模型,后续通过云渲染开查看此场景。目前只要能看到场景中的内容即可。

3.7 体验云渲染

        首先,在Unity编辑器中点击Play运行。

        然后打开浏览器(我这里使用的IE浏览器,浏览器支持情况附在本章节末尾),输入服务地址127.0.0.1:8088,回车进入页面(若在局域网内,其他人可通过输入服务所在设备的IP地址+端口号来访问)。

点击Receiver Sample进入接收案例页面,然后点击窗口中的播放按钮接收画面。

可以看到我们成功看到了画面,此时我们就成功实现了云渲染。画面对网络要求挺高的,在网络较差时画面会比较卡且模糊。

Unity Render Steaming对浏览器支持情况

4 外网访问

        参考官方文档:Setting for TURN Servers。目前还未研究,暂时贴在这里。

        按文档说法,不一定需要这个,可以在运行webserber.exe后看命令行窗口中是否显示公网IP,若显示则应该可以让外网访问,我没测试,自己测吧。不通了再考虑防火墙和Turn服务器等问题。

5 官方案例

        官方文档中也有提供几个案例,这里挑一些说一说。当然,这里只是简单介绍案例,案例提供的功能具体实现方式还是要去自己研究源码。

        首先需要做两步:

  1. 运行webserver服务器(参考前面章节),这里我设置的端口为8088,所以用的地址为:http://127.0.0.1:8088。
  2. 打开Unity编辑器,可以在安装的Unity Render Steaming案例文件中找到Menu场景,点击进去,然后启动Unity编辑器。

5.1 Receiver

        接收画面案例。

        在运行的Unity编辑器的Menu场景中,点击Broadcast按钮,可以进入一个测试场景。然后打开web浏览器,输入服务器地址(同前面章节),点击Receiver即可看到场景内容。这个实例实际跟前面的“体验云渲染”章节内容差不多,只不过这里的测试场景是官方提供的。

场景UI提供了一些可设置属性:画面源(分屏幕与相机)、带宽、下采样(降低画面清晰度,减少带宽压力)、帧率、分辨率。左侧是灯光开关、音频播放按钮。

        另外,我们也可以在编辑器中将项目打包,初始场景设置为Menu场景。打包后,点击可执行程序运行,然后在Menu场景中点击Receiver进入接收场景,输入一个随意的ID,点击Start按钮后,也可以接收到测试场景画面。只不过在可执行程序接收的画面中不能操作,可能是是官方案例没有提供非web的操作,也可能是我没有配置好新的输入系统,这里暂时不管了。

        可以多个打包的可执行程序来接收画面,也可以多个浏览器接收画面,即多端接收,这些画面是同一个画面,一端操作,其他端也可以看到操作。

5.2 Broadcast

        广播画面案例。

        因为5.1在演示接收时使用了本节案例(官方行为)。所以本节内容与5.1是一样的,不再说明。Broadcast案例的提供是为了说明画面广播功能,我们已在5.1中说明,即多端接收。

5.3 Web Browser Input

        web浏览器端输入案例。

        主要展示浏览器中输入检测,以及单独的画面展示。

        与Broadcast很相似。首先输入检测Broadcast也有,它们原理是一样的,都是借助新的输入系统,只是输入后的处理方法不同(Broadcast只展示输入,这里是展示+移动视角)。关于单独画面展示,在浏览器接收的画面中多展示了一个小窗画面,主画面是编辑器中WebBrowserInput场景的Camera1画面,而小窗口画面是Camera2画面。

5.4 Multiplay

        多端接收案例。

        这里的多端是特殊的,Receiver与Broadcast案例中有提到多端接收,但它们的多端是指广播接收,收到的画面是一样的,而本案例中的多端指它们可以接收到不同的画面,如每个终端所接收的都是独属于自己的Camera的画面。

        同样的在编辑器中的Mune场景中,点击Multiplay按钮:

然后可以选择Host与Guest,即主机与用户,这里我们将编辑器作为主机,需要勾选Host,用户名可以自定义输入。

然后点击Start进入场景:

目前场景中就我们一个(小球贴图丢失,问题不大),接下来使用浏览器或者打包的可执行程序都可以,我们这里用浏览器,在浏览器中点击Multiplay Sample链接,然后点击按钮接收画面:

可以看到,我们也进入了此场景,就像联网游戏一样,多个玩家在同一个场景中,大家都有各自的视角画面展示。浏览器的用户名是自动生成的,如果使用打包的可执行程序的话是可以自定义的,这里就不演示了。

6 问题

6.1 画面显示不全

        问题:有时候在终端接收画面时会出现画面只显示了一部分的情况。

        解决:这是因为接收画面设置的分辨率与画面源的分辨率是设置不一致导致的,故将两者设置相同即可。

7 后记

        暂时这些吧。想深入了解,则文档、Unity Render Streaming源码、示例代码都要看一看才行,不过最大的问题还是web服务器这块,毕竟涉及JS方面的内容。

参考

  1. 官方文档 Unity Render Streaming
  2. Unity Renderstreaming 云渲染入门教程 - 技术专栏 - Unity官方开发者社区
  3. Unity 云渲染本地部署方案_unity 中使用云渲染-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组相对策略优化(GRPO):原理及源码解析

文章目录 PPO vs GRPOPPO的目标函数GRPO的目标函数KL散度约束与估计ORM监督RL的结果PRM监督RL的过程迭代RL算法流程 GRPO损失的不同版本GRPO源码解析 DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models PPO vs GRPO PPO的目标函数 J P P O…

Linux或者Windows下PHP版本查看方法总结

确定当前服务器或本地环境中 PHP 的版本,可以通过以下几种方法进行操作: 1. 通过命令行检查 这是最直接且常用的方法,适用于本地开发环境或有 SSH 访问权限的服务器。 方法一:php -v 命令 php -v输出示例:PHP 8.1.12 (cli) (built: Oct 12 2023 12:34:56) (NTS) Copyri…

[Linux] MySQL源码编译安装

目录 环境包安装 创建程序用户 解压源码包 配置cmake ​编辑编译 安装 配置修改属性 属主和属组替换成mysql用户管理 系统环境变量配置 初始化数据库 服务管理 启动 环境包安装 yum -y install ncurses ncurses-devel bison cmake gcc gcc-c 重点强调:采…

【C++项目】负载均衡在线OJ系统-1

文章目录 前言项目结果演示技术栈:结构与总体思路compiler编译功能-common/util.hpp 拼接编译临时文件-common/log.hpp 开放式日志-common/util.hpp 获取时间戳方法-秒级-common/util.hpp 文件是否存在-compile_server/compiler.hpp 编译功能编写(重要&a…

转战海外 Web3 远程工作指南

目录 一、明确职业目标和技能 二、准备常用软件 (一)通讯聊天工具 (二)媒体类平台 (三)线上会议软件 (四)办公协作工具 (五)云存储工具 (六…

MongoDB账号密码笔记

先连接数据库,新增用户密码 admin用户密码 use admin db.createUser({ user: "admin", pwd: "yourStrongPassword", roles: [ { role: "root", db: "admin" } ] })用户数据库用户密码 use myappdb db.createUser({ user: &…

CSS强制div单行显示不换行

在CSS中&#xff0c;要让<div>的内容强制单行显示且不换行&#xff0c;可通过以下属性组合实现&#xff1a; 核心解决方案&#xff1a; css 复制 下载 div {white-space: nowrap; /* 禁止文本换行 */overflow: hidden; /* 隐藏溢出内容 */text-overflow: e…

RK3568-快速部署codesys runtime

前期准备 PC-win10系统 RK3568-debian系统,内核已打入实时补丁,开启ssh服务。PC下载安装CODESYS Development System V3.5.17.0 https://store.codesys.com/en/codesys.html#product.attributes.wrapperPC下载安装 CODESYS Control for Linux ARM64 SL 4.1.0.0.package ht…

中英混合编码解码全解析

qwen模型分词器怎么映射的:中英混合编码解码全解析 中英文混合编码与解码的过程,本质是 字符编码标准(如 UTF-8)对多语言字符的统一处理 ,核心逻辑围绕“字节序列 ↔ 字符映射”展开 北京智源人工智能研究院中文tokenID qwen模型分词器文件 一、编码阶段:统一转为字节序…

React 事件处理与合成事件机制揭秘

引言 在现代前端开发的技术生态中&#xff0c;React凭借其高效的组件化设计和声明式编程范式&#xff0c;已成为构建交互式用户界面的首选框架之一。除了虚拟DOM和单向数据流等核心概念&#xff0c;React的事件处理系统也是其成功的关键因素。 这套系统通过"合成事件&qu…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

android 媒体框架之MediaCodec

一、MediaCodec 整体架构与设计思想 MediaCodec 是 Android 底层多媒体框架的核心组件&#xff0c;负责高效处理音视频编解码任务。其架构采用 生产者-消费者模型&#xff0c;通过双缓冲区队列&#xff08;输入/输出&#xff09;实现异步数据处理&#xff1a; 输入缓冲区队列…

Starrocks Full GC日志分析

GC日志样例&#xff1a; [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

React从基础入门到高级实战:React 高级主题 - React 微前端实践:构建可扩展的大型应用

React 微前端实践&#xff1a;构建可扩展的大型应用 引言 在2025年的技术生态中&#xff0c;Web应用的规模和复杂性持续增长&#xff0c;微前端&#xff08;Micro Frontends&#xff09;已成为应对大型项目挑战的主流架构。通过将前端应用拆分为多个独立模块&#xff0c;微前…

定时器:中央对齐模式剖析

中央对齐模式&#xff08;Center-Aligned Mode&#xff09;下&#xff0c;当配置为 模式3&#xff08;CMS[1:0] 11&#xff09; 时&#xff0c;定时器会同时触发 上溢中断&#xff08;ARR中断&#xff09; 和 下溢中断&#xff08;0中断&#xff09;&#xff0c;即一个PWM周期…

MySQL强化关键_019_索引优化

目 录 一、最左前缀原则 1.完全使用索引 2.部分使用索引 3.不使用索引 4.效率折损 &#xff08;1&#xff09;使用范围查找 &#xff08;2&#xff09;索引断开 二、索引失效场景 1. 索引列参与运算 2.索引列模糊查询以“%”开始 3.索引列是字符串类型&#xff0c;查…

【Oracle】安装单实例

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 安装前的准备工作1.1 硬件和系统要求1.2 检查系统环境1.3 下载Oracle软件 2. 系统配置2.1 创建Oracle用户和组2.2 配置内核参数2.3 配置用户资源限制2.4 安装必要的软件包 3. 目录结构和环境变量3.1 创建Ora…

6年“豹变”,vivo S30系列引领手机进入场景“体验定义”时代

出品 | 何玺 排版 | 叶媛 5月29日晚&#xff0c;备受用户期待的vivo S30系列如约而至。 相比前几代S系列产品&#xff0c;S30系列变化显著&#xff0c;堪称“豹变”。首先&#xff0c;其产品打造思路发生了质变&#xff0c;产品体验更好&#xff0c;综合竞争力更为强。其次&a…

线性动态规划

具有「线性」阶段划分的动态规划方法统称为线性动态规划&#xff08;简称为「线性 DP」&#xff09;&#xff0c;如下图所示。 一、概念 如果状态包含多个维度&#xff0c;但是每个维度上都是线性划分的阶段&#xff0c;也属于线性 DP。比如背包问题、区间 DP、数位 DP 等都属…

Rust 学习笔记:使用自定义命令扩展 Cargo

Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Cargo 支持通过 $PATH 中的 cargo-something 形式的二进制文件拓展子命令&#xff0c;而无需修改 Cargo 本身。 …