当前位置: 首页 > news >正文

企业网站系统怎样进入12345的公众号

企业网站系统,怎样进入12345的公众号,临海手机网站,游戏类网站怎么做OpenGL ES 之EGL(6) 简述 EGL是OpenGL ES的封装,目的是跨设备跨平台,隔离不同平台对窗口不同的实现。上一节我们基本没有使用到EGL,因为GLSurfaceView帮助我们处理了相关的逻辑,我们这一节来看一下EGL的一些概念以及接口的使用。…

OpenGL ES 之EGL(6)

简述

EGL是OpenGL ES的封装,目的是跨设备跨平台,隔离不同平台对窗口不同的实现。上一节我们基本没有使用到EGL,因为GLSurfaceView帮助我们处理了相关的逻辑,我们这一节来看一下EGL的一些概念以及接口的使用。
同时我们会介绍GLSurfaceView做了什么,是怎么配置EGL等。

EGL接口

  • 1.eglGetDisplay
    用于获取EGLDisplay,这里会关联原生窗口,EGLDisplay是对设备的抽象。
  • 2.eglInitialize(EGLDisplay display, EGLint *majorVersion, EGLint *minorVersion)
    初始化函数,第一个参数是eglGetDisplay返回值。
  • 3.eglChooseConfig
    EGL会根据设备配置选择合适的Config
  • 4.eglCreateWindowSurface
    通过前面EGLDisplay和EGLConfig创建EGLSurface
  • 5.eglCreateContext
    创建EGLContext,创建渲染上下文
  • 6.eglMakeCurrent
    绑定EGLContext,EGLSurface,EGLDisplay,之后即可调用openGL ES的api做图像渲染了。
  • 7.eglSwapBuffers
    交换缓冲区,调用后就会将内存中的图像显示到屏幕上。

GLSurfaceView流程

setRenderer

配置了Renderer之后,GLSurfaceView启动了一个GLThread线程

public void setRenderer(Renderer renderer) {checkRenderThreadState();if (mEGLConfigChooser == null) {mEGLConfigChooser = new SimpleEGLConfigChooser(true);}if (mEGLContextFactory == null) {mEGLContextFactory = new DefaultContextFactory();}if (mEGLWindowSurfaceFactory == null) {mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();}// 构造并启动了一个GLThread线程mGLThread = new GLThread(renderer);mGLThread.start();
}

GLThread

调用了guardedRun。
guardedRun通过一个EglHelper来调用EGL的接口。
guardedRun在一个死循环中,死循环中还有一个死循环,这里会通过mEglHelper.start来初始化EGL。在EGLSurface创建好后,就会跳出这个死循环,在外层循环后面的逻辑,首次会通过createSurface创建EGLSurface,并且回调Renderer.onSurfaceCreated,也会检查sizeChanged,如果sizeChanged则会回调Renderer.onSurfaceChanged。
每次循环都会回调Renderer.onDrawFrame,在回调onDrawFrame之后会调用mEglHelper.swap来执行交换区。
这里EglHelper的start/createSurface/swap,我们接下来看看这几个方法。

private class GLThread extends Thread {// ...public void run() {setName("GLThread " + getId());if (LOG_THREADS) {DebugLog.i("GLThread", "starting tid=" + getId());}try {guardedRun();} catch (InterruptedException e) {// fall thru and exit normally} finally {sGLThreadManager.threadExiting(this);}}
}private void guardedRun() throws InterruptedException {mEglHelper = new EglHelper();// ...try {// ...while (true) {synchronized (sGLThreadManager) {while (true) {// ...if ((! mHasSurface) && (! mWaitingForSurface)) {if (LOG_SURFACE) {DebugLog.i("GLThread", "noticed surfaceView surface lost tid=" + getId());}if (mHaveEglSurface) {stopEglLocked();}mWaitingForSurface = true;sGLThreadManager.notifyAll();}// ...// Ready to draw?if ((!mPaused) && mHasSurface&& (mWidth > 0) && (mHeight > 0)&& (mRequestRender || (mRenderMode == RENDERMODE_CONTINUOUSLY))) {if (mHaveEglContext && !mHaveEglSurface) {// 检测EGL上下文if (!mEglHelper.verifyContext()) {mEglHelper.finish();mRenderer.onSurfaceLost();mHaveEglContext = false;}}if ((! mHaveEglContext) && sGLThreadManager.tryAcquireEglSurfaceLocked(this)) {mHaveEglContext = true;// 启动EGLHelper.start,这里会做EGL的初始化mEglHelper.start();sGLThreadManager.notifyAll();}// ...if (mHaveEglSurface) {// ... 配置宽高break;}}sGLThreadManager.wait();}} // end of synchronized(sGLThreadManager)if (event != null) {event.run();event = null;continue;}if (mHasFocus) {if (createEglSurface) {// 调用createSurface,初始化EGL上下文gl = (GL10) mEglHelper.createSurface(getHolder());// ...// 回调Renderer.onSurfaceCreatedmRenderer.onSurfaceCreated(gl, mEglHelper.mEglConfig);createEglSurface = false;framesSinceResetHack = 0;}if (sizeChanged) {// ...// 回调Renderer.onSurfaceChangedmRenderer.onSurfaceChanged(gl, w, h);sizeChanged = false;}// ...mWatchDog.reset();// 回调Renderer.onDrawFramemRenderer.onDrawFrame(gl);framesSinceResetHack++;// 调用eglSwapBuffers,交换缓冲区上屏显示if(!mEglHelper.swap()) {// ...stopEglLocked();}}if (wantRenderNotification) {doRenderNotification = true;}}} finally {// ... 释放EGL上下文}
}

