位置: 编程技术 - 正文

Android基础系列-----------OpenGL ES(一)(android 基类)

编辑:rootadmin
一、OpenGL ES OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规范,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。它本身只是协议规范,而不是软件源码库。主要用于pc和工作站。 OpenGL ES (OpenGL for Embedded Systems) 是一个针对嵌入式应用的,免费的,支持全功能2D、3D的跨平台API(OpenGL® ES is a royalty-free, cross-platform API for full-function 2D and 3D graphics on embedded systems - including consoles, phones, appliances and vehicles)。 android中2D向量图形函数库使用了Google在年收购的一家公司提供的引擎叫skia。二、Android的图形系统 Android apk 里面的画图分为2D和3D两种:2D是由Skia 来实现的,Skia 也会调用部分opengl 的内容来实现简单的3D效果;3D部分是由OpenGL|ES实现的,OpenGL|ES是OpenGL的嵌入式版本。先了解一下Android apk的几种画图方式,然后再来来看一看这一整套的图形体系是怎么建立的。 首先画图都是针对提供给应用程序的一块内存填充数据 , 因此说穿了就是要么调用2D 的API画图,要么调用3D的API画图,然后将画下来的图保存在这个内存中,最后这个内存里面的内容会被Opengl渲染以后变为可以在屏幕上的像素信 息。 Apk应用主要关心的还是这些API的使用,在Android apk里面2D画图有2种方式 : 1、Simple Graphics in View 就是直接使用Android已经实现的一些画图操作,比如说images,shapes,colors,pre-defined animation等等,这些简单的画图操作实际上是由skia来提供的2D图形操作。使用这些预定义好的操作,可以实现诸如贴一张背景图,画出简单形状,实现一些简单的动画之类的操作。这里的简单可以这么理解,就是我们在这里没有一笔一画地构造出一个图形出来,我们只是把我们的Graphic 资源放入View体系中,由系统 来将这些Graphic画出来。举个例子:我们现在在Activity里面绑定一个ImageView,我们可以设置这 个ImageView的内容是我们的picture,然后我们可以让这个picture整体颜色上来点蓝色调,然后我们还可以为这个ImageView加 入一个预定义动画,这样当系统要显示这个View的时候就会显示我们的picture,并且会有动画,并带有一个蓝色调,我们并没有自己去定义画图操作, 而是将这些内容放入View中,由系统来将这些内容画出来。这种方式只能画静态或者极为简单的2D图画,对于实时性很强的动画,高品质的游戏都是没法实现的。 2、Canvas Canvas是一个2D的概念,是在Skia中定义的。可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法, 所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。 两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。下面是这两种方式的典型sequence : 2.1、View canvas (1) 定义一个自己的View :class your_view extends View{} ; (2) 重载View的onDraw方法:protected void onDraw(Canvas canvas){} ; (3) 在onDraw方法中定义你自己的画图操作 ; 2.2、Surface View Canvas (1) 定义一个自己的SurfaceView : class your_surfaceview extends SurfaceView implements SurfaceHolder.Callback() {} ; (2) 实现SurfaceHolder.Callback的3个方法surfaceCreated() surfaceChanged() surfaceDestroyed() ; (3) 定义自己的专注于画图的线程 : class your_thread extends Thread() {} ; (4) 重载线程的run()函数 [一般在run中定义画图操作,在surfaceCreated中启动这个线程] (5) 画图的过程一般是这样的: SurfaceHolder surfaceHolder = getHolder() ; //取得holder,这个holder主要是对surface操作的适配,用户不具备对surface操作的权限 surfaceHolder.addCallback(this) ; //注册实现好的callback Canvas canvas = surfaceHolder.lockCanvas() ; //取得画图的Canvas /*---------------------------------画图 **-------------------------------- 画图结束*/ surfaceHolder.unlockCanvasAndPost() ; //提交并显示 以下是2D画图用到的包 : android.view //画图是在View中进行的 android.view.animation //定义了一些简单的动画效果Tween Animation 和 Frame. Animation android.graphics //定义了画图比较通用的API,比如canvas,paint,bitmap等 android.graphics.drawable //定义了相应的Drawable(可画的东西),比如说BitmapDrawable,PictureDrawable等 android.graphics.drawable.shapes //定义了一些shape 3D画图SDK上讲得很简单,只是提了一个通用的方式,就是继承一个View,然后在这个View里面获得 Opengl的句柄进行画图,道理应该来说是和2D一样的,差别就是一个是使用2D的API画图,一个是使用3D的。不过因为3D openGl|ES具有一套本身的运行机制,比如渲染的过程控制等,因此Android提供了一个专门的用在3D画图上的GLSurfaceView。这个类被放在一个单独的包android.opengl里面,其中实现了其他View所不具备的操作: (1) 具有OpenGL|ES调用过程中的错误跟踪,检查工具,这样就方便了Opengl编程过程的debug ; (2) 所有的画图是在一个专门的Surface上进行,这个Surface可以最后被组合到android的View体系中 ; (3) 它可以根据EGL的配置来选择自己的buffer类型,比如RGB,depth= (这里有点疑问,SurfaceHolder的类型是SURFACE_TYPE_GPU,内存就是从EGL分配过来的?) (4) 所有画图的操作都通过render来提供,而且render对Opengl的调用是在一个单独的线程中 (5) Opengl的运行周期与Activity的生命周期可以协调 下面是利用GLSurface画3D图形的一个典型的Sequence (1) 选择EGL配置(就是你画图需要的buffer类型) [optional] : setEGLConfigChooser(boolean) setEGLConfigChooser(EGLConfigChooser) setEGLConfigChooser(int, int, int, int, int, int) (2) 选择是否需要Debug信息 [optional] : setDebugFlags(int) setGLWrapper(GLSurfaceView.GLWrapper). (3) 为GLSurfaceView注册一个画图的renderer : setRenderer(GLSurfaceView.Renderer) (4) 设置reander mode,可以为持续渲染或者根据命令 来渲染,默认是continuous rendering [optional]: setRenderMode(int) 这里有一个要注意的地方就是必须将Opengl的运行和Activity的生命周期绑定在一起,也就是说Activity pause的时候,opengl的渲染也必须pause。另外GLSurfaceView还提供了一个非常实用的线程间交互的函数 queueEvent(Runnable),可以用在主线程和render线程之间的交互,下面就是SDK提供的范例: GLSurfaceView是Android提供的一个非常&#;得学习 的类,它实际上是一个如何在View中添加画图线程的例子,如何在Java 中使用线程的例子,如何添加事件队列的例子,一个使用SurfaceView画图的经典Sequence,一个如何定义Debug信息的例子,觉得把它看懂了可以学到很多知识 ,具体的源码在:/framworks/base/opengl/java/android/opengl/GLSurfaceView.java 。 如何使用Opengl API的问题了,可以看看API demo中简单的立方体,复杂的可以看看它那个魔方的实现。下面总结一下3D画图需要用到的包: Android.opengl //主要定义了GLSurfaceView javax.microedition.khronos.egl //java层的egl接口  javax.microedition.khronos.opengles //opengl API三、图形渲染API——EGL EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。主要提供如下功能: 1、创建rendering surfaces Surface通俗地讲就是能够承载图形的介质,如一张“画纸”。只有成功申请到Surface,应用程序才能真正“作图”到屏幕上。 2、创造图形环境(graphics context) EGL 是为 OpenGL ES 提供平台独立性而设计。OpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。EGL 视窗设计是基于人们熟悉的用于 Microsoft Windows ( WGL )和 UNIX ( GLX )上的 OpenGL 的 Native 接口,与后者比较接近。OpenGL ES 图形管线的状态被存储于 EGL 管理的一个 Context 中。 Frame Buffers 和其他绘制 Surfaces 通过 EGL API 创建、管理和销毁。EGL 同时也控制和提供了对设备显示和可能的设备渲染配置的访问。

