1)Shader打AssetBundle包变体失落问题
2)Unity降级后在iOS平台的贴图导入问题
3)字体文件AssetBundle包解体
4)给主相机设置RT的注意事项
5)FBX的导入WeldVertices的设置问题
这是第271篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
AssetBundle
Q:Unity官网后处理PostProcessing,进行AssetBundle打包时,变体太多(4000+),批改了uber.shader,屏蔽了我的项目中不可能应用的关键字(前期要应用也能够通过热更批改)。
AssetBundle打包后,发现变体没齐全打包,Editor下查看Shader变体数量是300+,打包后应用AssetStudio查看AssetBundle,发现只打了100+的变体,大部分失落。运行通过断点调试也验证了所有Key均设置,FrameDebug中也失落了一些关键字。
uber.shader下所有关键字均是multi_compile 定义,实践上multi_compile定义的关键字都会全编译所有组合,然而打包后呈现失落。
A:在进行单元测试中,在一个空我的项目中打包uber.shader,发现打包后,变体正确。然而开发我的项目和打包我的项目仍旧生成不正确。狐疑是Unity缓存起因。于是删除Library目录下shaderCache,再次打包,还是不正确。再次删除已生成的AssetBundle资源,齐全从新生成,终于正确。
所以multi_compile定义的关键字打包呈现问题,须要删除缓存和已生成的AssetBundle能力最终正确生成新的AssetBundle。
感激题主1 9 7 3-311135@UWA问答社区提供了答复
Asset
Q:咱们始终用贴图后处理脚本对贴图进行导入,在iOS平台应用ASTC_6x6格局。然而降级到Unity 2019,关上iOS工程,经同步缓存和导入实现后,大部分贴图的预览界面上并没有显示压缩格局和压缩后的尺寸,而是显示no yet compressed,仿佛导入操作没有实现。Android平台并没出问题。
这样的贴图会显示含糊,并且打出的Bundle还会更大。手动Reimport能够解决。然而如果另外建设一份工程拷贝,则又会呈现同样的问题。求问有什么解决办法?
A1:经查,是我这边的纹理资源导入后处理脚本(iOS)有问题,然而其在Unity 2018下不会体现进去,然而在Unity 2019中会间接让某些贴图的导入工作无奈实现。因为应用了 Unity Accelerator(也就是Asset Pipeline v2对应的缓存服务器),从新导入也不会生成新的缓存,只能让进行从新导入的我的项目部分失常。
咱们的导入后处理脚本中在iOS下,对JPG独自应用了不带通明通道的ATSC压缩。在Unity 2019中,ATSC压缩不再辨别是否带通明通道。批改脚本+删除Unity Accelerator缓存+从新导入某个Working copy(同时也重建了缓存)可解决。
留神:上述无奈导入实现的状况,打出包来会有两个显著的问题:包体变大、图片含糊。
感激题主加菲教主@UWA问答社区提供了答复
AssetBundle
Q:AssetBundle打包参数BuildAssetBundleOptions.DisableWriteTypeTree。会极大缩减AssetBundle包大小,同时也带来运行时SerializaFile雷同数量级下内存占用缩减一半左右,并进步加载速度。
官网阐明比较简单:如果开启DisableWriteTypeTree选项,则可能造成AssetBundle对Unity版本的兼容问题。基于其带来的运行时劣势,还是决定应用该选项。
导出测试包所有运行失常,热更新也运行失常,原本认为该优化就完结。然而起初发现雷同的AssetBundle资源,在编辑器下AssetBundle运行会解体(必然呈现),导出的测试包(所有平台)一切正常。(该问题必须要解决,因为游戏公布后线上的问题能够在本地调试复现,如果本地不能运行AssetBundle包或者运行不同的AssetBundle包原则上不容许。)
A:开始排查问题:首先定位到解体的资源,是TMPTextPro相干的字体资源包(复合包,蕴含了多个资源内容)。
验证BuildAssetBundleOptions.DisableWriteTypeTree的影响,屏蔽BuildAssetBundleOptions.DisableWriteTypeTree打包参数。打包后编辑器运行不解体,必定了该参数造成的问题。(这里过后猜想是Unity外部代码的某个宏导致的,导致了在Editor下和公布时走了不同的解析代码,然而又没有源代码,无奈具体验证。)
开始排除问题:
首先排除Unity的编辑器缓存造成的该问题,重置后仍旧解体。开始拆解问题包,将所有资源内容单个打包(一个资源对应一个包)。最初精确定位到是TMPTextPro的字体FontAsset资源包调用AssetBundle.LoadAsset()办法时解体。
剖析问题:设置DisableWriteTypeTree参数将不在AssetBundle中蕴含相干的文件TypeTree信息,是因为没有该信息后导致的反序列化不正确,为什么其它资源能失常解析,就单单FontAsset会呈现问题?关上TMP_FontAsset.cs源码,查看发现这么一段代码。
#if UNITY_EDITOR////// Persistent reference to the source font file maintained in the editor.///[SerializeField]internal Font m_SourceFontFile_EditorRef;#endif
发现它竟然在可序列化类中退出了条件编译,造成导出运行和编辑器运行该类的实现不一样。
这就是为什么导出包运行正确,编辑器解体的起因。因为AssetBundle打包时的UNITY_EDITOR是不成立的,会设置对应平台的宏。所以打包时FontAsset资源的数据是不蕴含m_SourceFontFile_EditorRef该属性的序列化信息,未开启DisableWriteTypeTree时,因为有TypeTree信息,编辑下运行程序能通过TypeTree信息正确反序列化,当设置DisableWriteTypeTree时,反序列化失败,间接解体。
解决:给属性m_SourceFontFile_EditorRef增加标签[NonSerialized],再对应批改一些Editor代码,让性能在Editor下也正确。
感激题主1 9 7 3-311135@UWA问答社区提供了答复
Rendering
Q:用setTargetBuffers办法将一张低分辨率RT设置给主相机。在屏幕分辨率不变的状况下,对场景相机做了降级。而后呈现了一个问题是:所有的后处理都生效了,查看后发现所有OnRenderImage办法的Source都为null(我了解为没有设置Rendertarget,默认为屏幕)。我将下面那张FrameBuffer强行代替Source传入后处理,查看FramedeBugger,后处理几个Draw Call能失常渲染,然而仍旧不能对最终成果失效,也就说没有写入到下面的FrameBuffer。
我之前的解决办法是魔改所有OnRenderImage,传入FrameBuffer代替Source,输入到另外一张FinalBuffer,最初再绑定到屏幕上,上面是测试代码。
但我的项目中后处理比拟多,且ImageBuffer仍存在后处理中,无端减少了RenderTexture的开销。
当初的解决办法是间接设置TargetTexture,但逻辑操作上会绕一层。想问下引起下面的起因,或者说有什么更好的解决办法?
环境是2019.4.3f + built-in + OpengES3.0,而后再用CommandBuffer将低分辨率适配到高分辨率。
A1:实际下来,倡议还是用CommandBuffer来操作,比拟灵便:
- OnPreRender阶段先设置好TargetBuffer(ColorBuffer:RTA、DepthBuffer:RTB)。
- 应用CommandBuffer在CameraEvent.BeforeImageEffects或者AfterImageEffects这个事件上做所有的后处理。
- 外围在于第一次Blit的Source为ColorBuffer,最初一次Blit的Destination为BuiltinRenderTextureType.CameraTarget,两头能够交叉任何后处理成果。
而且如果发现改了ColorBuffer的分辨率,画面没有失常缩放,须要第二步后处理的CameraEvent改为AfterEverything:
还有就是如果改了TargetBuffer,须要对SceneCamera做非凡解决。
感激范世青@UWA问答社区提供了答复
A2:下图是这两种办法的试验比照,至于两者区别的根本原因,是其办法外部实现的差别:SetTargetBuffers的实现过程是没有设置渲染指标(也就是屏幕)的RenderTexture的,这也就是为何用该办法时OnRenderImage中的Source是null。
该问答由UWA提供
Asset
Q:问下在FBX的导入设置外面,weldVertices是须要设置为True还是False?
A:倡议设置为True。雷同顶点会被合并,能够缩小内存和Mesh渲染的压力。
感激萧小俊@UWA问答社区提供了答复
20211018
更多精彩问题等你答复~
- Unity增量打包AssetBundle没变动的资源也会被从新打包
- 在模型有UV2的状况下开启Generate Lightmap UVs
- 如何实现AAB包的增量更新
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)