我应该使用啥来获得更好的性能、九个补丁或可绘制的 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
,而后者又使用本机调用导致SkCanvas
、SkDraw
和最终SkScan
和SkBlitter
.
另一方面,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@ 使用几乎相同的逻辑,[另一个糟糕的简化] 在那里传递并由 NinePatch
和 GradientDrawable
创建的参数集不会对方法的复杂性产生太大影响,那么NinePatch
的填充和轮廓比GradientDrawable
快大约2 倍。好吧,只要您使用常规的 9 部分 9-Patch(即不要用大量标记将您的 9-Patch 撕成碎片,这使得对这些部分的迭代过于费力)。
如果我错了,请纠正我。
PS 是的,我知道这不是一个直接的答案
【讨论】:
干得好,感谢您的回答。这几乎是我想听到的。你向我展示了一个很好的例子来深入了解源代码:) 实际上,我现在正在编辑答案,结果发现我忽略了一些东西,所以我删除了一些论点:) 但是结果是一样的 -NinePatches
win。
+1。用最简单的话来说:现成的像素数据与程序生成的具有额外 CPU 周期的数据。在一般的计算机图形学中也是如此。以上是关于我应该使用啥来获得更好的性能、九个补丁或可绘制的 xml 资源?的主要内容,如果未能解决你的问题,请参考以下文章
我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?
我应该将 let 值从 for 循环中取出以获得更好的性能吗?
我找到了与 MY-SQL 相关的解决方案。我的要求是oracle。我应该在POJO类中写啥来通过hibernate获得以下模式结构