[英]CALayer performance problem: animating a line anchored between two UIViews
我有一個iPad應用程序,該應用程序具有可拖動的UIView,該UIViews包含在較大的父UIView中(我將其稱為主視圖)。 該應用程序的功能之一是能夠在兩個視圖之間拖動以連接它們。 拖動時,我會在CALayer中渲染一條線,該線植根於您開始拖動並終止於用戶手指的視圖上。 如果用戶在另一個視圖頂部結束拖動,則它們將變為附加狀態。
附加視圖后,它們之間會永久畫一條線。
因此,在當前的實現中,有兩個CALayer,它們是主視圖的子層。 一種是linkLayer,它呈現視圖之間的現有鏈接。 另一個是linkLineLayer,它使用拖動動作呈現用戶當前正在繪制的線。
當發生拖動並且出現新的拖動事件時,我將調用[linkLineLayer setNeedsDisplay]。 同樣,當用戶在我周圍拖動視圖時,請調用[linkLayer setNeedsDisplay]。
在實際設備上的性能太差了,所以我猜這不是可行的方法。 有什么選擇可以在視圖(或視圖中的點)之間繪制線,以便在拖動視圖或在視圖之間拖動線時可以頻繁更新它們,而不會破壞幀速率和錘擊設備cpu?
更新因此,昨晚我進去做了兩個修正,這些修正產生了很大的不同:1.)所有鏈接線都是它們自己的層。 當一個視圖被拖動時,我只刷新與該特定視圖關聯的鏈接線。
2.)將“拖動線”更新為一個圖層,該圖層的大小限於所渲染的線的大小。 我在用戶的手指移動時調整圖層邊界。
您是否嘗試過將線條渲染為CAShapeLayer
? 不必自己一直畫線,而是一直設置setNeedsDisplay
,而只需設置CAShapeLayer
的path
屬性,然后讓它完成其余的工作即可。
Core Animation處理CAShapeLayer
的方式不同,它可以優化路徑的繪制。 如果您只是自己在drawLayer:inContext:
或等效項)中繪制路徑, drawLayer:inContext:
Core Animation必須將整個圖層視為圖像,因為它不知道您繪制了什么。 如果使用CAShapeLayer
,Core Animation會提前知道您要繪制的路徑,並且可以相應地優化其渲染。 您也不必擔心形狀圖層的大小和位置,因為該圖層只是路徑。
另外,如果要繪制沒有填充的開放路徑(線),則需要額外的指針,您必須將形狀圖層的fillColor
屬性設置為nil
。 如果不這樣做,它將自動關閉路徑並以默認顏色填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.