Skip to content

问题描述

我们的2d新项目使用了tilemap制作地图,后面美术想在角色展示界面使用spine动画展示角色服装等。结果在使用spine动画后,地图的纹理显示不正常了。 具体的表现是当我们使用一个旋转的硬币作为测试资源时,地图的纹理会随着硬币旋转发生闪烁。

解决过程

因为地图模块之前一直是正常的,所以我们怀疑是spine动画模块哪里有bug导致的,但是对比了一下官方的cocos版本看起来也没有对应的bug修复或者bug报告。 并且我们当时用原版的引擎里面测试spine动画和tilemap都是可以正常显示,后面就怀疑是我们修改了tilemap模块的代码导致出现了问题。 我们的tilemap部分为了能使用项目组这边祖传的自定义资源格式以及支持边玩边下的模式,对原有的timemap模块做了一些改造。 一开始怀疑是否是读取tilemap数据的时候出现了问题,一路排查相关draw和ondraw里面的代码都没有发现有什么问题。 最后决定转换思路,用intel GPA工具抓帧分析最终传给显卡进行渲染的数据,看看能不能找到更多线索。果然抓帧之后发现地图部分的顶点索引完全错乱了。 最后回头查了一下地图模块的顶点数据处理代码,发现它获取glview render持有的共享vbo,并且直接使用了,而这个vbo是引擎多个模块都在使用的。 之前刚好只有tilemap模块使用因此没有问题,这次引入的spine动画也需要用到这个vbo,而且引擎部分的数据写入是在地图顶点数据写入之后才写入的,因此地图部分的数据就被覆盖了。 后续地图模块改为单独申请一个vbo,不再强行获取外部的vbo使用。

未完待续