官网的开发配置:https://docs.microsoft.com/en-us/windows/mixed-reality/develop/install-the-tools?tabs=unity
https://www.pianshen.com/article/5565687323/
开发环境设置:
一、Mac 虚拟机(ParallelsDesktop 13)配置HoloLens开发环境: https://blog.csdn.net/w530248323/article/details/79033297
设置启用开发人员模式
VS 的安装与设置:勾选安装Universal Windows Platformdevelopment组件
选择Game Development with Unity 组件,并取消选择Unity Editor的安装
Unity 端的设置: 务必选择Windows Store .NET Scripting Backend
HoloLens Emulator的设置: 系统需开启Hyper-V, 控制面板→程序→启用或关闭Windows功能,勾选 Hyper-V 的两个选项
下载并安装HoloLens Emulator and Holographic Templates (build 10.0.14393.1358),最好挂VPN
MixedRealityToolkit-Unity
https://github.com/Microsoft/MixedRealityToolkit-Unity
Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10):https://www.pianshen.com/article/5565687323/
一、启动盘重启的Windows虚拟化是 打开的状态,在任务管理器下可看到虚拟化是否已打开
二、软件安装:Visual Studio 安装 ,Hololens模拟器安装,Unity 5.5 安装
三、HoloLens模拟器网络连接:
在任务栏搜索框输入H,打开hyper-管理器,然后选择交换机管理器,选择外部网络,并选择自己的网卡
Hololens官方教程精简版 - 04. Gesture(手势):https://blog.csdn.net/yurichou/article/details/54286638
Hololens For Unity性能优化:https://docs.microsoft.com/zh-cn/windows/mixed-reality/develop/unity/performance-recommendations-for-unity#reduce-poly-count
混合现实应用(尤其是针对Unity)的性能优化:
1. Unity Quality settings,set to Very Low :
Edit > Project Settings > Quality, select Very Low-quality.
2.Lighting settings对性能影响也很大,关掉Realtime Global Illumination:
Window > Rendering > Lighting Settings > Realtime Global Illumination,
改为使用Baked Global Illumination,但不适合Hololens,因为烘焙全局光,只适合静态GameObject,
而Hololens中是未知的环境和改变的环境。如果是VR就合适。
Realtime Global Illumination is set per-scene,所以每个场景都要保存。
3.Single pass instancing rendering path, 因为MR应用中,场景被渲染两次,一个眼睛各一次;
Edit > Project Settings > Player > XR Settings)
选择Single Pass Instanced 在the Stereo Rendering Method下拉列表(Virtual Reality Supported checkbox must be checked)
4.建议使用IL2CP(尤其对于UWP应用);但IL2CPP build时时间长一些,下面有一些方法可减少编译时间:
4.1.每次build到同一个目录下,这样重用了pre-build file.
4.2.让anti-malware software不扫描你的项目目录和build folders:
Windows安全中心,病毒和威胁保护,添加或删除排除项下,添加上面两个目录
4.3.使用SSD
//对于大型项目,多人共享的,可考虑使用Cache Server
6.设置Holographic的Tracking Loss Image :
Edit > Project Settings > Player,Windows Store tab and open the Splash Image
也可以设置自定义跟失的处理事件:https://docs.microsoft.com/en-us/windows/mixed-reality/develop/unity/tracking-loss-in-unity
7.支持的功能Capabilities配置:
Edit > Project Settings > Player,
Windows Store -> open the Publishing Settings
CPU方面的性能优化:特别是Unity和C#代码:
1.在缓存引用(在Start或Awake中),不要在重复回调(如Update)中调用GetComponent()
2.最好使用Type类型来GetComponent(Type type),而使用string传参,性能开销更大
3.最好不要使用LinQ,因为它需要更多的计算和内存开销,而自己手动写算法
4.Unity自带的一些API,性能开销大,可通过缓存引用或创建组件管理者来管理:
GameObject.SendMessage()
GameObject.BroadcastMessage()
UnityEngine.Object.Find()
UnityEngine.Object.FindWithTag()
UnityEngine.Object.FindObjectOfType()
UnityEngine.Object.FindObjectsOfType()
UnityEngine.Object.FindGameObjectsWithTag()
UnityEngine.Object.FindGameObjectsWithTag()
5.注意装箱:值类型 -> 引用类型, it's wrapped in System.Object,储存在托管堆上,需要分配和GC回收。在某些情况下可避免的,使用具体类型,而不是object
6.Unity的自带的空回调函数,要去掉,会带来开销的,因为Unity底层是托管与非托管代码的调用。
7.专用的单一实例类或服务来处理投影到场景中的视线:
UnityEngine.Physics.Raycast()
UnityEngine.Physics.RaycastAll()
8.在初始化时实例化所有对象,并使用对象池在应用程序的整个运行时中回收并重复使用 GameObje
9.一般情况下,不建议将字段和函数标记为虚拟,除非明确要求覆盖此成员(因为虚成员会带来开销)
10.避免按值传递:结构是按值传递的,会复制增加了CPU 开销以及堆栈上的附加内存,对于大的结构或每个帧重复调用的函数,考虑按引用传递
11.限制物理特性上花费的时间或一秒钟内迭代的次数,以减少模拟的精度, 通过调用TimeManager的时间频率
12.Collider的性能排序:Sphere < Capsule < Box <<< Mesh (Convex) < Mesh (non-Convex)
13.动画: 通过禁用动画程序组件来禁用空闲动画(禁用游戏对象不会产生相同的效果)
14.复杂算法:如果应用程序使用复杂算法,例如逆向运动、路径查找等,自己找到简单的方法来提高性能
从CPU到GPU的性能建议:
1.重新构建应用程序的绘制调用来限制状态更改(例如 不同的材料等)可以大幅提高性能,如drawcall batching
2.Single pass instanced rendering(单通道实例化渲染),Edit > Project Settings > Player > XR Settings,....
3.静态批处理: 共享相同的材料;2)全部标记为 Static。 标记为 Static 的 GameObject 无法在应用程序的整个运行时中移动。 因此,在Hololens上很难用到静态批处理;而VR头显中可以使用,从而改善性能。
4.动态批处理:对GO的条件:) 共享相同的材料;b) 符合其他很多条件(联的网格数据不能超过 300 个顶点)
在运行时修改 Renderer.material 属性会创建材料的副本,因此可能会中断批处理。 使用 Renderer.sharedMaterial 可以修改各个 GameObject 的共享材料属性。
Unity 中的每个渲染器具有自身关联的绘制调用,而不是通过一个渲染器提交合并的网格
GPU的性能建议:
1.勾选Enable depth buffer sharing,建议选择16-bit depth(尤其是Hololens)
当使用Mixed Reality Toolkit Standard shader, to render depth for transparent objects:
透明材质使用MRTK Standard shader, Fix Now(sharing warning),Render Mode选择Transparent,且把Depth Write set to On.
2.为防止Z-fighting,把Camera的远近裁剪面距离设少一些,如100m
//注:当使用16位深度时,Unity不会创建stencil buffer; 然而ugui的一些UI effects及other stencil-required effects需要24位深度格式(因为创建8bit stencil buffer).
3.避免全屏效果(如后处理的anti-aliasing,bloom等
4.优化光照设置:窗口” > “渲染” > “照明设置”> 取消选中“实时全局照明”,为每个 Unity 场景文件禁用“实时全局照明” 。
建议禁用所有阴影投射,因为这也会将高开销的 GPU 通道添加到 Unity 场景中。 可以按光源禁用阴影,但也可以通过“质量”设置对其进行整体控制。
转到“编辑” > “项目设置”,然后选择“质量”类别 > 为“UWP 平台”选择“低质量”。 还可以直接将“阴影”属性设置为“禁用阴影”。
5.减少多边形计数,方法如下:1).场景中删除物体;2).抽离资产;3).LOD的使用
了解Unity中的Shader:
1.查看:shader中右上角的齿轮 -> Compile and show code
2.Fragment Shader中调用的次数多很多,所以重点优化Fragment(Pixel)Shader:
2.1.不要使用内置的PBR着色器,而使用混合现实工具包提供针对混合现实项目进行优化的 MRTK 标准着色器供针对混合现实项目进行优化的 MRTK 标准着色器
2.2.着色器预加载
2.3.限制过度绘制(在Scene view mode中选择OverDraw),使用Occlusion Culling来避免
内存建议:过多的内存分配和解除分配操作可能对全息应用程序产生负面影响,导致性能不稳定、帧冻结和其他不利行为
垃圾回收(GC):不能频繁的分配和解除分配,优化GC回收的方法:
在Start或Awake中缓存组件或引用;
使用StringBuilder生成复杂字符串
删除不再需要的 Debug.Log() 调用,或通过宏判断来开关是否编译调用
如果全息应用通常需要大量的内存,请考虑在加载阶段(例如,在演示加载或过渡屏幕时)调用 System.GC.Collect()
对象池的使用:非对象池常适合应用中生存期可变的可重用组件
启动性能:AsyncOperation.allowSceneActivation先设为false,待加载完成后再设为true。