.. _5 进阶功能: 5.进阶功能 =============================== 该章节主要展示在了解SDK基础功能的基础上,需要进一步了解的功能,例如性能优化,URP的使用,大空间定位等等 5.1 性能优化 -------------------- RhinoX 搭载高通835芯片。在启动MR应用以后, 需要负荷的基线计算量包括: 头部6dof位置跟踪, 双目渲染, X-Tag跟踪算法, 所以相对于手机应用而言,其性能天花板是比较低的。 5.1.1 性能要求 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **帧率** RhinoX应用帧率不得低于50帧,建议55帧以上 **场景** 同屏模型三角面片控制在60万以内 尽量不使用点光源。 Directional Light 场景中建议最多使用一个。 不建议使用 Unity 的 Standard PBR shader , 如果要使用光照shader, 建议使用 Mobile 类的shader. 5.1.2 优化方法 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. 使用通用渲染管线(URP)可以极大的提升性能。 2. 在保证显示的情况下减少模型面片顶点数量 3. 尽量共用材质,动画 4. 尽量使用压缩纹理格式 5. 尽可能少的使用灯光特效等 6. 尽量使用静态批处理 7. 脚本优化,减少不必要内存,计算等资源消耗 8. 使用 lightmap 代替 实时光。 9. 对于自定义shader, 不要在像素片段中大量使用exp(), pow()等对GPU造成高负荷的函数。 10. 减少使用后处理。 11. 如果项目中需要用到骨骼动画, 在项目设置中将 Skin Weights 设置为 2 Bones, 不要设置为 4 Bones 或者 Unlitmited。 5.2 使用URP渲染管线 -------------------------- 5.2.1 使用URP渲染管线的好处 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **极大的提升算力天花板** 不使用URP的情况,在Unity Shader着色器渲染的情况下, 要保持帧率大于50,最多支持60万面。 使用了URP之后,同样的着色器渲染,能最多支持100万面的渲染并保持50的帧率。 **能支持更多的实时光** 由于URP的实现机制决定了, 多光源渲染的场景在URP下不会像Builit管线那样造成大量的额外Drawcall, URP管线非常适合使用多实时光源的场景。 5.2.2 如何使用URP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 示例项目请直接导入SDK压缩包中的2019版本即可 .. image:: _static/SDK_download.png **操作步骤** 1. 在PackageManager上, 导入 2019.4 版本对应的URP插件包 .. image:: _static/PackageManager_URP.png 2. 在项目资源中,创建 Universal Rendering Pipeline / Pipeline Assets (Forward) .. image:: _static/CreateURPAsset.png 3. 将创建的 Pipeline Assset 放置到 Project Setting/Quality 的Rendering 栏目, 和 Graphics 的 Scriptable Render Pipeline Assets 栏目下。 .. image:: _static/URP_Quality.png .. image:: _static/URP_Graphics.png 4. 编译apk即可,ARCamera 的渲染流程内置已经支持了 URP 。 **什么样的项目建议使用 URP** 1. 新立项的项目。 考虑到将PBR shader 转换到 URP shader 的实现成本, 旧的项目迁移到 URP 所花的的时间是比较多的。 2. 渲染任务较重,而又不方便使用无线串流实现的项目。 3. 需要比较多实时光模拟真实光的项目。 5.3 使用 Unity Editor Debugger调试 ---------------------------------------- 5.3.1 功能介绍 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 有许多初次使用RhinoX的开发者, 尤其是过去使用VR设备开发的开发者, 都面临一个问题, 就是无法像VR设备一样, 在unity环境内模拟MR设备进行调试工作。 Unity Editor Debugger 就是为了解决这个问题。 Unity Editor Debugger 的设计初衷是成为开发者的效率工具。让开发者可以不需要编译-安装apk, 直接在Unity环境下运行当前的场景,并且可以直接看到 ARCamera ,RxController等重要对象的位置,按键状态等属性。 .. image:: _static/demo_debugger.gif 5.3.2 如何使用 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. 从SDK库上获取到v1.5的 RhinoX SDK Unity Editor Debugger 的库位于 : Plugins/Unity2018.4/UnityDebugger下 .. image:: _static/UnityEditorDebugger.png 2. 在场景中创建Debugger对象, 并添加 EditorDebugger 组件 .. image:: _static/AddsEditorDebugger.png 3. 安装 RhinoX Debugger.apk 下载地址: https://doc.ximmerse.com/release/unitysdk/RhinoX_Debugger.apk 4. 确认头显和电脑处于同一局域网,且能互相ping通 5. 在Unity中点击 Play 按钮 6. 在头显中启动 RhinoX Debugger应用 7. 在Unity中,选中 Debugger 对象,在查找到的设备项上,点击Connect .. image:: _static/ConnectsEditorDebugger.png 也可以直接输入头显的IP地址,再点击连接: .. image:: _static/RhinoX_Debugger_Input_IP.png 如果成功连接, 头显上会显示出编辑器上相机的画面。 .. note:: 如果在电脑上无法连接到头显,请检查是否打开了Windows防火墙。 如果是, 需要允许Unity Editor应用使用网络, 或者关闭防火墙。 目前该工具体验还存在一些问题,如果调试起来确实不方便,麻烦您先放弃此功能。 5.4 使用大空间融合定位算法 ------------------------------- 5.4.1 背景 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: 大空间融合定位算法要求 v1.5 或以上的RhinoX MR SDK支持。 大空间融合算法是Ximmerse研发部门为了解决旧sdk中的一些问题,而开发出的新一代空间定位算法。 v1.5以前的SDK,在使用 GroundPlane 和 ARCamera 组件定位用户头部6DOF位置的时候, **存在以下问题**: 1). 使用GroundPlane组件定位用户位置的精度不高, 每次定位的结果之间都会有一定的偏移。 2). 每次定位的时候, ARCamera 实际上是被瞬间放置到计算出的6dof位置上, 用户会有“画面跳动”的感觉。 v1.5 SDK引入了 Fusion 算法解决上述问题。 5.4.2 使用方法 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 大空间融合算法其实就是在场景中创建多个GroundPlane,根据实际情况,将他们均匀布置在实际场地中,以此来达到保证定位精度 的效果,具体使用步骤如下: 1. 首先升级到 v1.5 SDK 2. 在Unity工具栏,打开 Edit/Project Setting,并切换到 RhinoX Setting 选项卡。 确保 Ground algorithm 字段的设置为 Fusion .. image:: _static/project_setting_v1.5.png .. note:: 如果 Ground algorithm 字段的设置为 Legacy, 则GroundPlane组件会使用旧的非融合版本的定位算法。 现阶段 Fusion 还处于大规模测试阶段,如果您的项目已经在生产环境验证了结果, 可以继续使用 Legacy 定位算法。 3. 在场景中添加一个空的GameObject,在该GameObject上添加CreatesGroundPlaneByJson脚本。 .. image:: _static/bigspace.png 4. 将名称为GroundPlaneConfig.json的文件按如下格式配置好之后,放到头显的sdcard根目录下 .. code-block:: json { "items": [ { "beacon_id": 65, "group_id": 1, "position": { "x": 0.0, "y": 0.0, "z": 0.0 }, "rotation": { "x": 0.0, "y": 0.0, "z": 0.0 }, "coord_system_flag": 0, "confidence_thresh": 0.8500000238418579, "max_distance_thresh": 3.0, "min_distance_thresh": 0.20000000298023225, "drift_recenter_angle_threshold": 28.0, "drift_recenter_distance_threshold": 0.75 }, { "beacon_id": 66, "group_id": 1, "position": { "x": 1.0, "y": 0.0, "z": 0.0 }, "rotation": { "x": 0.0, "y": 0.0, "z": 0.0 "coord_system_flag": 0, "confidence_thresh": 0.8500000238418579, "max_distance_thresh": 3.0, "min_distance_thresh": 0.20000000298023225, "drift_recenter_angle_threshold": 28.0, "drift_recenter_distance_threshold": 0.75 } ] } **beacon_id** 为定位板的ID **group_id** 用来对定位信标进行分组,所有定位信标应保持一致 **position/rotation** 表示GroundPlane的Transform信息,按照GroundPlane在场景中的实际坐标来设置 **max_distance_thresh** 表示最远跟踪距离 **min_distance_thresh** 表示最近跟踪距离 其他值可参照GroundPlane章节介绍,保持默认值即可 .. note:: Legacy 模式下, GroupID字段会被隐藏。 5.5 使用环形控制器 ------------------------------ .. note:: 环形控制器要求 v1.5 或以上的RhinoX MR SDK支持。 v1.5 SDK 兼容了对RingController 和 TagController(上一代方形控制器)的支持。 要使用控制器,只需要拖动如下两个Prefab到场景中: Assets/Plugins/RhinoX/Assets/RhinoX Hand/RxPlayerHand-LeftHand.prefab 和 RxPlayerHand-RightHand.prefab 这两个prefab , 代表左右手 .. image:: _static/RxPlayerHand.png 如果要替换手部模型, 只需要替换 Hand_R_Pose 和 Hand_L_Pose 即可。 .. note:: Hand_R_Pose/Hand_L_Pose 模型对象上的 PlayerHandAnimator 组件不是交互功能必须的组件,替换模型的时候, 开发者可以自己决定是否保留。 在替换模型的时候, RxPlayerHand-RightHand/RxPlayerHand-LeftHand 上的组件需要保留, 否则可能导致交互功能不正常。 **如果自定义控制器射线** 在 RxPlayerHand-RightHand 对象上,有一个 组件 RxControllerAdapter: .. image:: _static/RxControllerAdapter.png 此组件根据所连接的控制器类型,决定模型和射线的锚点。 环形控制器和旧的方形控制器的射线方向是不一样的。 **Hand Anchor_TagController 和 Raycast Anchor_TagController** 这是方形控制器的模型和射线锚点。 **Hand Anchor_RingController 和 Raycast Anchor_RingController** 这是环形控制器的模型和射线锚点。 开发者可以根据自己的实际情况, 改动这两个锚点位置。