Android 安卓棒棒糖是如何绘制图像的?什么是;准备;gpu分析器中的stage

Android 安卓棒棒糖是如何绘制图像的?什么是;准备;gpu分析器中的stage,android,android-canvas,android-custom-view,android-5.0-lollipop,Android,Android Canvas,Android Custom View,Android 5.0 Lollipop,我正在开发一个应用程序。此应用程序具有布局。布局相当简单。为了使它更简单,假设布局由TextView和CustomView组成。此自定义视图的目的是绘制大型位图(1080 x 700) 在CustomView中,我为图像资源存储一个整数。在它的构造函数中,我正在执行一个异步任务来开始解压缩资源。解压缩完成后,CustomView将失效。在draw方法中,我检查位图是否尚未解压缩,然后它什么也不做,如果位图已解压缩,则CustomView正在绘制它并释放它的资源 到目前为止还不错:) 我有测试设备

我正在开发一个应用程序。此应用程序具有布局。布局相当简单。为了使它更简单,假设布局由TextView和CustomView组成。此自定义视图的目的是绘制大型位图(1080 x 700)

在CustomView中,我为图像资源存储一个整数。在它的构造函数中,我正在执行一个异步任务来开始解压缩资源。解压缩完成后,CustomView将失效。在draw方法中,我检查位图是否尚未解压缩,然后它什么也不做,如果位图已解压缩,则CustomView正在绘制它并释放它的资源

到目前为止还不错:)

我有测试设备: 1.中兴通讯刀片III-1GHz单核,512MB内存,运行安卓4.0.4(API 15) 2.HTC Desire X-1GHz单核1GB内存,运行安卓4.1.1(API 16) 3.HTC Sensation 1.5 GHz双核,768MB内存,运行安卓4.4.4(API 19,根目录) 4.谷歌Nexus5,2.27GHZ四核,2GB内存,运行安卓5.0.1(API 21)

在开发的时候,我在设备1上测试,因为它应该是最慢的,如果一切正常,那么其他地方都可以。是的,上面的方法在这个设备上很有效

然后我试着装上2号装置——一切都如预期的那样

然后是设备3——同样,一切都很好。在这个设备上,我运行“ProfileGPU渲染”,看看它到底有多好。大多数情况下,当位图显示在屏幕上时,条形图位于绿线下方,它们会更高,fps会从60+下降到30左右,这同样很好。首先,我认为canvas.drawBitmap()速度很慢,但当我检查它时,结果是-执行canvas.drawBitmap()的时间不到1ms。我再次检查了“配置文件GPU渲染”栏。蓝色和橙色的颜色较低,黄色在绿线上方。然后我检查了这些颜色是什么意思。黄色的是“等待命令完成”——所以一切看起来都很好

在第四台设备上,我期待着最好的性能,但是……没有。在这里,当位图必须显示在屏幕上时,整个UI线程都冻结了。我再次运行“配置文件GPU渲染”。这里有4种颜色供我惊喜。上面的3个和紫色的一个。当位图显示在屏幕上,UI线程完全冻结时,紫色条从屏幕的底部到顶部,所以我只看到微小的蓝色和巨大的紫色条。我试着去看看那个条子是干什么的,发现它的意思是“准备”

最后,我的问题是,我在为棒棒糖绘制位图时遗漏了什么?为什么绘制位图时准备阶段会花费这么长时间?它是连接到棒棒糖还是连接到Nexus5?谷歌不可能添加新的阶段来减缓用户界面的进程

更新: 因此,经过大量测试后,我意识到我遗漏了一些东西:) 我之前没有意识到这一点,真是太愚蠢了,但是(

正如我所说,该应用程序仍在开发中,因此我只制作了一个drawable,并将其放在drawable Nodepi文件夹中。但在这种情况下,我将其放在了错误的文件夹中,而不是drawable Nodepi,我将其放在drawable中。这导致Nexus 5将其解码为9倍大的位图,这导致速度变慢