问答 开启 Allow unsafe code 的影响

侑虎科技 · 2020年10月19日 · 1000 次阅读

1)开启 Allow unsafe code 的影响
​2)Unity 线性空间下,PhotoShop 制作半透明图片,制作带外发光、内发光的图层的正确导出
3)Unity 中实现完善的暂停机制
4)RenderPipelineManager.DoRenderLoop_Internal 的堆内存优化
5)Unity 2020 版本中 ARBackgroundRenderer 和 ARRenderMode 的相应替代类


这是第 223 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Script

Q:最近项目引进几个插件,以及学习别人的插件,代码中用到了 unsafe 关键字,需要再 project settings 中勾选 Allow unsafe code,之前知道一点是不勾选最好,但是勾选以后到底哪里不好也忘了,也没有勾选之后上线来验证,所以问问大家,是否应该勾选,以及勾选之后有何影响?

A:勾了没什么实际上的坏处,只是由于.net 当初设计的时候是不鼓励使用 unsafe 代码的,所以在编译器默认设置这个门槛,鼓励大家尽可能使用安全的代码(也就是不要直接操作原生内存地址)。

但是,很多高性能的 C# 代码为了最大限度地高效访问内存,不可避免要用 unsafe,只要保证 unsafe 代码被限制在较小的范围并严格测试保证不会出内存访问错误,对整个工程来说就不是大问题。

感谢招文勇@UWA问答社区提供了回答

Texture

Q:大家好,因为项目是 PBR 项目,所以 Unity 使用线性空间,现在在制作 UI 的时候,带透明通道的图片,混合时候就会出错。

我们前后试了几种方法:
1. 改 PhotoShop 的工作空间为线性的,定义 Gamma 为 1.0:

2. 单独改用灰度系数混合 RGB 颜色:1.00,这样大部分情况下,Unity 中效果 PhotoShop 中效果就是一致的:

3. 改 Unity 渲染管线。

以上方法都有一些局限和问题。

1. 普通不透明图层有些渐变效果无法绘制,因为线性空间下的暗部颜色精度不够;
2. PhotoShop 制作带外发光、内发光的图层合并之后会错误:

3. 因为用的还是内置 Forward 管线,影响太大,低端机效率低下,暂不考虑。
我们最终采用的是第二种,美术还是在 Gamma 工作空间作图,只是图层混合采样。

最后想问下大家,针对线性空间下的半透明图层如何导出?
或者有没有什么办法能处理这种外发光、内发光图层问题?

A1:目前公司项目都采用 Linear 方式,美术直接修改 PhotoShop 设置,出图过后,在 Unity 中测试,能与原图是一个色彩,之前也尝试过其他办法,如 Shader 修正,但是都有一定的问题,目前采用的这种方案,暂未发现问题。

感谢范超@UWA问答社区提供了回答

A2:用下图的配置,在 PhotoShop CC 2019 里试了下,只要不合并图层,直接导出 png,再放到 Unity 中就没有问题。另外如问题中的例子,只要从下向上合并图层(带着背景),最终结果就没问题。可能是 PhotoShop 的 Bug。

就我和美术了解的情况,他们很少合并图层。一般导出就是把不需要的图层隐藏了。所以这种情况应该是可以避免的。

感谢张首峰@UWA问答社区提供了回答


Script

Q:目前使用 TimeScale=0 来暂停游戏,但是在 UI 上不想让特效和动画暂停,而在某些战斗场景,只希望暂停一部分逻辑。如果把 TimeScale=0,就要处理 ParticleSystem、TrailRenderer、Spine 动画等组件,特别是 TrailRenderer 和 Spine 都需要修改源码。如果不用 TimeScale=0, 是不是就要在框架层就处理好各模块的更新逻辑?

A1:常规的做法确实就如你说的,不用 TimeScale=0,各个地方去实现暂停,然后统一管理。

感谢邓永健@UWA问答社区提供了回答

A2:可参考这篇文章:《Unity Chronos - Time Control 时间控制器》

感谢黄程@UWA问答社区提供了回答


Mono

Q:项目采用了 URP,用 UWA 进行了初步测试,发现 RenderPipelineManager.DoRenderLoop_Internal 分配了很多堆内存,这个函数是 URP 中的内置函数吗?应该如何定位问题进行优化?

A:这个函数是内置用于 SRP 的总函数,不过分配堆内存的很有可能是题主自己写的 C# 函数。从图中来看,目前堆内存分配的太多了,建议通过 GOT(Online)中的 Mono 模式来进行测试,就可以看到其具体的堆内存分配情况了。通过 “倒序” 查看方式,可以直接查看分配的最低级子函数,如下图所示。


以上回答由 UWA 提供


Editor

Q:请问下,以下这两个类现在有替代类吗?是怎么规划处理的?
UnityEngine.XR.ARBackgroundRenderer
UnityEngine.XR.ARRenderMode

以上这两个类经测试:
Unity 版本:2020.1.4f1c1,找不到;
Unity 版本:2019.4.7f1,找得到。

我又试了下当前最新的 Untiy 2020.2.0b6 版本这两个类也没有。
看了些资料,Unity 2020 版本后,这两个类应该就被删除了。

A:Unity 新版本将很多功能都是以 Package 的方式导入,关于 AR 从 PackageManager 中导入 AR Foundation 包,ChangeLog 中有提到 ARBackgroundRenderer 已经在某个版本重命名为 ARCameraBackground,AR/VR 开发可能需要熟悉一下相关的 Package,如下图:

感谢羽飞@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册