call to OpenGL ES API with no current context 和Fatal signal 11

近日在用cocos2dx3.4的时候使用了JNI调用,发现一个现象

当不使用jni的时候完全正常,使用了jni后回去的所有文字都变成黑块,并且有概率程序崩溃,附带出了两个log

call to OpenGL ES API with no current context  和 Fatal signal 11

但同样的cocos2dx ,同样的jni代码,另一个项目却正常。找寻了好久之后发现了原因

cocos2dx 3.x以后版本 不再是一个进程跑到底:

引用:“Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的“死循环”,一旦某一帧遇到了“大活儿”,比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象。从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些“大活儿”吧。
手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源、音视频资源、文件读写以及网络通信,处理的稍有不甚就会出现画面卡顿,交互不畅的情况。虽然引 擎在某些方面提供了一些支持,但有些时候还是自己祭出Worker线程这个法宝比较灵活,下面就以Cocos2d-x 3.0 Final版游戏初始化为例(针对Android平台),说说如何进行多线程资源加载。 我们经常看到一些手机游戏,启动之后首先会显示一个带有公司Logo的闪屏画面(Flash Screen),然后才会进入一个游戏Welcome场景,点击“开始”才正式进入游戏主场景。而这里Flash
Screen的展示环节往往在后台还会做另外一件事,那就是加载游戏的图片资源,音乐音效资源以及配置数据读取,这算是一个“障眼法”吧,目的就是提高用 户体验,这样后续场景渲染以及场景切换直接使用已经cache到内存中的数据即可,无需再行加载。

那问题就出在cocos2dx新版本其实分了两个线程  openglview的绘制线程和程序主线程。当jni回调c++的函数中有类似sprite创建、删除、修改等,则会出现上述两个错误,导致整个内存都乱了。

再去分析了一下另一个正常项目,发现在这个项目内的jni回调中没有做任何加载图片等动作,只是更新了数据,改了文字,所以没有出现大问题。

分析可能是加载图片这类操作不能在主线程里面做,而activity直接回调jni则属于主线程,所以,解决办法也很简单,就是把回调放到openglsurfaceview中如下

class EventHandler extends Handler {

@Override

public void handleMessage(Message msg) {

{

Cocos2dxGLSurfaceView.getInstance().queueEvent(new Runnable() {

@Override

public void run() {

payResultCode(mPayId, 0);

}

});

}

}

}

核心就在这里,请大家注意一下。

时间: 2024-11-04 18:49:43

call to OpenGL ES API with no current context 和Fatal signal 11的相关文章

OpenGL ES API with no current context

这个问题是因为Android在启动cocos2d-x的Thread时,没有用context的主的Thread,而是使用的OpenGL的Thread,所以我们不能在主Thread去完成 本应该是在cocos2dx中OpenGL Thread中 完成的工作(即所调用的函数在Cocos2dx中做的工作), 必须使用OpenGL的Thread去完成︰ public static native void nativeCallback(String code, String params); //原本程序中

OpenGL ES之GLSurfaceView学习一:介绍

原文地址::http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527 GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染. GLSurfaceView提供了下列特性: 1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上. 2> 管理一个EGL display,它能让opengl把

android opengl es 源码

[转自:http://blog.csdn.net/happyhell/article/details/6086973] The entire OpenGL ES API on Android is implemented in three libraries, located under /system/lib (for more information about OpenGL ES visit the official Khronos page): * libEGL.so: implemen

Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程

1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能测试,在Mali GPU驱动中激活性能测试对性能影响微不足道. 1.1 DS-5 Streamline简介 可使用DS-5 Streamline从CPU和Mali GPU中实时收集性能计数器,然后以图形方式显示这些计数器,其主要功能如下:     ? 收集计数器--从CPU和Mali GPU中     ? 保存收集到的计数器数据以供回放     ? 查看显示GPU活动.GPU活动和Framebu

android graphic(14)—EGL和OpenGL ES之间的关系

OpenGL ES EGL 例子 EGL加载OpenGL ES库 涉及的库 库的加载 小结 OpenGL ES 什么是OpenGL? Open Graphics Library (OpenGL) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to intera

OpenGL ES 简单教程

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. OpenGL ES 定义了一个在移动平台上可以支持OpenGL最基本功能的精简标准.以适应如手机.PDA或其他消费者移动终端的显示系统. Khronos Group 定义和管理了OpenGL ES标准. OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本号OpenGL 的

OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-while) 跳跃(discard, return, break, continue) 6.1函数定义   着色器是由一系列全局声明和函数定义组成的.函数声明规范如下: // prototype returnType functionName (type0 arg0, type1 arg1, ...,

Android OpenGL ES 开发教程 从入门到精通

From:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

Chapter 1 : OpenGLES 3.0 简介 (1)—— OpenGL ES 简介

OpenGL ES (OpenGL for Embedded Systems 的缩写)是一套在手持设备和嵌入式设备上实现高级3D图形化的应用变成接口(API).OpenGL ES作为图形API在当今的智能机领域占据了主导地位,并且已经将其应用扩展到了台式机.支持OpenGL ES的平台包括iOS.Android.BlackBerry.bada.Linux和Windows.OpenGL ES也支持WebGL——一种实现基于浏览器3D图形化的web标准. 2009年六月,苹果发布了iPhone 3G