为啥 Android 使用 pinImages 将可变位图的纹理上传到 GPU?

Posted

技术标签:

【中文标题】为啥 Android 使用 pinImages 将可变位图的纹理上传到 GPU?【英文标题】:Why does Android use pinImages to upload texutures of mutable bitmaps to GPU?为什么 Android 使用 pinImages 将可变位图的纹理上传到 GPU? 【发布时间】:2020-10-28 06:37:11 【问题描述】:

在阅读android源代码SkiaRecordingCanvas时,我发现如果一个位图被标记为可变的,即!isImmutable() == true,该位图将通过调用skia接口SKImage_pinAsTexture的函数SkiaPipeline::pinImages缓存在GPU中。但是我在pinImages评论了这些行,重新编译推送到手机后,发现gif正常显示。唯一的区别是纹理上传从prepareTree延迟到renderFrameImpl。那么,为什么Android会使用这种方法来缓存可变位图的纹理呢?

bool SkiaPipeline::pinImages(std::vector<SkImage*>& mutableImages) 
    // for (SkImage* image : mutableImages) 
    //     if (SkImage_pinAsTexture(image, mRenderThread.getGrContext())) 
    //         mPinnedImages.emplace_back(sk_ref_sp(image));
    //      else 
    //         return false;
    //     
    // 
    return true;

【问题讨论】:

【参考方案1】:

即使底层位图发生变化,固定和取消固定也能正常工作。

固定它会使图像急切地上传到 GPU。取消固定它可以释放与 GPU 相关的内存。请参阅https://github.com/google/skia/blob/dc3332a07906872f37ec3a592db7831178886527/src/core/SkImagePriv.h#L62-L86 上的文档

通过注释掉这段代码,您可以使图像在接近绘制时不会(或至少可能不会)上传到 GPU,这可能会导致更多工作完成在不幸的时候,尤其是在低端设备上。我也不清楚在没有匹配的pin 的情况下调用unpin 的后果。

【讨论】:

以上是关于为啥 Android 使用 pinImages 将可变位图的纹理上传到 GPU?的主要内容,如果未能解决你的问题,请参考以下文章

Android:为啥firebase Push键不改变

Android 为啥使用Handler

为啥Android要使用各种BroadcastReceiver

为啥脚本后端会减慢 Android 应用程序的速度?

Android开发中为啥很少使用JSON存储数据

为啥Android裁剪意图不返回ActivityResult?