一、问题概述
当我们希望通过Path绘制图形,而Path又足够大时,开启了硬件加速的手机很可能会无法按编程的预期实现图形绘制,同时Logcat也会出现“Shape path too large to be rendered into a texture” 的警示。
作者分析了他遇到的问题:“Path通常都是CPU绘制的,但是当Path所在的View被设置成GPU加速,Path首先被转换成GPU中的texture,再从GPU绘制到界面。当Path足够大时,将会超出GPU的texture限制,Path绘制到界面失败,因为OpenGL绝不会允许这种超过硬件限制的操作”。
二、解决方案
作者提出的解决方案是:“自定义一个和View一样大的Bitmap,首先将Path转换成Bitmap,通过自定义的Bitmap进行界面绘制”。
方案能够解决问题的原因在于:“虽然Path较大,但已经被转换成了Bitmap,不再像Path一样GPU加速时首先被转换为texture。通过操作Bitmap,即移动它所在的画布Canvas,可以使我们需要展示的某段Path显示到Bitmap上。因为在Android4.2中,绘制和Canvas相关的Bitmap是不需要GPU的。”
通过这种方式,无论手机是否打开了GPU加速,绘制Path时,尤其是Path较大的情况,都会由于Bitmap的介入而选择CPU处理,从而避免了GPU的内存限制问题。但是,需要继续补充的是,当Path[足够]大时,应用即使能够通过CPU避开GPU内存限制尽情绘制,最终还是会撞上CPU图像处理性能瓶颈的枪口。