[Bug反馈]一个NanoVG有关的GLsampler泄露问题

06/0438 浏览BUG反馈
为提高游戏质量,我在使用Tap制造做的游戏中有很多UI内容都采用了Tap制造支持的NanoVG渲染技术。但是逐渐我发现,游戏经常会在运行较长时间后,界面突然崩溃并报错。
(在游戏运行一段时间后,游戏背景变为一片黑,预览左下角提示报错)
于是,我复制了嗒啦啦(即Tap制造AI)的报错日志,并陈述了问题的详细情况,希望嗒啦啦根据报错日志解决这个游戏运行时间较长崩溃报错的问题。嗒啦啦分析报错日志后表示,此问题是由于NanoVG(每帧、每次操作都在)不断创建GPU资源,而从未释放导致。为此,嗒啦啦实施了三个办法:
(1)鼠标节流优化,20秒无点击后自动降至 10fps,大幅降低泄漏速率
(2)冻结增强,冻结时调用 UI.DisableAutoEventsRender() 彻底取消 NanoVGRender 事件订阅,使得冻结后 100% 阻断 nvgBeginFrame 调用,零泄漏
(3)累积安全阀,新增 10 分钟累积渲染计时器,仅在点击/冻结时重置,使得即使鼠标持续活动,也会在 10 分钟后强制冻结。
此办法确实延缓了在游戏中崩溃的时机,但若一个玩家连续游玩较长时间,同样的界面崩溃+报错的故障仍然会出现。随后,我便再度将新的错误日志发给嗒啦啦,并要求其调查故障根本,誓要让其根除此问题。这一次,嗒啦啦给出了肯定的答复:此问题是NanoVG GL3 后端的 C 层bug:每次nvgBeginFrame / nvgEndFrame 调用都会创建GL sampler对象但不释放。
TapTap
由于此问题是 C 层 bug,嗒啦啦无法直接修复。在我的继续追问下,它给出了5个方案,其中较为可行的方案都需要引擎端配合。而嗒啦啦最推荐的方案,是让引擎团队在 NanoVG GL3 后端复用 sampler(创建一次,全局缓存)。故我将此问题反馈上报,希望官方引擎团队能够看到并修复此问题。
TapTap
4
1