![](/img/trans.png)
[英]Nine-Patch Drawable vs Shape Drawable. Which should be preferred?
[英]What should i use for better performance, nine-patch or drawable xml resource?
為某些視圖設置背景的最佳方法是什么? 例如backround的2個變體:
那么,九個補丁或可繪制的xml資源哪個更好?
我的猜測是,在大多數情況下, NinePatch
會稍微快一些。 這是我發現的。
GradientDrawable
(用於xml中的SkCanvas
代碼 )使用此代碼來調用Canvas
,后者又使用本機調用導致SkCanvas
, SkDraw
以及最終的SkScan
和SkBlitter
。
在另一方面, NinePatch
的平局()幾乎為零的Java代碼的原生之前調用NinePatch.cpp
這不久調用NinePatchImpl.cpp
- NinePatch_draw()
---而這也正是神奇的是。 那里的代碼會遍歷標記的區域,並且在隨后的多次調用中,使用SkDraw
大致相同的邏輯繪制東西(僅使用drawRect()
而不是SkDraw
drawPath()
) SkScan
SkBlitter
,但最后還是由相同的SkScan
和SkBlitter
來完成工作。
所有這些代碼很難立即吸引我,但是讓我吃驚的是,如果GradientDrawable
同時具有背景和筆觸,那么它將對整個本機堆棧進行兩次調用( 請看此處 ),而在任何情況下, NinePatch
只會使一。
因此,在大多數情況下,我並沒有實際衡量這兩種方法的時間,我感覺NinePatch
贏得了比賽:如果我們[ NinePatch
]粗略地假設drawRect()
和drawPath()
本機調用堆棧使用的邏輯幾乎相同,而[另一個糟糕的是簡化] ,由NinePatch
和GradientDrawable
創建並傳遞到那里的參數集對方法的復雜性影響不大,因此NinePatch
結果比帶有填充和輪廓的GradientDrawable
快約2倍。 好吧,只要您使用常規的9節9貼片(即不要用大量標記切碎9貼片,那么遍歷整個片段的工作就會非常費力)。
任何會偶然發現這一點並且對這個主題了解更多的人(和/或更擅長估計本機代碼的復雜性),如果我錯了,請糾正我。
PS是的,我知道這不是一個直接的答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.