1)AssetBundle异步加载被中断的问题
2)LuaDLL.lua_pcall()本身产生开销问题
3)法线在手机渲染时呈现的谬误问题
4)UNITY_MATRIX_I_V 和Camera.main.worldToCameraMatrix.inverse区别


这是第272篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。

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

Resources

Q:在应用异步接口yield return AssetBundle.ASyncLoad的时候,难免会想到:这个异步解决完之前如何Cancel掉这个工作?也就是说一个AssetBundle加载到一半,当初要放弃加载,应该怎么解决?

A1:其实底层调用GetAssetBundleBlocking,会在这个函数外部调用PreloadManager的加载更新逻辑,其实就是把Async操作改成了Sync了,会始终阻塞到AssetBundle加载胜利。

然而也有坑,这儿因为执行了PreloadManager.UpdatePreloading,外部还会做GC。遇到过把不应该卸载的资源给卸载了,说是Unused,然而理论正在应用。

感激黄程@UWA问答社区提供了答复

A2:资源加载治理的第一难题就是异步IO怎么被Cancel掉,或者说从设计上怎么去实现等同的成果。

然而绝对于从Flash到Cocos到Unity来说,Unity还是做的很好的。之前的任何引擎要解决好这个问题,十分之艰难,须要很多代码的反对,包含多线程更低层次的相干代码。这一块Unity做得十分好,咱们不必搜索枯肠去实现异步IO Cancel的问题,只须要做好下层架构,设计出相似的性能。

Unity的异步加载会返回一个Request对象,该对象有一个Get属性AssetBundle,认真查看该Get函数API会发现。当调用该属性时,会促使底层异步IO中断(具体怎么实现的,有C++源码的能力晓得),并立刻同步加载该资源,且回调,回调程序是和你调用程序相当的(比方异步加载调用了2次并设置了回调,当初触发中断并立刻实现,会优先回调异步设置的回调)。

所以基于这个设计一个好的援用计数器治理资源十分重要。

大部分我的项目的援用计数器设计都是待资源实现后增加援用计数。这种设计的实用场景十分局限。在大型项目中应用环境非常复杂的资源加载状况下(异步加载中调用同步,异步加载中须要勾销,异步加载中勾销后立刻同步等)会呈现十分多的未知问题和开发中的局限性,这种设计只适宜微型我的项目疾速开发。

所以一个齐备的援用计数设计应该是调用加载办法时,就生成该资源将来被加载实现后的数据壳子,并增加援用计数(因为加载自身其实也是一次援用,包含bundle.AsynLoadAsset,其实任何的异步加载本身都须要增加一次援用,避免下层代码的逻辑,造成援用计数器非法=0触发bundle.unload办法),实现后缩小援用计数。那么同步加载时须要查找数据壳子,如果该资源正在异步加载,须要调用其request.assetBundle让其立刻中断异步并立刻同步实现加载。(否则同步加载时底层会抛出正告。)

基于这个咱们能够设计一套十分齐备的Cancel零碎,下层调用Cancel时,其实就是让其内部援用-1,因为实践上咱们能拿到的所有接口无奈真正中断一次IO,只有待其加载实现后,发现援用计数等于0时,才会Unload掉资源。

设计思路这里只是抛出一点,具体怎么去实现和设计畅所欲言。只是如果一个资源管理器不能适应任何(绝大部分)加载情景,那么这还是一个资源管理器吗?

感激1 9 7 3-311135@UWA问答社区提供了答复

Lua

Q:为什么LuaDLL.lua_pcall()本身会产生这么大的开销?

A1:是不是Lua本身逻辑耗费比拟高,这个能够看Lua侧的耗费:《Lua Profiler——疾速定位Lua性能问题》。
感激jjjzzz@UWA问答社区提供了答复

A2:lua_pcall只是通过压栈的形式调用了Lua,具体耗费还得在Lua那边看看,预计是某函数C#和Lua疯狂调用比拟厉害。

感激萧小俊@UWA问答社区提供了答复

A3:用DeepProfile能力晓得具体是哪个办法调用高,这里只是C# call到Lua,前面的栈信息曾经没有了,不能单纯的说LuaDLL.lua_pcall()开销大。

感激1 9 7 3-311135@UWA问答社区提供了答复

Rendering

Q:法线在手机渲染时呈现的谬误问题:
用的版本是Unity 2019.4 URP。Editor模式下是正确的,在默认Unity Build的打包正确,将资源打成AssetBundle后渲染呈现谬误。Shader应用了多种,包含默认的Lit Shader,都会呈现该问题。

A:狐疑是渲染管线的Shader问题,变体收集问题,最初一一排除后变成Mesh问题。有好大哥MoMo的奶爸通知我,Unity局部版本的Optimize Mesh Data选项默认关上,会优化掉局部网格,导致以上的问题。

感激题主霸气九号@UWA问答社区提供了答复

Rendering

Q:URP中Shader的UNITY_MATRIX_I_V 和C#中Camera.main.worldToCameraMatrix.inverse获取到的矩阵并不一样,在Shader中用ViewSpace的坐标乘以UNITY_MATRIX_I_V并不可能失去正确的世界坐标,乘以Camera.main.worldToCameraMatrix.inverse则能够,请问他们二者的区别是什么呢?

A:我这边做的测试并没有发现这两个矩阵有什么不同。

fixed4 frag (v2f i) : SV_Target{     fixed4 col = UNITY_MATRIX_I_V[0];     return col;}

在Shader中批改Frag来调用UNITY_MATRIX_I_V:

void Start(){    Debug.Log(Camera.main.cameraToWorldMatrix);    Debug.Log(m_camera.cameraToWorldMatrix);    Debug.Log(Camera.main.worldToCameraMatrix.inverse);}

在C#中打印这个矩阵,从Frame Debugger和控制台输入的后果来看这两个矩阵没有什么不同。

应用URP的Shader Simple Lit,计算逆矩阵之后的后果也是统一的:

感激宗卉轩@UWA问答社区提供了答复

20211025
更多精彩问题等你答复~

  1. Unity增量打包AssetBundle没变动的资源也会被从新打包
  2. 在模型有UV2的状况下开启Generate Lightmap UVs
  3. 如何实现AAB包的增量更新

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

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