做了两年的cocos引擎底3D层优化和特效,以及对应的编辑器开发。原本的计划中,参考Unity3D引擎,优化cocos渲染流程,实现批次渲染,BRDF渲染,卡通渲染,多材质渲染,延迟渲染,模型阴影,以及HDR,次表面散射,中国风特效,砖石特效等,并制作对应的编辑器。而今只实现了底层优化,批次渲染,BRDF渲染,卡通渲染,多材质渲以及对应编辑器制作。自感部门危险,这几天整理下做过的工作,记录下来,也算对自己工作一个回顾总结。
windows系统中,首先进入main()函数:
// create the application instance
AppDelegate app;
int ret = Application::getInstance()->run();
然后,进入run函数:
//初始引擎环境,包括GLView创建(最终实现根据不同的平台进入不同实现),目录设置,LUA绑定C++实现
(cocos自身实现和项目加入的三方SDK实现)
if (!applicationDidFinishLaunching())
return 1;
。。。。。。。
//渲染主循环,根据设置的FPS,while函数每隔一定时间执行一次,执行内容包括项目设置的各种定时器
(scheduler,update函数),以及最重要的渲染刷新。
while(!glview->windowShouldClose())
{
QueryPerformanceCounter(&nNow);
if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
director->mainLoop();
}
android环境中,Cocos2dxRenderer继承自GLSurfaceView.Renderer,andriod启动后主循环进入Render的OnDrawFrame(此为android开发的知识):
public void onDrawFrame(final GL10 gl) {
//类似winodws的while主循环函数,每隔一定时间进行调用一次nativeRender
if (sAnimationInterval <= 1.0 / 60 * Cocos2dxRenderer.NANOSECONDSPERSECOND) {
Cocos2dxRenderer.nativeRender();
} else {
final long now = System.nanoTime();
final long interval = now - this.mLastTickInNanoSeconds;
if (interval < Cocos2dxRenderer.sAnimationInterval) {
try {
Thread.sleep();
} catch (final Exception e) {
}
}
this.mLastTickInNanoSeconds = System.nanoTime();
Cocos2dxRenderer.nativeRender();
}
}
nativeRender是一个静态函数,在Java_org_cocos2dx_lib_Cocos2dxRenderer中实现,通过JNI转换后调用C++也调用mainLoop函数。
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv* env) {
cocos2d::Director::getInstance()->mainLoop();
}
mainLoop中执行drawScene功能:
//此处的update函数是各种update,action,动画,定时器的入口,如果项目的网络接口部分也是在cocos的
update函数实现,此时也是网络接收的入口,这就是为什么进入后台后网络阻塞,进入前台后一下接收到很多

最低0.47元/天 解锁文章
3099

被折叠的 条评论
为什么被折叠?