推荐整理分享Android基础系列-----------OpenGL ES(一)(android 基类),希望有所帮助,仅作参考,欢迎阅读内容。

Android基础系列-----------OpenGL ES(一)(android 基类)

文章相关热门搜索词:android基础知识点,android基础架构,android基础知识点,android基础入门教程,android 基础,android基础知识点,android基础知识总结,android的基础知识,内容如对您有帮助,希望把文章链接给更多的朋友!

通过google全球缓存IP安装安卓SDK 国内google被墙,直接运行sdkmanager无法下载androidsdk离线下载安装太繁琐,而且容易出错通过googleip可以访问sdk下载地址步骤:1,修改hosts文件(位置:C:W

狂刷Android范例之3:读写外部存储设备 狂刷Android范例之3:读写外部存储设备说明狂刷Android范例系列文章开张了。每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重点源

android多语言切换 在资源文件中新建一个文件夹values-en,在里面新建一个strings.xml,把默认values文件夹中的strings.xml中的内容拷贝一份到values-en中的strings.xml,再把该文件

标签: android 基类

本文链接地址:https://www.jiuchutong.com/biancheng/385987.html 转载请保留说明!

上一篇:Android项目中的R文件丢失(一个android项目一般包含哪些目录?各有什么用途?)

下一篇:通过google全球缓存IP安装安卓SDK(谷歌的全球化发展战略)

  • 公司债券和企业债券哪个风险大
  • 个体工商户是否跨省经营
  • 金税盘维护费应该计入什么科目
  • 土增清算尾盘销售
  • 执行企业会计准则第21号租赁的企业
  • 第二季度是多少钱
  • 员工事假扣工资怎么做账
  • 企业所得税分公司先报还是总部先报
  • 年报所得税与季报的区别
  • 银行询证函费用计入财务费用还是管理费用
  • 年底结账会计分录一定要做吗
  • 水利事业单位基建并账分录怎么写?
  • 水利印花税计算公式
  • 企业财产保险费率的影响因素
  • 开票商品名称是什么意思
  • 学校应该缴纳的税
  • 提取备用金的手续费会计分录
  • 环评公司的成本核算
  • 工会经费2020年免征
  • 销售商品收到商业汇票属于什么科目
  • 理财赎回本金没赎回利息咋办
  • 公司注销银行账户流程
  • 工资必须通过银行代发吗
  • windows10如何切屏
  • 笔记本电脑设置pin是什么意思
  • 禁止局域网用户访问权限
  • 劳务收入的会计分录
  • 招商银行直播在哪个平台
  • falogincn修改无线密码
  • 上年费用未计提
  • sessmgr.exe - sessmgr是什么进程 有什么用
  • 新公司成立前期费用
  • 无形资产初始计量的表述
  • 纳税调整项目有一个其他调增金额是怎么组成的
  • 以非现金资产清偿债务的,债权人应当
  • 公司要交什么税个人卖给公司的二手车
  • 哪些费用可以用医保
  • 企业签订的技术合同
  • 持有至到期投资科目被取消了吗
  • laravel入门与实战:构建主流php应用开发框架
  • vue使用百度地图三方标准地图清空后卡死
  • vue2vue3的区别
  • Sublime Text 4 (Build 4143) 注册方法STEP BY STEP
  • ps如何打圈内环形文字怎么调间距
  • 煤炭贸易公司的业务流程
  • 补提企业所得税财务报表应该如何调整
  • 现金流量表哪些数据和资产负债表一致
  • 织梦cms怎么样
  • 生育津贴如何做帐
  • 小规模纳税人税率2023年是多少
  • 财务报表年报应怎么做
  • sql server数据表
  • 口罩属于什么经济分类
  • 金税四期对纳税人的影响有哪些
  • 小规模纳税人增值税计算公式
  • 销售方销售返利单独开具
  • 收到的发票未抵税怎么办
  • 小规模纳税人购买税控设备
  • 贴现费用分录
  • 公司中征码是什么样子的
  • 建筑业纳税人简易征收偷逃增值税
  • 经营所得与劳务所得的直别
  • 事业单位收到钱怎么记账
  • 受同一方重大影响的企业之间为什么不构成关联方
  • sql必会知识
  • linux opencl
  • windowsxp网页打不开怎么办
  • windows 10 build 9888
  • 使用移动硬盘快速启动
  • diy组装电脑前置怎么样
  • linux怎么刻录光盘
  • Win RT 8.1 Update 3怎么提前更新安装使用?
  • win7系统IE浏览器怎么去掉360导航
  • dos命令grub
  • css hacks
  • unity游戏项目开发教程
  • 个人意外所得税税率
  • 如何连续打印单据
  • 电子税局个税申报步骤
  • 中山火炬开发区建设发展有限公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设