为什么Android使用PinImage将可变位图的文本上传到GPU?

为什么Android使用PinImage将可变位图的文本上传到GPU?,android,android-source,skia,Android,Android Source,Skia,当我阅读Android源代码时,我发现如果位图被标记为可变的,即!isImmutable()==true,位图将通过调用skia接口的函数SkiaPipeline::pinImages缓存在GPU中。但是当我在pinImages中对这些行进行了注释并重新编译并推送到手机上后,我发现GIF显示正常。唯一的区别是纹理上载从prepareTree延迟到renderFrameImpl。那么,为什么Android使用这种方法来缓存可变位图的纹理呢 bool SkiaPipeline::pinImages(

当我阅读Android源代码时,我发现如果位图被标记为可变的,即
!isImmutable()==true
,位图将通过调用skia接口的函数
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;
}
boolskiapipeline::pinImages(std::vector&mutableImages){
//用于(浏览*图像:可变图像){
//if(SkImage\u pinAsTexture(image,mRenderThread.getGrContext()){
//mPinnedImages.安放回(sk_ref_sp(图像));
//}其他{
//返回false;
//     }
// }
返回true;
}

钉住和取消钉住设计为即使基础位图更改也能工作

固定它会使图像急切地上传到GPU。取消钉扎允许释放GPU相关内存。请参阅

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