Cocos2dx报OpenGL error 0x0506错误

本文解决了iOS8系统中,应用从后台返回时出现OpenGL绘制错误的问题。通过在RootViewController.mm文件中添加两个方法,确保了应用在后台时停止OpenGL绘制,在返回前台时恢复正常绘制。
近期做第三方sdk接入时,发现iOS8系统下,进行银联充值后,返回游戏有很大几率会报
OpenGL error 0x0506............
之类的绘制问题,游戏卡死,花了很长时间,一直没有头绪

最终找到这篇文章:
[url]http://blog.lessfun.com/blog/2014/09/24/ios8-issue-keyboard-orientation-and-idletimerdisabled-not-working/[/url]

原来后台运行的app,是不允许进行openGL绘制的,而且iOS8要求更严格

好吧,切换到RootViewController.mm,加上这两个方法:

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
cocos2d::CCApplication::sharedApplication()->applicationDidEnterBackground();
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
cocos2d::CCApplication::sharedApplication()->applicationWillEnterForeground();
}


applicationDidEnterBackground主要是在切到后台时做这些:

CCDirector::sharedDirector()->stopAnimation();
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
SimpleAudioEngine::sharedEngine()->pauseAllEffects();


applicationWillEnterForeground是切回前台,做这些:

CCDirector::sharedDirector()->startAnimation();
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
SimpleAudioEngine::sharedEngine()->resumeAllEffects();


done,希望能帮到iOS8下遇到类似问题的朋友
<think>好的,用户遇到了Cocos中的OpenGL错误0x0505,需要帮助解决。首先,我需要理解这个错误代码的含义。OpenGL错误代码通常是十六进制的,0x0505对应的十进制是1285,查阅OpenGL文档的话,这个错误应该是GL_OUT_OF_MEMORY,即内存不足导致的问题。 接下来,我需要考虑在Cocos2d-x或Cocos Creator项目中可能引发这个错误的原因。可能的情况包括纹理资源过大、内存泄漏、显存不足,或者着色器程序中的错误配置。用户可能是在加载高分辨率纹理时超出了设备的显存限制,或者在渲染过程中没有正确管理资源,导致内存累积。 然后,根据常见的解决方法,我应该建议用户检查纹理尺寸是否符合设备支持的最大值,使用工具如纹理压缩来减少内存占用。同时,检查代码中是否有未释放的纹理或其他资源,确保在场景切换时正确清理资源。此外,查看OpenGL的状态,使用调试工具如RenderDoc或Xcode的OpenGL调试器来定位具体出错的位置。 还需要考虑不同平台的差异,比如在iOS和Android上,最大纹理尺寸可能不同,用户可能需要针对不同设备进行适配。另外,检查是否在渲染过程中频繁创建和销毁资源,导致内存碎片化,或者是否有复杂的着色器程序消耗过多显存。 最后,建议用户简化场景进行测试,逐步排除可能的问题点,并确保使用的Cocos引擎版本没有已知的相关bug。如果问题依旧存在,可能需要深入分析日志和调用堆栈,或者向Cocos社区寻求帮助。</think>在Cocos开发中遇到OpenGL错误代码0x0505(对应GL_OUT_OF_MEMORY)时,通常与显存/内存资源分配有关。以下是分步骤解决方案: 1. **纹理资源检查** - 验证所有纹理尺寸是否符合设备支持的最大值(常见移动设备最大4096x4096) - 使用`TextureCache::getInstance()->getCachedTextureInfo()`输出已加载纹理信息 - 对高分辨率纹理使用压缩格式(PVRTC、ETC等),示例代码: ```cpp Texture2D::setPVRImagesHavePremultipliedAlpha(true); auto texture = Director::getInstance()->getTextureCache()->addImage("texture.pvr.ccz"); ``` 2. **内存泄漏排查** - 在AppDelegate中启用内存监控: ```cpp Director::getInstance()->setDisplayStats(true); // 显示调试信息 ``` - 使用Xcode的Instruments工具或Android Profiler分析内存分配 - 确保所有`create`方法创建的对象都调用`release()`[^3] 3. **显存优化** - 检查多重采样抗锯齿(MSAA)设置,过高采样率会导致显存溢出 ```cpp GLViewImpl::setGLContextAttrs({8, 8, 8, 8, 4, 0}); // 调整颜色/深度缓冲位数 ``` - 减少同时使用的帧缓冲区数量 4. **OpenGL状态验证** - 在渲染循环中添加GL错误检查: ```cpp GLenum err = glGetError(); if(err != GL_NO_ERROR){ CCLOG("OpenGL error %04x", err); } ``` 5. **设备适配方案** - 实现动态资源加载: ```cpp #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) if(CCConfiguration::getInstance()->getMaxTextureSize() < 4096){ // 加载低分辨率资源 } #endif ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值