Skip to content
This repository has been archived by the owner on Dec 13, 2021. It is now read-only.

作者能提供个同步加载AB的接口不 #5

Closed
3wz opened this issue Jan 16, 2017 · 8 comments
Closed

作者能提供个同步加载AB的接口不 #5

3wz opened this issue Jan 16, 2017 · 8 comments

Comments

@3wz
Copy link

3wz commented Jan 16, 2017

目前加载AB的接口都是异步式的, 但同步LoadAB需求也有呀, 作者加载AB从来都是异步的吗, 能在AssetBundleManager里设计个同步加载的接口吗

@tangzx
Copy link
Owner

tangzx commented Jan 17, 2017

对,我们都是异步的,不建议同步,有时会很卡。
因为是依赖树的原因两种都支持的话容易引起加载混乱,要么全都同步要么全都异步,所以我放弃了同步。

@3wz
Copy link
Author

3wz commented Jan 17, 2017

主要是我们这边界面跳转是同步跳转的, 然后我想把背景图片都弄成ab, 然后跳转界面后立即加载背景图片, 我顺便想请教一下 , 你们项目里对于大背景图怎么处理的呢? 现在我发现由于大背景图片不适合打图集, 不打图集又在IOS下不能用于指定压缩格式, 因为不是2的幂次方, 然后大量的背景图片会造成IOS安装后的体积会变的很大, 根本原因是, 在IOS下如果图片不是2的幂次方话, 打包后图片在Unity里显示的图片体积会变成实际安装后占用磁盘空间的量.导致明明图片才几百K, 然后安装IPA后这个图片实际安装后占用磁盘的空间就会变成好几兆. 然后思来想去只能打AB来解决这个问题了. 但我这边由于界面都是同步跳转, 如果异步加载图片会有几帧图片显示不出来.只能同步加载.我目前也在你的代码基础上加了个简单的同步, 然后ab卸载就放在指定界面生命周期内卸载了. 还有我发现如果用Unload(false), 然后当使用ab创建资源对象的游戏对象销毁了, 并且调用Resources.UnloadUnusedAssets(). 并不会卸载ab创建的资源对象. 然后来回这么创建后, 我发现ab创建的资源对象存在了多分, 然后这样就造成内存泄露了. 不好意思, 请教的问题有点多.

@tangzx
Copy link
Owner

tangzx commented Jan 17, 2017

1.我们项目还没涉及到你所说的大图片的问题,所以没研究过哦,我觉得尽量从设计上避免这种情况吧?
2.如果单是只加载一个图片AB的话,你可以自己处理一下,这个不涉及依赖情况,所以加载起来简单。
3.关于泄露问题情况比较复杂吧,最根本原因肯定是哪里对这个对象还有引用存在,profile检查一下引用关系。如果觉得是ABSystem的问题,欢迎提供一个例子工程我测测~

@3wz
Copy link
Author

3wz commented Jan 17, 2017

1.你们项目里大背景都是九宫格拉出来的吗?我们项目由于很多画面都是靠背景图表现内容的.
2.我目前就是在那个Manager里加了个Load同步的方法, 直接返回Assetbundle, 建议你把之前的Load名字方法改为LoadAsync更直观一些~
3.这个我也看了Profiler, 里面显示是有引用, 但是那些引用对象是图片他们自己, 比如一个Sprite, 它显示的就是自己的图片名字的一个对象在引用自己.
4.关于AssetBundleInfo类里面, 如果所有引用对象都被销毁, 为何不直接UnLoad(true)呢. Unload(false)只卸载ab, 但我上面就出现了ab创建出来的资源对象, 它所附着的对象被销毁了, 但是它自己并没有被销毁. 这个我搞个demo再试下, 如果确实是, 我会发给你看下.

@3wz
Copy link
Author

3wz commented Jan 17, 2017

对了还有一个问题是, 如果我想从一个ab加载一个Sprite, 目前的从ab获取资源的方式mainObject是不行的, 里面由于调用LoadAsset(name), 这个方法并不能准确的返回指定类型的对象, 如果把一个图片打包成AB后想要获取上面的Sprite对象,必须用LoadAsset<T>(name), T传入Sprite才可以. 希望您可以改善一下, 我自己的做法是在代码基础上加了个public T LoadAsset<T>() where T : Object方法,对应的Require也添加了个public T Require<T>(Object user) where T : Object方法.

@tangzx
Copy link
Owner

tangzx commented Jan 17, 2017

1.大背景你指的是全屏UI? 是的,我们用九宫,或者是场景3D背景
2.看过一些文章Unload(true) 不建议用的,而且会有这种情况:AB被释放,但实例要存继续存在的, 如果没有引用关系,实例也是会被回收的
3.接口的建议可以考虑加进去,谢谢~

@3wz
Copy link
Author

3wz commented Jan 17, 2017

嗯,Unload(true)我也是在明确对象不存在才用的, 对于那些需要继续存在的实例当然是不能这么干, 但是 看您的代码是从ab创建资源对象是会增加引用计数, 然后持有者销毁的时候会减掉引用计数, 那么意味着当引用计数为空的时候不就是从该ab实例出来的对象都被销毁了, 此时应该可以判定回收全部的吧.直接unload(true), 这样也会减少Resources.UnloadUnusedAssets()的压力.

@tangzx
Copy link
Owner

tangzx commented Jan 17, 2017

这也是为了保险起见,不排除有绕过引用计数而存在的实例

@3wz 3wz closed this as completed Jan 17, 2017
@tangzx tangzx mentioned this issue Jan 30, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants