大家好,
我在使用 Cocos Creator v2.4.11 版本,尝试将 Live2D 集成到原生 Android 平台时遇到了一个棘手的渲染问题。我通过 cc.RenderTexture 来渲染 Live2D 模型,但在 Android 真机上,始终无法获取到 RenderTexture 颜色附件的 _glID,导致后续创建 Framebuffer 失败。同样的代码在 Web 平台则完全正常。
【核心问题】
在 Android 平台上,执行 new cc.RenderTexture() 和 .initWithSize() 之后,其内部的 _texture(颜色附件)的 _glID 始终无法被创建,而 _depthStencilBuffer(深度模板附件)的 _glID 却能正常创建。
【环境】
Cocos Creator 版本: 2.4.11
目标平台: Android (原生)
【已尝试的解决方案及结果】
我们进行了详尽的调试,并分析了相关的引擎源码(JS 层及 C++ 层),尝试了以下所有方案,但均未成功:
直接创建: 在 update 中直接创建 RenderTexture 并获取 _glID。
结果: 失败,_glID 为空。
onAfterDraw 中创建: 将所有创建和初始化逻辑移至 onAfterDraw,确保 GL 上下文有效。
结果: 失败,_glID 依然为空。
轮询等待: 在 onAfterDraw 中持续轮询检查 _glID 是否被创建。
结果: 在 Web 端,_glID 在1-2帧内出现,成功。在 Android 端,轮询永远在等待,_glID 始终不出现。
使用 cc.Camera 激活 (多种方式): 我们分析源码后确认 RenderTexture 在原生平台存在“惰性创建”机制,需要一个明确的渲染任务(如 Camera)来驱动。
尝试 a: 在 Live2D 节点上直接添加一个以 RenderTexture 为目标的 Camera。
结果: 程序无响应或被系统强杀。
尝试 b: 创建一个临时的、独立的子节点挂载 Camera,并在一帧后销毁。
结果: 程序不再崩溃,但 _glID 依然没有被创建。
尝试 c: 在 b 的基础上,延长临时 Camera 的生命周期。
结果: 依然无效。
尝试 d: 在 a 的基础上,延迟一帧再去轮询检查 _glID。
结果: 依然无效,轮询永远等待。
尝试 e: 在延迟一帧后,手动调用 camera.render()。
结果: 依然无效。
【最终结论】
经过源码分析和一系列 exhaustive 的测试,我们认为:
Cocos Creator 2.4.11 的原生渲染引擎在处理 cc.RenderTexture 时,存在一个深层次的惰性创建或任务调度问题。标准的激活方法(使用 cc.Camera)在我们的测试环境中未能触发 RenderTexture 颜色附件的 GPU 资源创建,反而可能导致渲染冲突。
这很可能是一个我们无法在脚本层面通过现有 API 绕过的引擎底层 Bug。
【寻求帮助】
请问官方技术团队或社区里有经验的朋友,是否遇到过类似的问题?是否有已知的解决方案、补丁,或者对这个底层机制有更深入的见解?
非常感谢!