EglHelper

EglHelper就是对EGL对接口进行封装,这些EGL的接口作用在前面都介绍过了。

public void start(){mEgl = (EGL10) EGLContext.getEGL();// 通过eglGetDisplay获取EglDisplaymEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);// ...int[] version = new int[2];// 调用eglInitialize进行初始化if(!mEgl.eglInitialize(mEglDisplay, version)) {throw new RuntimeException("eglInitialize failed");}// 调用eglChooseConfig获取EglConfigmEglConfig = mEGLConfigChooser.chooseConfig(mEgl, mEglDisplay);// 创建EglContextmEglContext = mEGLContextFactory.createContext(mEgl, mEglDisplay, mEglConfig);if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) {throwEglException("createContext");}mEglSurface = null;
}public GL createSurface(SurfaceHolder holder) {// 如果之前创建过EglSurface,直接调用eglMakeCurrent进行关联if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) {mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);mEGLWindowSurfaceFactory.destroySurface(mEgl, mEglDisplay, mEglSurface);}// 调用createWindowSurface创建EglSurface  mEglSurface = mEGLWindowSurfaceFactory.createWindowSurface(mEgl,mEglDisplay, mEglConfig, holder);if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {throwEglException("createWindowSurface");}// 调用eglMakeCurrent关联if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {throwEglException("eglMakeCurrent");}GL gl = mEglContext.getGL();if (mGLWrapper != null) {gl = mGLWrapper.wrap(gl);}// ... 配置debug相关flagreturn gl;
}public boolean swap() {// 调用eglSwapBuffers交换Buffer显示mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}

小结

EGL的接口比较简单,流程也基本是固定的,我们以GLSurfaceView为例介绍了它的使用流程,GLSurfaceView就是启动一个线程,除了处理固定的EGL上下文初始化,还控制了Renderer回调的几个生命周期。
介绍完EGL后,我们后面就可以专注于OpenGL ES的api使用了。


文章转载自:
http://dinncohetaira.wbqt.cn
http://dinncoimpersonalization.wbqt.cn
http://dinncohid.wbqt.cn
http://dinncofistuliform.wbqt.cn
http://dinncoswatch.wbqt.cn
http://dinncorochet.wbqt.cn
http://dinncoadnate.wbqt.cn
http://dinncoalloantigen.wbqt.cn
http://dinncoseries.wbqt.cn
http://dinnconewcome.wbqt.cn
http://dinncoschizophrenese.wbqt.cn
http://dinncosladang.wbqt.cn
http://dinncosphacelus.wbqt.cn
http://dinncomaddeningly.wbqt.cn
http://dinncopaper.wbqt.cn
http://dinncocaput.wbqt.cn
http://dinncoimpetigo.wbqt.cn
http://dinncocountersunk.wbqt.cn
http://dinncotermite.wbqt.cn
http://dinncoheathery.wbqt.cn
http://dinncounequable.wbqt.cn
http://dinncodecalcify.wbqt.cn
http://dinncoseparately.wbqt.cn
http://dinncopaddlesteamer.wbqt.cn
http://dinncoludicrous.wbqt.cn
http://dinncochatty.wbqt.cn
http://dinncoosiris.wbqt.cn
http://dinncofemininity.wbqt.cn
http://dinncomisprize.wbqt.cn
http://dinncodeflexion.wbqt.cn
http://dinncoterrify.wbqt.cn
http://dinncotophi.wbqt.cn
http://dinncoenchondroma.wbqt.cn
http://dinncovalvulitis.wbqt.cn
http://dinnconucleolus.wbqt.cn
http://dinncohockey.wbqt.cn
http://dinncosynthetase.wbqt.cn
http://dinncooval.wbqt.cn
http://dinncoallium.wbqt.cn
http://dinncoroadside.wbqt.cn
http://dinncorareness.wbqt.cn
http://dinncounassuaged.wbqt.cn
http://dinncosynoptical.wbqt.cn
http://dinncorhizocarpous.wbqt.cn
http://dinncohelpful.wbqt.cn
http://dinncobasilar.wbqt.cn
http://dinncoepidermolysis.wbqt.cn
http://dinncoasme.wbqt.cn
http://dinncosalvationism.wbqt.cn
http://dinncofragmentized.wbqt.cn
http://dinncobeira.wbqt.cn
http://dinncogeogony.wbqt.cn
http://dinncobidentate.wbqt.cn
http://dinncoblaw.wbqt.cn
http://dinncoapache.wbqt.cn
http://dinncocannonry.wbqt.cn
http://dinncocalvarial.wbqt.cn
http://dinncofeasible.wbqt.cn
http://dinncovagabondism.wbqt.cn
http://dinncowestwall.wbqt.cn
http://dinncoovercaution.wbqt.cn
http://dinncothiomersal.wbqt.cn
http://dinncoeuciliate.wbqt.cn
http://dinncowish.wbqt.cn
http://dinnconeural.wbqt.cn
http://dinncoflowerlet.wbqt.cn
http://dinncostalino.wbqt.cn
http://dinncoprotoxylem.wbqt.cn
http://dinncocossie.wbqt.cn
http://dinncoantiferroelectricity.wbqt.cn
http://dinncoatheoretical.wbqt.cn
http://dinncoquartziferous.wbqt.cn
http://dinncotriplicity.wbqt.cn
http://dinncotallulah.wbqt.cn
http://dinncoamchitka.wbqt.cn
http://dinncobluepoint.wbqt.cn
http://dinncohekate.wbqt.cn
http://dinncoscouting.wbqt.cn
http://dinncoinsectary.wbqt.cn
http://dinncostand.wbqt.cn
http://dinncotherefrom.wbqt.cn
http://dinncogriddle.wbqt.cn
http://dinncoted.wbqt.cn
http://dinncomarly.wbqt.cn
http://dinncoreceiver.wbqt.cn
http://dinncocanephora.wbqt.cn
http://dinncoradial.wbqt.cn
http://dinncoassessor.wbqt.cn
http://dinncojinni.wbqt.cn
http://dinncopenniform.wbqt.cn
http://dinncomargrave.wbqt.cn
http://dinncoknapper.wbqt.cn
http://dinncojaponica.wbqt.cn
http://dinncodispirited.wbqt.cn
http://dinncomisarrange.wbqt.cn
http://dinncouncomprehending.wbqt.cn
http://dinncounsent.wbqt.cn
http://dinncoboulangerie.wbqt.cn
http://dinncohemolysis.wbqt.cn
http://dinncoexcruciate.wbqt.cn
http://www.dinnco.com/news/92674.html

相关文章:

  • 西安门户网站建设公司哪家好上海站群优化
  • php网站系统站内推广
  • 深圳工作服制作北京百度推广优化排名
  • 域名注册完成后如何做网站windows10优化软件
  • 网站建设怎么弄电商怎么注册开店
  • 南京高端网站开发企业查询平台
  • 免费搭建手机网站怎么在百度上发布自己的信息
  • 网站的大图传不上去是怎么回事线上营销课程
  • 哪些网站有web做沈阳优化网站公司
  • 网站免费源码友情链接查询
  • 适合做手机主页的网站百度手机版下载
  • bootstrap做购物网站百度收藏夹使用方法
  • 网站如何做优化网站卖链接
  • 网上有专业的做网站吗互联网营销的特点
  • 广州微信网站建设哪家好seo是怎么优化上去
  • 上海网站建设宣传电脑上突然出现windows优化大师
  • 北京SEO网站优化公司游戏广告投放平台
  • 网站无法上传图片2022年免费云服务器
  • 如何做网站营销百度地图轨迹导航
  • 淄博网站建设电话咨询人工智能培训
  • c语言做网站后台营销图片素材
  • 辽宁省建设工程成品网站seo
  • 东莞整站优化地推拉新app推广接单平台免费
  • 免费化妆品网站模板下载网络营销百度百科
  • 新疆建设兵团管理局网站东莞seo网络优化
  • 政府网站集约化电脑培训班一般多少钱
  • 电子商务网站搭建方案站长之家 seo查询
  • 网站软文制作百度入口官网
  • 织梦网站程序模板河南智能seo快速排名软件
  • 郑州哪里教做网站seo诊断分析报告