使用 RenderTexture 实现合图功能是否可行?

最近在做通过动态合图来减少 spine 换装drawcall 的功能。遇到一个问题:
在微信小游戏环境下,为了减少内存消耗 CLEANUP_IMAGE_CACHE 宏默认开启,Texture 加载完成后,原始的 image 就会被释放。所以动态合图无法完成

有两个思路:

  1. 对于需要动态合图的资源,通过在加载时记录 uuid, 并重写 Texture.prototype._assignImage,达到不释放指定资源图片的目的。
  2. 选用 RenderTexture 作为最终的图集,并使用FrameBuffer 的方式,将碎图绘制到 RT 上。

现在第一个方案已经实现了,不过对引擎加载管线有hook。
不清楚第二个方案的可行性和性能怎么样, 欢迎大佬讨论

基于第一个方案,以及对 spine 的一些修改,已经跑通了在微信小游戏上使用 cocos spriteframe对 spine 动态换装,并最终一个 DC 的方案。后续有时间会整理帖子分享,也欢迎大家讨论

你只要看一下引擎源码就知道, cc的动态合图其实就是把散图合到RT上, 所以方案二是没有问题的

引擎代码中的合图和方案二并不是一样的。
引擎内合图:

  • 输入源是 cpu 端的图片数据,既 HTMLImageElement 之类的数据,所以它要求CLEANUP_IMAGE_CACHE开启,不能释放原始数据。
  • 目标是普通的 Texture
    image

而我说的方案二基于 FBO 的动态合图,输入输出都是显存内的贴图。所以它可以在原始图片被释放之后调用。
更接近下面这个函数的实现。
image

我分析下来,方案一原始贴图可以不上传到显存。所以内存可能也不是问题。
方案二更尊重引擎的资源管理流程。但是可能在于频繁的切换 FBO 在移动端可能有性能瓶颈,但是这一块我不太熟悉。