最近将Cocos2dx接入到了QT中,刚开始渲染挺正常的,后来发现只要项目中使用的Text设置了TTF字体,当点击按钮创建这样的Text时,直接不显示,比如这里的登录账号
于是就开始写测试例,因为项目中有部分hack Text组件的代码,在排查这个问题的过程中,还顺便修复了一个多语言文本编码的bug。
首先排查节点渲染信息,各方面属性完全正常没有问题,甚至排查了顶点数据,都没发现任何问题。
一个更加奇怪的问题是,代码中自动创建这种Text是完全正常的,而通过按钮创建的Text就异常。
首先要明确一点,游戏代码和引擎代码是没有任何问题的,因为win32版本是可以正常运行的,而且已经运行了好久,如果有问题,早就反馈修复了。
当然也有可能是在某种特定情况下,产生的新bug,而刚开始我的排查思路也是在这个方向,费了好大劲,剥离了一个稳定复现的测试例,事实证明,浪费了好多时间,虽然有了测试例,但是仍旧不知道为什么会导致异常。
后来思考了下,应该是QOpenGLWidget的设置导致的,于是排查方向转向这个地方,再次仔细review了win32的代码,一开始怀疑是frameSize,后来有怀疑是DesignResolution,结果都没有发现任何问题,于是开始在Cocos论坛、GitHub上再次搜索Cocos2dx,基本上也没有找到自己想要的结果。
期间使用gDebugger查看有问题的demo,发现TextureAtlas的size竟然不是512x512(cocos的设定,不要问为什么,问就是没有看源码),本以为找到了突破口,后来发现是gDebugger的问题,不知道为啥,有时会显示一个异常尺寸,刷新下就正常了。
后来看到这个仓库,抱着试试看的态度,竟然好使了,但是图片竟然不显示了,frameBuffer的问题?看着不像是啊!
反正最终折腾了一圈,最终定位到应该是可能跟上下文有关系,试了下,最终全部正常了,猜了一圈,对重猜对了。
这也解释了为啥点击游戏按钮创建的Text异常,因为源头来自MousePressEvent,此时是在QT的ui线程里面,需要设置下makeCurrent,把OpenGL的上下文切换过来,才能保证之后的渲染不发生异常,暂且这么解释。