Android模糊图像教程(3)

554 查看

在之前的文章中,我们介绍了模糊图像方法。我们提到要将blur方法放在布局阶段。这样能确保只有在布局变化时模糊操作才会被调用,而不是在onDraw()中调用。 为什么不能在onDraw()中调用?这篇文章会从测试的角度来解释这一问题。

part1

我们之前提到过一个非常有用的测试类:TimingLogger类,可用于性能测试并发现瓶颈。日志在debug中非常有用,但是由于需要将结果输出为字符串,并且需要一些I/O操作来输出结果会间接影响测试结果,所不太适合性能调优。TimingLogger会在测试代码段执行之前创建一个TimingLogger对象,并且在代码执行过程中调用TimingLogger类的addSplit()方法来添加测试断点。addSplit()方法是非常轻量级的,并且不会在代码执行中输出结果。当代码执行之后,我们可以用dumpToLog()方法输出测试结果。这样一来,只会在代码运行的过程中使用addSplit()方法添加测试断点,而不会去执行创建Timinglogger对象和输出测试结果这两个操作,由此提高了性能测试的准确性。

当我们添加TimingLogger的特性时,代码将如下:

如果我们运行这一代码段,在logcat中将不会显示任何结果。这是由于TimingLogger类的一个特性:只会在详细日志(Verbose Logging level)中显示运行结果。因此我们需要执行以下adb指令来显示特别标签日志。

当再次运行代码后,将会显示来自TimingLogger的输出结果(数据来自Nexus 5 Android 4.4.2)。

这里总共需要的时间为47ms,似乎并不是太久。但当相比RenderScript在Adreno 330 GPU(Nexus 5 Snapdragon 800 Soc)执行的结果来看,这已经是很好的结果了。现实的问题是,当把模糊操作加入到onDraw()方法中时,会毁坏动画甚连向下滑动ListView的动画都无法做到。出现这个问题的原因是,模糊操作对于每一帧都需要47ms,z这会将帧速率(frame rate)降到20 fps(帧/秒)。如果考虑到动画和绘制需要的时间,实际的帧速率会更低。如果在效率更低的设备上情况将会更糟糕。

大多游戏需要30-60fps,所以如果在onDraw()中使用模糊操作,程序画面将不会平滑的展现出来。在之后的系列中,我们将介绍更多的可行的在动画过程中优化模糊操作的方法。

现在我们可以测量模糊操作的性能,在下一篇文章中我们将会比较在纯Java环境中,RenderScript和模糊的性能。

本文的源代码可以点击这里