簡體   English   中英

Swift中的NSAttributedString draw(in:rect)性能不好嗎?

[英]NSAttributedString draw(in: rect) in Swift have poor performance?

我有一個UIView ,可能同時在屏幕上包含400-500多個字符串。 而且此UIView是可滾動的。 第一個決定是將UICollectionView與自定義布局一起使用。 UIcollectionView中的項目同時在屏幕上的數量不超過30-50時,此方法UIcollectionView 如果我擠壓UIView (按捏手勢),並且同時在屏幕上顯示100-150多個項目,則嘗試滾動時會出現滯后現象(降低幀速率並繪制1幀需要20-50毫秒以上的時間)。

好。 然后,我決定絕對手動繪制UIView 對於繪制形狀,我使用CGContext(即使同時繪制1000-2000個形狀,效果也很好)。 但是,當我嘗試使用NSAttributedString draw(in:rect)繪制許多字符串(100-300)時,滾動時會產生非常糟糕的性能。

繪制50個字符串(幀率還可以,繪制時接近16ms) 在此處輸入圖片說明

繪制150個字符串(幀率很差,繪制時接近30ms) 在此處輸入圖片說明

繪制300個字符串(幀率很差,繪制時接近60ms) 在此處輸入圖片說明

那么,問題是為什么Swift中的NSAttributedString draw(in:rect)性能差? 即使我同時向View添加300 UILabel並嘗試滾動其幀速率也是可以的(每幀不超過17ms)。 UILabel如何在屏幕重繪時在內部繪制文本以實現高性能?

在大多數情況下,自己繪制圖紙並不能改善性能。

UILabel之所以快速,是因為它必須只繪制一次字符串。 然后,它將繪制的字符串的位圖圖像保留在其后備存儲中。 此后將在每個幀中重復使用。 同樣,所有視圖位圖的合成也將通過GPU完成。

如果您自己繪制圖形,則很可能無法從緩存的后備存儲中受益。 正如您所注意到的,必須重繪整個視圖很慢。 可以通過僅重繪實際更改的部分(使用setNeedsDisplay(rect) )來進行改進,但是在縮放時通常是不可能的。 手動繪制速度很慢,因為用於此目的的所有Core Graphics API在CPU而不是GPU上運行。

您將集合視圖與自定義布局一起使用的方法應該能夠很好地解決這一問題。 編寫性能良好的集合視圖布局並不容易,但是有可能。 也許您應該使用儀器對此進行調查,然后問另一個問題。

暫無
暫無

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

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