hiloteam / Hilo

A Cross-end HTML5 Game development solution
https://hiloteam.github.io/
MIT License
5.94k stars 863 forks source link

如何将舞台上的元素销毁, queue加载的图片销毁? #147

Closed zhangrunhao closed 5 years ago

zhangrunhao commented 5 years ago

现在遇到问题是: 不断的操作, 会不断的 new 出新的舞台. 但依旧使用已经加载好的图片.

内存会剧增.

希望作者大大, 能够提供一个思路, 去除已经画出的图片

zhangrunhao commented 5 years ago

也就是如何将new Hilo.Bitmap 中占有的内存, 或者queue.add()的资源释放掉

zhangrunhao commented 5 years ago

通过, queue.getConent() 获取到的img标签, 指向null, 能否销毁

06wj commented 5 years ago

直接 queue = null 就行

zhangrunhao commented 5 years ago

@06wj 如果不想把队列清空, 只是把队列中的某个元素清空呢?

06wj commented 5 years ago

可以先这样删 queue._source[i] = null

我今天加个接口。。queue.remove

zhangrunhao commented 5 years ago

@06wj 感谢. 两个问题:

  1. 删除queue中的元素, 是为了删除loader中类似img标签中加载的图片数据?
  2. 如果已经通过Bitmap绘制到stage上的图形, 会不会被删除? 如果不会, 如何删除?
  3. 因项目中有多个舞台, 有什么办法, 可以摧毁一个舞台上全部元素, 释放出舞台使用的全部内存?
06wj commented 5 years ago

@zhangrunhao 增加了 loadQueue.removeContent

只要删了js引用就释放内存了, queue removeContent是删掉queue里的引用

zhangrunhao commented 5 years ago

@06wj 如果是已经绘制到canvas上面的bitmap呢? 删了引用, 也会删掉内存吗?

zhangrunhao commented 5 years ago

@06wj 您好, 想和您询问下, 如果清理掉已经绘制到canvas上的图像..

现在使用的是removeFromeParent()方法, 并使new出来的view, 指向null, 无法成功释放缓存.

06wj commented 5 years ago

bitmap删掉引用就行

zhangrunhao commented 5 years ago

@06wj 好的, 非常感谢.

zhangrunhao commented 5 years ago

@06wj 您好, 现在已经确认, 可以删除loader加载过来的资源所占用的内存.

并可以释放 Bitmap中占用的内存.

当序列帧, Sprite中图片使用Image对象的内存, 可以释放, 但是一旦用Spite渲染到舞台上, 删除饮用后, 内存不会被释放.. 如果重复渲染序列帧, 每次删除引用的情况下, 内存还是会一直涨.

zhangrunhao commented 5 years ago

需要把 _frames 清空?

06wj commented 5 years ago

sprite = null....

zhangrunhao commented 5 years ago

@06wj 已经这样做了, 没有效果..

zhangrunhao commented 5 years ago

@06wj 您好, 作者大大, 上个游戏写的卡的原因, 已经找到了, 还是想和您分享这个事.

所有的image cache, 还有 js 内存都清空的情况下,, 内存依旧会涨的原因是, 有一个GPU 的缓存. GPU Program cache. 不太清楚自己理解的对不对. 就是浏览器需要把图片转换成给GPU识别的shader程序, GPU缓存了这个转换后的着色器程序.. 就造成了内存的不断增长.

也是因为自己项目中, 用了大量的大图的序列帧.

我自己写的一个总结

也不清楚自己理解的是否正确, 如果可以的话, 想听听您的意见和建议.