cocos android分析(3)
来源:未知 责任编辑:责任编辑 发表时间:2015-01-01 13:14 点击:次
窗口绑定
窗口绑定我理解的并不太透彻,首先,我认为CCEGLView_Android只是一个虚的窗口,并没有实质功能,只是为了便于架构理解。
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h) { if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView()) { cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView(); view->setFrameWidthAndHeight(w, h); // if you want to run in WVGA with HVGA resource, set it // view->create(480, 320); Please change it to (320, 480) if you're in portrait mode. cocos2d::CCDirector::sharedDirector()->setOpenGLView(view); AppDelegate *pAppDelegate = new AppDelegate(); cocos2d::CCApplication::sharedApplication().run(); } } void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv* env) { cocos2d::CCDirector::sharedDirector()->mainLoop(); }
函数一是Java层调用onSurfaceCreated时调用函数,用来获取GLView窗口,用来下一步的渲染,而这个View窗口并没有类似Windows下的handle绑定,而接下来函数二是Java中onDrawFrame渲染每一帧时进行调用,最终调用底层的Director渲染,完成一帧绘制(详细内容可参考《cocos2d-x之HelloWorld范例分析(一)》)。
怎么来理解这种窗口绑定方式,保证我现在调用的gl函数,就能够绘制在窗口呢,通篇没有一个类似的handle从Java传递给JNI,通篇C++层面的View也只是一个只有Width和Height属性的结构体,所以我理解的是GLSurfaceView.Renderer默认在自己的线程中进行了封装,已经自己完成了和OpenGL的绑定。这个我觉得应该是靠谱的吧,而且自己来实时的每一帧渲染,下面的就不管里,你自己愿意调Java的接口也行,自己调gl的渲染也可以。这样也挺好的,都不用我顾虑这个事情了,只要给我高度宽度知道位置信息,我直接渲染。
文字
其他图形图像的绘制,都是和系统无关的。整个的渲染过程,也是跨平台的,一个平台的整合,主要是环境搭建、不同语言之间的消息传递、View的映射这些,前面也都阐述了,只是文字有一定的特殊,在Windows下使用CDC,在Linux是Freetype,在Android下如何实现?我觉得cocos2d实现思路也是不错的:C++通过JNI在Java层绘制,生成一张BitMap给C++,然后贴图完成。这个优点是简单,缺点就是如果文字太多的话,效率损失还是有的,其实我觉得如果有机会,还是用Freetype来画应该也可以尝试一下。
当然,也新学了一招,C++调用Java的方式,在jni里面也提供了,呵呵,代码在下面贴一下:
bool getBitmapFromJava(const char *text, int nWidth, int nHeight, CCImage::ETextAlign eAlignMask, const char * pFontName, float fontSize) { JniMethodInfo methodInfo; if (! JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/lib/Cocos2dxBitmap", "createTextBitmap", "(Ljava/lang/String;Ljava/lang/String;IIII)V")) { CCLOG("%s %d: error to get methodInfo", __FILE__, __LINE__); return false; } jstring jstrText = methodInfo.env->NewStringUTF(text); jstring jstrFont = methodInfo.env->NewStringUTF(pFontName); methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, jstrText, jstrFont, (int)fontSize, eAlignMask, nWidth, nHeight); methodInfo.env->DeleteLocalRef(jstrText); methodInfo.env->DeleteLocalRef(jstrFont); methodInfo.env->DeleteLocalRef(methodInfo.classID); return true; } static bool getStaticMethodInfo_(cocos2d::JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode) { jmethodID methodID = 0; JNIEnv *pEnv = 0; if (! getEnv(&pEnv)) { break; } jclass classID = getClassID_(className, pEnv); methodID = pEnv->GetStaticMethodID(classID, methodName, paramCode);
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>