当前位置:操作系统 > 安卓/Android >>

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

网页的显示主要分成WebCore渲染,OpenGl纹理渲染(GPU),系统将OpenGl纹理显示于屏幕上 这三个步骤。
 
        其中第一步是解析网页最后形成一个PictureSet。第二步是生成每个tile的SkBitmap,并据此由GPU形成OpenGl纹理。最后一步根据OpenGl纹理显示内容在屏幕上。androidBrowser硬件加速的代码改动非常大,这里针对的是4.0的代码。
 
        本文主要关注每个tile由SkBitmap转换为OpenGl纹理的过程。本过程是由TransferQueue::tryUpdateQueueWithBitmap函数开始,而在TransferQueue::updateDirtyBaseTiles函数结束。其中前者运行于TexturesGenerator线程,由BaseTile::paintBitmap函数调用而来。而后者运行于UI线程,在每次GLWebViewState::drawGL的时候都会调用,以更新各个tile的纹理。
 
    纹理的渲染过程是由系统来完成的,类TransferQueue管理各个tile的渲染顺序并与系统交互。其中有一个Su易做图ceTexture对象和一个Su易做图ceTextureClient对象。这两个对象是android系统中专门用于GPU渲染纹理的,Su易做图ceTexture相当于服务端而Su易做图ceTextureClient为客户端,它们共享一块显存数组。Su易做图ceTexture中还有一个待渲染的显存队列(由上述数组的下标组成)。真正的渲染发生在Su易做图ceTexture::updateTexImage函数。而Su易做图ceTexture中有诸如dequeueBuffer和queueBuffer之类的函数,用来管理显存数组和队列。
 
    TransferQueue::tryUpdateQueueWithBitmap函数中通过ANativeWindow_lock函数最终会调用到Su易做图ceTexture::dequeueBuffer,取得一块空闲显存。然后将SkBitmap的数据以内存拷贝的方式复制过去。然后ANativeWindow_unlockAndPost最终调用到Su易做图ceTexture::queueBuffer函数,将已有内容的显存放到待渲染队列中。
 
    TransferQueue::updateDirtyBaseTiles则调用Su易做图ceTexture::updateTexImage函数依次从队列中取出显存并渲染纹理。每次渲染一个纹理都通过帧缓冲和显存拷贝的方式(TransferQueue::blitTileFromQueue)复制给每个相应的tile。
 
    这样,整个过程就结束了。
 
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,