第三节hellocpp整体框架(二)

来源:互联网 发布:淘宝蚂蚁花呗开通条件 编辑:程序博客网 时间:2024/05/20 21:22
接着上文来说。
我们继续来看Cocos2dxActivity.java 里面的init 函数。
主要创建Cocos2dxGLSurfaceView 和new Cocos2dxRenderer()
然后消息传递机制为:
Cocos2dxGLSurfaceView 作为android 架构的接收按键和触屏消息,然后转给Cocos2dxRenderer
去处理,这里面处理完毕,直接渲染。
Cocos2dxRenderer.java 渲染器接口,
主要的接口为onSurfaceCreated
onSurfaceChanged
onDrawFrame
关键的接口为onDrawFrame,里面调用private static native void nativeRender();
进行真正的调用接口。
JNIEXPORT void JNICALL
Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv* env) {
cocos2d::CCDirector::sharedDirector()->mainLoop();
}
调用这个进行更新屏幕,推动游戏进展。
然后继续来看Cocos2dxGLSurfaceView 类继承的GLSurfaceView,
这个GLSurfaceView 文件在android\frameworks\base\opengl\java\android\opengl 里
面。里面我们看一下setRenderer 这个函数
这个函数是设置渲染器的地方。

checkRenderThreadState();

if (mEGLConfigChooser == null) {
mEGLConfigChooser = new SimpleEGLConfigChooser(true);
}
if (mEGLContextFactory == null) {
mEGLContextFactory = new DefaultContextFactory();
}
if (mEGLWindowSurfaceFactory == null) {
mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();
}
mRenderer = renderer;
mGLThread = new GLThread(renderer);
mGLThread.start();
上面的是创建EGL 的一些配置,看下createSurface 这个函数
if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext)) {
throwEglException("eglMakeCurrent");
}
绑定mEglSurface 到活动mEglContext,随后的绘制便会到mEglSurface,刷新会推
动到SurfacefXX,记不得名字了,这个模块会将Surface
push 到真正屏幕,此时实现了完整绘制过程。
继续查看setRenderer 接口,里面出现了一个关键的调用
mGLThread = new GLThread(renderer);
mGLThread.start();
这个线程叫做绘制线程,负责所有绘制事件。

public void run() {
setName("GLThread " + getId());
if (LOG_THREADS) {
Log.i("GLThread", "starting tid=" + getId());
}
try {
guardedRun();
} catch (InterruptedException e) {
// fall thru and exit normally
} finally {
sGLThreadManager.threadExiting(this);
}
}
线程里面调用guardedRun 函数。
这节分析到此处。

原创粉丝点击