我应该使用啥来获得更好的性能、九个补丁或可绘制的 xml 资源?

Posted

技术标签:

【中文标题】我应该使用啥来获得更好的性能、九个补丁或可绘制的 xml 资源?【英文标题】:What should i use for better performance, nine-patch or drawable xml resource?我应该使用什么来获得更好的性能、九个补丁或可绘制的 xml 资源? 【发布时间】:2013-08-07 01:34:43 【问题描述】:

为某些视图设置背景的最佳方法是什么?例如 2 个背景变体:

    带渐变、圆角和边框的背景 只有一种颜色和圆角的背景

那么哪种变体会更好,九个补丁还是可绘制的 xml 资源?

【问题讨论】:

我不知道! :) 但由于标准的 android 主题大量使用 9patch,我认为这样做不会太错误。 如果我只需要一种颜色背景,也许 xml 资源会更快?至少 xml 文件会更小 如果你只需要一种颜色,用它设置背景。无需图片资源,无需xml配置 但是,如果我需要圆角怎么办? 【参考方案1】:

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

GradientDrawable(用于 xml 中的矩形)使用this code 调用到Canvas,而后者又使用本机调用导致SkCanvasSkDraw 和最终SkScanSkBlitter .

另一方面,NinePatch's draw() has almost zero Java code 在原生 call to NinePatch.cpp 之前 shortly calls NinePatchImpl.cpp -- NinePatch_draw() --- 这就是神奇之处。那里的代码在标记的区域上进行迭代,在随后的多次调用之后,使用SkDraw 中大致相同的逻辑(仅drawRect() 而不是drawPath())绘制内容,但最终它是相同的SkScan 和@987654345 @ 做这项工作。

所有这些代码都很难让我立即理解,但真正引起我注意的是GradientDrawable 如果同时具有背景和描边 (look here) 会对整个本机堆栈进行两次调用,而在NinePatch 的任何场景都只能制作一个。

因此,在没有实际测量这两种方法的时间的情况下,我感觉在大多数情况下NinePatch 赢得了比赛:如果我们[糟糕]大致假设 drawRect() 和 @ 的本机调用堆栈987654350@ 使用几乎相同的逻辑,[另一个糟糕的简化] 在那里传递并由 NinePatchGradientDrawable 创建的参数集不会对方法的复杂性产生太大影响,那么NinePatch 的填充和轮廓比GradientDrawable 快大约2 倍。好吧,只要您使用常规的 9 部分 9-Patch(即不要用大量标记将您的 9-Patch 撕成碎片,这使得对这些部分的迭代过于费力)。

如果我错了,请纠正我。

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

【讨论】:

干得好,感谢您的回答。这几乎是我想听到的。你向我展示了一个很好的例子来深入了解源代码:) 实际上,我现在正在编辑答案,结果发现我忽略了一些东西,所以我删除了一些论点:) 但是结果是一样的 - NinePatches win。 +1。用最简单的话来说:现成的像素数据与程序生成的具有额外 CPU 周期的数据。在一般的计算机图形学中也是如此。

以上是关于我应该使用啥来获得更好的性能、九个补丁或可绘制的 xml 资源?的主要内容,如果未能解决你的问题,请参考以下文章

我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?

我应该将 let 值从 for 循环中取出以获得更好的性能吗?

我找到了与 MY-SQL 相关的解决方案。我的要求是oracle。我应该在POJO类中写啥来通过hibernate获得以下模式结构

Android 可绘制语音气泡

分而治之总是获得更好的性能吗?

我应该将 jQuery 选择器组合到变量中以获得更好的性能吗? [复制]