为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章