您的位置:首页 > 其它

Q&A——资源管理(十一)

2017-03-31 17:52 127 查看


资源管理

Q1:怎么去掉Mesh中的Colors属性?我把FBX里的LayerElementColor字段都删了,这个Colors还是存在。



默认情况下,在3d建模软件中并不会导出Color属性。以3ds max为例,Color通常是通过modifier添加的,因此只需要在导出前将其删除即可。另外也可以通过fbx
sdk来直接对文件进行处理,但这种做法就需要查看官方的文档了。


资源管理

Q2:请教一下,大家把UI做Alpha分离以后,会把分离前的图删掉吗?我这边把分离前的图删掉了,但是美术反映他们无法使用分离后的图了,因为在预览窗口看不了图。但是我又不想让他们用原来的图,否则还要花精力去维护。大家都是怎么处理的呢?

建议将原图保留(但不与任何资源产生依赖,以免打入发布包中),同时提供给美术一个一键更新的工具,如PSD For UGUI,就能够自动化地处理Alpha的拆分和图片的替换,从而在减少程序的工作量的同时,保证美术的快速迭代。但具体的目录安排、替换规则等,则需要根据项目自己的需求来定。


资源管理

Q3:在加载场景依赖的所有AssetBundle 后调用LoadLevelAsync,在LoadLevelAsync调用完成后, 对所有的AssetBundle调用unload(false),不知这样是否可行。主要想减少Webstream占有的内存。 现在有个问题,场景中的特效,在几次进入视野后会丢图。
场景景物是正确的,可能是什么原因导致的呢?

这种方式是可行的,不过需要注意的是,场景加载后使用Unload卸载的AssetBundle是否以后还会被其他加载的资源所依赖,如有,则不建议进行卸载,否则会出现后续资源丢失的情况。场景中的特效纹理丢失,极有可能属于这种情况。建议研发团队首先判断纹理特效的资源均在哪些AssetBundle中,然后试验在这些AssetBundle不卸载的情况下,多次切换场景,看其特效纹理是否还会丢失,从而来判断该问题是否由AssetBundle的卸载所导致的。


资源管理

Q4:公共AssetBundle太大会不会影响更新包的大小?这个公共包不unload会不会导致SerlizedFile太大,卸载的话会不会导致公共AssetBundle的Asset冗余?

公共AssetBundle的大小主要根据项目的内容和需求定。如果是担心单个AssetBundle较大,那么自行拆分即可。同时,根据Unity 5.3以后版本中新的LZ4压缩特性,单个AB的大小对加载速度已经影响很小。内存中AB中加载得越多,理论上SerializedFile越大,这是天平的两端,需要视自身情况而定。


资源管理

Q5:iOS下PVRTC格式对Alpha通道的支持不是很好,凡是有渐变的图集,失真都很严重。是否把Alpha分离出来,图片的品质就会有所提升? 但是内存会比PVRTC大一倍。

PVRTC格式其实是有损压缩格式,图片压缩确实会出现一定的失真,且过渡范围较大的区域也会出现“色阶”问题,这其实是由其底层算法导致的。将Alpha通道分离出来,从理论上来讲并不会消除上述问题,但目前国内团队中确实有进行如此操作且视觉效果有所改善,所以建议研发团队不妨尝试一下,来看问题纹理的视觉效果是否有所改善。


资源管理

Q6:请教一下,SerializedFile的卸载规则是什么呢?会跟随这AssetBundle一起卸载么?



绝大部分的SerializedFile均由AssetBundle产生,当AssetBundle被卸载时,与其对应的SerializedFile也将销毁。


资源管理

Q7:有没有什么办法可以提升Unity编辑器中代码的编译速度?我们现在每修改一次代码,等待的编译时间都将近半分钟。

对于大型项目来说,这确实是大家经常遇到的情况。一般来说,Unity Editor会按照脚本的依赖关系编译代码,其主要分为以下四个步骤:

编译Standard Assets、Pro Standard Assets和Plugins文件夹中的Runtime Script;

编译以上三个文件夹中Editor文件夹下的Script;

编译项目中所有剩余的Runtime Script(Editor文件夹以外Script;

编译剩余Script(即Editor文件夹中Script)。

知道了Unity编辑器的脚本编译特性后,我们则建议研发团队可以将一些长时间不需要改动的脚本代码(比如各种插件代码)放入到Standard Assets、Pro Standard Assets或Plugins文件夹中,这样这些代码只需要编译一次,后续的时间就都能节省下来。有朋友做过测试,在他们的项目中经过上面的改动,原来项目每次的编译时间从23s下降到7s。想想看,这将节省你和你的团队多少时间!

推荐插件:Mad Compile Time Optimizer (https://www.assetstore.unity3d.com/en/#!/content/34012)

推荐阅读:http://qiankanglai.me/2016/11/27/unity-compiler/


资源管理

Q8:目前所遇到的问题是在UGUI下,无法使用ECT+Alpha分离,函数中已经设置了,但是实际打出来的包并不能显示。我们所使用的Unity版本为5.4.1f,所以特此请教一下是否哪些地方我们使用的不对。

目前看下来,这很可能由Unity的Bug所致: 在对开启了 Compress using ETC1 的选项的Sprite类型的纹理打包时,不会将其对应的Shader(UI/DefaultETC1)打入包内,造成真机运行时Shader丢失,看上去变成紫红色。

解决的方法: 在 Edit->Project Settings->Graphics 的 Always Included Shaders 中加入 UI/DefaultETC1 即可。我们测试用的是 5.4.3f1,所以升级版本应该暂时解决不了。


资源管理

Q9:下图中WWW.LoadFromCacheOrDownload第三个参数是用来验证资源的吗? 感觉跟第二个参数有点相似(除了验证以外), WWW.LoadFromCacheOrDownload在iOS上是否有数量限制?



第三个参数是与资源的验证有关,如果crc值不匹配则需要重新下载或者报错,这与第二个参数并不相同,第二个参数主要用来管理版本更新,通过参数的更改,使得客户端及时更新Cache中缓存的AsseBundle数据。iOS上在Unity 4.x的版本中,通过该接口加载,且同时存在于内存中的AssetBundle数量确实是有限的,接近300个,这是由iOS上文件句柄数的限制导致,而在Unity 5.x 中,由于引入了虚拟文件系统,则不再有这个限制。


资源管理

Q10:WWW.LoadFromCacheOrDownload只是在内存中有个引用,没有实际加载资源,调用WWW.assetbundle后也是么? 那么依赖此AssetBundle的资源加载的时候,会自动触发此AssetBundle从磁盘加载对应的引用资源么?

在调用WWW.assetBundle之后,内存中也只是存在较小的SerializedFile(不包含资源数据)。“那么依赖此AB的资源加载的时候”确实会触发该AssetBundle通过磁盘IO加载资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: