[]3d资源释放的问题

3d场景里,3d场景里,3d场景里,我先dispose或者destory掉了某个texture2d,然后我尝试再去加载显示这张图,怎么也显示不了,具体代码如下:
L3EUQ`6IH~[TGT0H`HDHYZN.png

这个函数尝试创建一个lh然后显示出来,然后删除同时清理一些资源,第二次调用这个函数的时候,被清理图片就显示不出来了。请问怎么解决。
另附上工程。
!!!!!!!!!!!!
额外想问一些问题,也都是3d场景
1.这种加载和释放的方式,第二次以后更之后,本地会有缓存吗,每次都是从网上下载吗,有机会控制缓存的加载吗
2.lh或者ls在loader.create的时候就会把资源加载到显存里面,如果场景上的物件、特效比较多的话,利用lh一遍加载一遍释放,显然很慢,有什么缓解方案吗
3.如果是时常会出现特效,但是特效频次不高,但是特效比较复杂,贴图比较大,粒子数相对比较多,这种应用场景,有什么好的优化方案么
 
 
已邀请:

138*****748

赞同来自: Chiuan

首先,你的代码有问题,为什么要单独加载特效所用的纹理,然后再去加载特效lh文件呢?lh里已经将这个特效相关的资源全部结构化了,不需要你去规划这个特效用到了哪些资源,你只需要creat(.lh)就可以了,laya底层会根据lh里的结构去组织资源。创建完成后,我们就可以通过getRes(.lh)得到这个资源的原型对象,即一个Sprite3D对象,这个原型对象就是你这个特效的“根”,它如果被destry(true),者与这个特效相关的所有资源都会被destry,包括纹理、模型、动画,即会释放出内存。如果你只有一个地方需要用这个特效,你可以直接用这个原型Sprite3D对象,但如果你有多个地方要用这个特效,你就得clone这个对象,克隆实际就是用原型Sprite3D对象来创建多个副本对象,这个速度是比较快的(前提是你特效不要太大、太复杂、太酷炫,不然还是比较耗时,可能会导致卡顿)。当你其他地方用完之后,可以直接destry副本,不会影响到原型。当你完全不用这个特效时,比如切换场景,需要将原型和副本都destry才能释放出内存。以上是3D对象的创建和使用的正确方法。再说3个问题:
1、原型和副本完全destry后,内存会被释放出来,之后要想再次创建这个特效就必须要再次create(.lh),但这时的加载不会像第一次那样那么久,因为浏览器有缓存,会从缓存中加载特效相关资源,所以会比较快。
2、关于场景对象过多,这里我们可以采用视域加载方式来加载,即当对象进入我们视域内时才进行加载,而不是一次性将所有对象都加载。当对象在视域外,可以用active=false,让这个对象隐藏掉,降低渲染消耗
3、只要你持有这个对象的原型Sprite3D,控制好它的active,什么时候显示,什么时候隐藏,都不是问题,如果对象资源过大,你可以预加载。
赏金快拿来........

道道道道道

赞同来自:

代码逻辑看下来没问题,你的这个情况我也很想了解原因。
 
另三:1 缓存是浏览器本身的机制,和引擎无关。引擎里只有运行期间存放于内存中的“缓存,或者JS主动存放于本地的COOKIE、LOACALSTORAGE。通常包括微信浏览器都会缓存网页中的文件资源,因此浏览器会有本地缓存。
2 无法预知该技能下一次的使用情况,所以是否释放缓存也是一个很尴尬的问题,只能业务本身根据应用需求去自行处理。
3 如果是非高频特效又想尽可能复用,只能常驻内存,并降低资源容量,使用的时候创建对象,使用完后销毁对象。  

该问题目前已经被锁定, 无法添加新回复

商务合作
商务合作