我应该用什么来获得更好的性能,九补丁或可绘制的XML资源?

为某种观点设置背景的最佳方式是什么? 例如2个背景变体:

  1. 背景渐变,圆angular和边框
  2. 只有一种颜色和圆angular的背景

那么哪个变种会更好,九补丁或可绘制的XML资源?

Solutions Collecting From Web of "我应该用什么来获得更好的性能,九补丁或可绘制的XML资源?"

我的猜测是NinePatch在大多数情况下会稍微快一点。 这是我发现的。

GradientDrawable (用于xml中的rects)使用此代码调用Canvas ,而Canvas则使用本地调用通往SkCanvasSkDraw ,最终SkScanSkBlitter

另一方面,在本地调用NinePatch.cpp之前, NinePatch的draw()几乎为零,Java代码 很快调用了NinePatchImpl.cppNinePatch_draw() —这就是魔法所在。 在那里的代码遍历标记的区域,并在一些后续调用之后使用大致相同的SkDraw逻辑(只drawRect()而不是SkDraw drawPath() ),但最终是做同样的SkScanSkBlitter的工作。

所有这些代码都很难将我的脑袋迅速包裹起来,但是我所看到的是,如果GradientDrawable同时具有背景和笔画( 看这里 ),则会对整个本地堆栈进行两个调用,而在任何情况下, NinePatch只会使一。

所以,在没有实际测量两种方法的时间的情况下,我在大多数情况下NinePatch赢得了比赛:如果我们粗略地假设drawRect()drawPath()本地调用堆栈使用几乎相同的逻辑, 简化]通过NinePatchGradientDrawable创build的参数集不会影响方法的复杂度,那么NinePatch结果大约比GradientDrawable的填充和轮廓快两倍。 那么,假如你使用了一个普通的9段9块补丁(也就是说,不要把9块补丁划分成很多标记,那么这个补丁就太费力了)。

任何人都会偶然发现这个问题,并且知道更多关于这个问题的知识(和/或更好地估计本地代码的复杂性),请纠正我,如果我错了。

PS是啊,我知道这不是一个直接的答案