由于Cocos2d-x 编译出来的 App 也属于Android App ,本课程先给学生梳理 Android App 的架构,然后介绍了Cocos2d-x 如何在Android 上进行渲染。经过本节课的学习,学生可以知道Cocos2d-x 中的任何一个元素是如何渲染的。
在(如何使用Cocos2d-x进行跨平台编程)一节中,讲述了Cocos2d-X跨平台的原理。在(站在Android App开发者角度分析template project之proj.android(2))一节中,从Android App开发者角度,讲述了Cocos2d-X所封装的与Android平台相关的代码,以及Android平台相关的代码如何调用平台不相关的代码。其他平台类似,Cocos2d-X就是通过这种方式,将平台相关的代码全部封装起来,制定了一些平台不相关的库,让开发者可以基于这个平台不相关的库进行代码编写。最终,编写的代码都会被各个平台所调用,以达到开发者跨平台开发的效果。
每个游戏对应于一个Application对象。Application的作用是管理游戏的生命周期、设置默认窗口、获取平台和本地信息等。每个平台的Application类都不一样,所以Cocos2d-X抽象出来一个Application的子类AppDelegate,在AppDelegate中定义了一个Director对整个游戏进行管理。如果是多屏的设备,可以创建多个Director。
在(站在Android App开发者角度分析template project之proj.android(2))一节中,讲到了Cocos2dxRenderer的三个主要函数,在(Cocos2d-X的渲染系统(1))一节中,已经介绍了其中的onSurfaceCreated函数,本节课将介绍另外一个主要函数onDrawFrame,这个函数就是Android开发基于OpenGL ES的App,所调用的绘制函数,Android会不停的调用此函数。
在本系列前面两个教程介绍了FPS的设置和作用,在onDrawFrame函数中,首先先会对绘制加以FPS的限制。由于onDrawFrame函数是会被不停的调用,为了让这个函数的调用受到FPS的限制,在此函数中加入了时间判断,如果两次调用函数时间间隔过短,就会暂停一会,等FPS的时间到了之后再执行函数主体部分。函数的主体部分为nativeRender。
nativeRender为native函数,主要是调用DisplayLinkDirector单例的mainLoop方法。mainLoop中主要包含两个函数,一个是真正的绘制函数drawScene,另外一个是在内存管理介绍过的,在每帧结束的时候将AutoReleasePool中的东西进行release。
glfwPollEvents函数用于交换前后端渲染缓冲,与glfwSwapBuffers对应。
每一帧开始的时候先判断是否有用户输入,因为用户是对上一帧进行的输入,所以要先做判断。然后执行动作更新,ActionManager会对相应元素进行属性更新。之后进行物理判断,物理判断是属于schedule的update函数,在其中优先级为0。下面是程序自定义的一些更新。
之后通过glClear对缓冲进行clear,然后判断是否进入下一个scene,如果进入下一个scene就调用这个scene退出的回调函数,以及下一个scene进入的回调函数。
之后通过scene的visit函数(其实是Node的Visit函数)遍历整个UI树,得到一定顺序的绘制命令。交给Renderer的render函数进行绘制。
查看是否有通知,是否显示fps状态栏。之后交换缓冲区。
Director是Ref的子类,具备管理Scene、管理fps、管理OpenGL ES View的handle GLView、管理OpenGL ES过程中用到的TextureCache/viewport/blend/depthtest、管理坐标系变换矩阵、管理游戏运行状态、管理事件/通知、管理窗口尺寸、数据管理等功能。
Director的getInstance函数得到一个DisplayLinkDirector的单例,DisplayLinkDirector是Director的子类,如果将Director看作一堆图片的集合,那么DisplayLinkDirector具备的函数是在Director的基础上,重载了让图片按照一定的fps播放或者停止的函数。
GLView是Ref的子类,具备检查OpenGL ES状态、将图片显示在屏幕上、设置OpenGL ES属性、设置尺寸、设置Viewport/Scissor等功能。
上节课介绍到的nativeInit函数将一个GLViewImpl的实例化对象设置为了Director的管理OpenGL ES View的handle。GLViewImpl是GLView的子类。GLViewImpl跟平台相关,重载了检查OpenGL ES状态、将图片显示在屏幕上等函数。
Director的setOpenGLView函数用于设置Director当前的OpenGL ES窗口。OpenGL ES是与GPU打交道,所以先要获得GPU的信息。然后创建一个状态显示栏用于显示FPS等信息。设置OpenGL ES的初始值(blend、depthtest、clearcolor)。设置VBO和VAO,如果有的话。开启事件分发器。
Director的runWithScene函数用于将输入参数的scene push到场景栈的栈顶。然后调用Application的startAnimation函数,引入Cocos2dxRenderer lib。通过pushScene、popScene、popToRootScene、popToSceneStackLevel、replaceScene对Scene进行管理。
笔者制作网站的目的,主要是借用自己之前的知识背景(Android App开发和图形学知识),将自己学习笔记拿出来,和大家一起进行交流,毕竟每个人的知识体系不同,有交流才会有提高,所以欢迎大家通过各种方式和我联系。
网址:www.geekfaner.com
"极客学院"教学视频(高清版_推荐):http://www.jikexueyuan.com/course/cocos/1-5-0/