簡體   English   中英

CALayer性能問題:動畫化兩個UIView之間錨定的線

[英]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 ,而只需設置CAShapeLayerpath屬性,然后讓它完成其余的工作即可。

Core Animation處理CAShapeLayer的方式不同,它可以優化路徑的繪制。 如果您只是自己在drawLayer:inContext:或等效項)中繪制路徑, drawLayer:inContext: Core Animation必須將整個圖層視為圖像,因為它不知道您繪制了什么。 如果使用CAShapeLayer ,Core Animation會提前知道您要繪制的路徑,並且可以相應地優化其渲染。 您也不必擔心形狀圖層的大小和位置,因為該圖層只是路徑。

另外,如果要繪制沒有填充的開放路徑(線),則需要額外的指針,您必須將形狀圖層的fillColor屬性設置為nil 如果不這樣做,它將自動關閉路徑並以默認顏色填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM