SDL系列讲解(十二)创建窗口流程

96
代码GG陆晓明
2017.10.28 20:03* 字数 818


SDL系列讲解(一) 简介
SDL系列讲解(二) 环境搭建
SDL系列讲解(三) 工具安装
SDL是什么,能干什么,为什么我们要学习它?
SDL系列讲解(四) demo讲解
SDL系列讲解(五) 调试c代码
SDL系列讲解(六) SDL_Activity流程
SDL系列讲解(七) SDL_image教程SDL系列讲解(八) SDL_ttf教程
SDL系列讲解(九) 异常退出分析
SDL系列讲解(十) 按键处理流程
SDL系列讲解(十一) SDL_QUIT流程


项目合作

创建窗口时序图

时序图细节

看下创建窗口的流程图,我们简单说下过程。窗口创建,会先判断是否进行了SDL_VideoInit,如果没有,需要初始化。

完成了VideoInit的初始化后,我们使用LoadLibrary将android平台的opengl es动态库进行加载,同时将动态库里面的一些方法进行保存,作为我们适配android的实质方法,完成对接任务。SDL平台调用绘制,用的是SDL的一套标准,但是具体真正具体到每个平台是需要具体平台的实现,这里就是完成这个对接,使得SDL的方法,最终能操作到android平台上。

完成了opengl es的方法赋值之后,我们需要完成真正的窗口创建。在讲解这个之前,我们讲下android的绘制流程。我们知道,android使用activity进行承载界面,我们普通的View,比如button ,Textview这些,都是在ondraw进行绘制,使用传递的一个参数canvas,这个叫画布。是作用在一个绘制表面上的一套封装,使用canvas的一些api,可以简化我们直接绘制的难度,直接使用写好的画线,画圆,画一个弧度等等。当我们在canvas画好之后,系统会根据当前窗口耳朵层叠关系,透明度,缩放等等,进行将多个窗口排序,混合之后,使用驱动操作,将最终的一屏数据,刷入显卡,然后我们便看到了效果。

使用canvas,有个瓶颈便是,性能问题。ondraw属于主线程,于是乎就不能长时间频繁绘制,这样子会导致手机卡顿,出现anr,为了规避这种情况(特别是游戏,用canvas绘制,只能做比如五子棋,简单的连连看游戏,因为不会大量更新界面),大型的游戏开发,都是使用opengl es,android为了配合opengl es的硬件加速渲染,在上层配置了一个SurfaceView,这个是直接申请了一块绘制表面,独立于activity的其他View,自己独占一份,因此我们不需要使用ondraw绘制,这样子我们就可以单独开启一个绘制线程,单独作用在这个绘制表面,而直接操作绘制表面,会让我们开发效率大大降低。于是,我们将这个绘制表面进行封装,提供一套接口,而这套接口是配合硬件加速开发出来,于是我们的绘制速度会大幅度提升。而我们此处的封装,就是使用eglCreateWindowSurface,如此之后
我们就可以使用gl的一系列方法进行绘制,最后使用gl的swap-buffer将数据刷入绘制表面,然后进行和其他窗口混合,最终显示到屏幕。

日记本
Web note ad 1