解决了一个cocos2dx 在部分 android手机上模板测试错误的问题

解决了一个cocos2dx 在部分 android手机上模板测试错误的问题,第1张

概述在android 手机上,大部分的机器模板测试都没问题。但是有一个奇葩的手机,小米2S, 当只有一层需要模板测试的时候 ,在cocos2dx 里具体地说就是 使用 CCClippingNode 的时候 ,是没问题的 。但是当一个  CCClippingNode 嵌套另外一个  CCClippingNode 时,就会出现各种显示不出来的问题。cocostudio 制作 GUI  里面许多面板,当开启

在androID 手机上,大部分的机器模板测试都没问题。但是有一个奇葩的手机,小米2S,当只有一层需要模板测试的时候 ,在cocos2dx 里具体地说就是使用 CcclipPingNode 的时候 ,是没问题的 。但是当一个 CcclipPingNode嵌套另外一个 CcclipPingNode 时,就会出现各种显示不出来的问题。cocostudio 制作 GUI 里面许多面板,当开启剪裁功能后 ,比如 UIPageVIEw UIScrollVIEw 也都是靠 CcclipPingNode开启模板缓存来渲染的 。

原因没有具体弄明白,但是我用另外一个手段避开了这个问题。

因为是模板测试嵌套模板测试 时,才会有问题 ,并且这种问题很多出现在GUI上 ,GUI 的大背景通常是一个长方形 ,所以就把 GUI 的 renderer ,也就是 RectClipPingNode剪裁时的渲染方式,从使用模板测试,修改为使用剪裁测试,并根据剪裁区域设置 opengl 的剪裁区域, 渲染时从渲染 clipPing node,变为正常地渲染 普通 node .这样就比较完美地避开了了这个问题。

渲染前保存好 scissor相关的 参数,渲染后恢复即可。 cocos2dx渲染其他 opengl 特性的 node 的做法,通常也就是这样子的。具体可以参考 cocos2dx CcclipPingNode 的 visit() 方法。

剪裁测试相关的关键字主要是 GL_SCISSOR_TEST glScissor() 之类的 ,具体API 可以自行查阅 OpenGL 资料。

通过此问题,我进一步地了解了 opengl渲染管线 几个测试的 的意义 和 顺序关系 ,也进一步知道了这几个测试 都是发生在 fragment shader 之后。

并且还了解到了 AndroIDSDK 的一个分析渲染性能和渲染错误的工具 Tracer for OpenGL es,eclipse 如果安装了插件,就可以在eclipse里开启它了。 虽然最后解决问题没用到它,但是感觉这是一个不错的工具 。

具体的用法 官方文档有介绍 。可是山炮 的 小米 2S上也跑步起来这个工具。

解决了这个问题挺高兴,特此记录。

voID RectClipPingNode::visit(){    if (!m_bEnabled)    {        return;    }    if (m_bClipPingEnabled)    {#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)				//	some androID device,such as "mi 2s" do not support stencil test node in stencil test node		//	so when load cocostudio GUI,do not use stencil test,but use scissor test replace it.		bool bEnabledScissorBefore = CCEGLVIEw::sharedOpenGLVIEw()->isScissorEnabled();		CCRect scissorRectBefore = CCEGLVIEw::sharedOpenGLVIEw()->getScissorRect();		//	try to use Scissor Test replace Stencil Test			glEnable(GL_SCISSOR_TEST);				CCPoint worldPos = m_pParent->convertToWorldspace(getposition());		CCPoint anchor = getAnchorPoint();		CCPoint leftDownPos = ccp(worldPos.x - anchor.x * m_clipPingSize.wIDth,worldPos.y - anchor.y * m_clipPingSize.height);		CCEGLVIEw::sharedOpenGLVIEw()->setScissorInPoints(leftDownPos.x,leftDownPos.y,m_clipPingSize.wIDth,m_clipPingSize.height);	//	@temp 0,0		CCNode::visit();		//	restore opengl states		bEnabledScissorBefore ? glEnable(GL_SCISSOR_TEST) : gldisable(GL_SCISSOR_TEST);		CCEGLVIEw::sharedOpenGLVIEw()->setScissorInPoints(scissorRectBefore.origin.x,scissorRectBefore.origin.y,scissorRectBefore.size.wIDth,scissorRectBefore.size.height);#else		CcclipPingNode::visit();#endif    }    else    {        CCNode::visit();    }}
总结

以上是内存溢出为你收集整理的解决了一个cocos2dx 在部分 android手机上模板测试错误的问题全部内容,希望文章能够帮你解决解决了一个cocos2dx 在部分 android手机上模板测试错误的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1027405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存