1)获得将要生成的资源的GUID
2)多个小资源包合并为大资源包的疑问
3)模型Meta中的hasExtraRoot参数的作用和历史原因
4)合批注意点
这是第333篇UWA技术知识分享的推送,也是《厚积薄发 | 技术分享》第三回,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
UWA社区主页:https://community.uwa4d.com
UWA QQ群:465082844
Asset
Q:假如需要导入一个FBX文件,并且同时修改一些导入设置的情况。如果先导入,生成GUID,再修改,就会出现两次Import流程。资源量大的情况下就会浪费大量的时间。
设置本身倒是简单,可以通过文本创建Meta。但是资源的GUID是个比较麻烦的问题。因为需要保证不重复,并且和路径有一定关系。
如果使用未来导入资源路径生成GUID,应该使用怎么的操作?
A1:我最近也有类似的需求,我的做法就是先准备一份“导入设置”的模板Meta,里面的GUID是项目中已经存在的。然后在生成对应或者修改对应资源的时候,直接拷贝那个模板Meta。然后如果要导入的资源本来已经导入过了,就将GUID替换回去。如果是新导入的资源,Unity则会自动帮我重新生成一个新的GUID,我不用管,这样导入会快很多。
感谢junbin.liu@UWA问答社区提供了回答
A2:建议在导入的时候直接做修改,可以试试Unity 3D的OnPostprocessAllAssets。
感谢贺帆@UWA问答社区提供了回答
AssetBundle
Q:看有文章说可以利用接口LoadFromFile(string path, uint crc, ulong offset);来实现资源包合并为一个打包,且能减少IO操作,不知流程是否是如下理解:
合并前:
资源包A:assets_res_a.bundle
资源包B:assets_res_b.bundle
合并前对资源包的加载方式:
AssetBundle a = AssetBundle.LoadFromFile("assets_res_a.bundle");
AssetBundle b = AssetBundle.LoadFromFile("assets_res_b.bundle");
合并后:
资源包AB:assets_res_ab.bundle
并且记录了a、b在大包(ab)中的offset(A包的offset=0,B包offset=12)
合并后对资源包的加载方式:
AssetBundle a = AssetBundle.LoadFromFile("assets_res_ab.bundle", 0, 0);
AssetBundle b = AssetBundle.LoadFromFile("assets_res_ab.bundle", 0, 12);
从接口上看,合并后并没有减少IO操作,仍是两次对assets_res_ab.bundle的读取,除非引擎内部有做优化,当第一次读assets_res_ab.bundle有IO,在没释放情况下第二次读就不是IO了,求指点迷津。
A:AssetBundle已经是一个VFS了,再在上面多管理一层,从各方面来说不合理,还有可能出现IO句柄持有冲突的问题。
上面所谓的减少IO,不是减少IO本身的读取量,只是少了一个IO句柄,直接把两个原始资源打到一个Bundle内,其实是一样的。那么问题就变成了怎么合理打包Bundle。
感谢1 9 7 3-3111356@UWA问答社区提供了回答
Asset
Q:模型Meta中的hasExtraRoot参数是做什么用的?有什么历史原因么?
模型Meta中有个奇怪的参数hasExtraRoot,看起来是humanDescription旗下的,但实际会对任何类型的模型都造成影响。
这个参数无论是在API还是在编辑器界面,都找不到调整的地方。当前项目中一部分是0,一部分是1。观察得出,这个在为1的情况下,会保留外层无Mesh关联的Transform;为0的情况下会移除顶层Child不超过1,并且无Mesh的Transform。
不知道这是怎么生成的,是不是为了适配某些历史版本呢?
A:可以参考下:
FBX import: humanoid rig creates extra GameObject ("hasExtraRoot") - Unity Forum
感谢野生西瓜@UWA问答社区提供了回答
Rendering
SRP的合批注意点
SPR Batcher适用于URP管线,只需要材质所用到的Shader变体相同就可以合批的。不过,UGUI和粒子的DrawCall走Unity自己的合批逻辑,因而SRP Batcher不适用;而包括SpriteRenderer在内等使用MaterialPropertyBlock修改材质的情况都会打断SRP Batcher。
另外,需要注意RenderQueue穿插,GPU Instancing的优先级要高于SRP Batcher,更隐形的问题是在Editor上SRP Batcher合批成功,但是在真机上合批失败的问题,比如Unity的版本导致OpenGL ES的API导致SRPBatcher在真机上合批失败的问题,再比如CBuffer里面的变量没有在材质球的Property里面,也会有相似的问题。
期待更多讨论,欢迎大家转至UWA社区交流:
https://community.uwa4d.com/blog/detail?id=1549710791670226945&entrance=0
静态合批有什么注意点
静态合批分两种,一种是提前在Editor中处理,一种是在Runtime时动态处理,要求同种材质才能合批。
当然,也有缺点,当子模型存在重复时,可能会使Mesh内存占用变大。也就是为什么大家都说静态合批更消耗空间。
期待更多讨论,欢迎大家转至UWA社区交流:
https://community.uwa4d.com/blog/detail?id=1551869522570895362&entrance=0
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844