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

        前面的文章中提到过开启硬件加速时,网页的显示主要分成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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值