Android 4.0 硬件加速纹理渲染过程

来源:互联网 发布:3DM看门狗卡顿优化补丁 编辑:程序博客网 时间:2024/06/06 01:06

原文出处:http://blog.csdn.net/qq295445028/article/details/8638252

       

前面的文章中提到过开启硬件加速时,网页的显示主要分成WebCore渲染,OpenGl纹理渲染(GPU),系统将OpenGl纹理显示于屏幕上 这三个步骤。

        其中第一步是解析网页最后形成一个PictureSet。第二步是生成每个tileSkBitmap,并据此由GPU形成OpenGl纹理。最后一步根据OpenGl纹理显示内容在屏幕上。androidBrowser硬件加速的代码改动非常大,这里针对的是4.0的代码。

        本文主要关注每个tileSkBitmap转换为OpenGl纹理的过程。本过程是由TransferQueue::tryUpdateQueueWithBitmap函数开始,而在TransferQueue::updateDirtyBaseTiles函数结束。其中前者运行于TexturesGenerator线程,由BaseTile::paintBitmap函数调用而来。而后者运行于UI线程,在每次GLWebViewState::drawGL的时候都会调用,以更新各个tile的纹理。

    纹理的渲染过程是由系统来完成的,类TransferQueue管理各个tile的渲染顺序并与系统交互。其中有一个SurfaceTexture对象和一个SurfaceTextureClient对象。这两个对象是android系统中专门用于GPU渲染纹理的,SurfaceTexture相当于服务端而SurfaceTextureClient为客户端,它们共享一块显存数组。SurfaceTexture中还有一个待渲染的显存队列(由上述数组的下标组成)。真正的渲染发生在SurfaceTexture::updateTexImage函数。而SurfaceTexture中有诸如dequeueBufferqueueBuffer之类的函数,用来管理显存数组和队列。

    TransferQueue::tryUpdateQueueWithBitmap函数中通过ANativeWindow_lock函数最终会调用到SurfaceTexture::dequeueBuffer,取得一块空闲显存。然后将SkBitmap的数据以内存拷贝的方式复制过去。然后ANativeWindow_unlockAndPost最终调用到SurfaceTexture::queueBuffer函数,将已有内容的显存放到待渲染队列中。

    TransferQueue::updateDirtyBaseTiles则调用SurfaceTexture::updateTexImage函数依次从队列中取出显存并渲染纹理。每次渲染一个纹理都通过帧缓冲和显存拷贝的方式(TransferQueue::blitTileFromQueue)复制给每个相应的tile

    这样,整个过程就结束了。

原创粉丝点击