WWDC25

2025 年 6 月 20 日

打造絲滑體驗:WWDC25 揭秘 SwiftUI 性能優化的三大核心關鍵

已複製到剪貼板


在開發卓越的 iOS 應用程式時,「流暢性 Responsiveness」是使用者衡量品質的第一指標。當使用者在滑動列表或觸發動畫時,任何微小的「掉幀 Hitches」或「卡住 Hangs」都會瞬間打破沉浸感,讓精心設計的介面顯得笨重。

身為開發者,我們最常問的問題是:「為什麼我的 SwiftUI App 會卡頓?」在過去,宣告式框架的內部運作如同一個「黑盒」,讓我們難以窺探性能瓶頸的根源。但在 Instruments 26 中,Apple 揭開了這層神祕面紗,推出了全新的 SwiftUI Instrument,讓我們能以視覺化的方式精準診斷性能問題。

WWDC 2025
WWDC 2025

「優秀的 App 擁有卓越的性能。應用程式中執行的任何程式碼,都有可能使其變慢。」-Jed, Apple Instruments Team

核心突破:視覺化診斷-打開 SwiftUI 的效能黑盒

在 Instruments 26 中,診斷不再僅依賴於猜測。全新的 SwiftUI Instrument 提供了一套完整的工具鏈,協助我們定位問題。

第一道過濾器:Update Groups 軌道

在開始深入研究程式碼前,首先要觀察的是 Update Groups 軌道。這是判斷問題是否源於 SwiftUI 的關鍵:如果 CPU 負載激增時此軌道處於空閒狀態,代表效能瓶頸可能存在於底層數據處理或網路請求中。

深入三項核心子軌道

一旦確認是 SwiftUI 的問題,我們可以透過以下子軌道進行細節分析:

  • 視圖主體更新 View Body Updates:監控 body 屬性的執行時間
  • 代表性視圖更新 Representable Updates:追蹤 UIViewRepresentable 的橋接開銷
  • 其他長更新 Other Long Updates:捕捉其餘可能導致延遲的 SwiftUI 內部作業

系統會自動以橘色或紅色標記出高風險區塊,這些顏色直接反映了該更新貢獻給掉幀或卡住的機率。

渲染迴圈與 Main Thread 的時間爭奪戰

要優化性能,必須理解 SwiftUI 渲染迴圈(Render Loop) 的運作機制。在每一影格中,系統必須處理事件並更新 UI,這一切工作(包括執行所有受影響的視圖 body)都必須在影格截止日期(Frame Deadline)前完成。

由於 body 運算是在 主執行緒(Main Thread) 上執行的,一旦計算超時,該影格就會錯過提交時機,導致系統被迫顯示前一影格,產生明顯的掉幀。

格式化工具的陷阱 death by a thousand cuts

body 中建立 MeasurementFormatterNumberFormatter 是極為昂貴的操作。雖然單一視圖的 1 毫秒延遲看似微不足道,但在滾動含有數十個項目的列表時,這些開銷會累積成災難性的性能崩潰。

優化策略:

  • 重用而非重建:絕對不要在 body 內初始化格式化工具
  • 預先快取邏輯:在 View Model 的 init 階段建立一次格式化實例,並將計算後的字串快取在資料層中,確保視圖僅需讀取成品,而非執行計算。

破除「連鎖反應」:精細化數據依賴

SwiftUI 性能下降的另一大主因是「不必要的更新」。在使用 @Observable 宏時,開發者常掉入間接存取(Indirect Access)的陷阱。

假設你有一個地標列表,每個 LandmarkListItemView 都會呼叫一個 isFavorite(landmark:) 函數,而該函數內部會讀取一個全域的 landmarks 陣列。此時,@Observable 會在每個項目視圖與整個陣列之間建立隱性依賴。結果就是:當你僅僅收藏了一個地標,整個列表的所有視圖都會被迫重新執行 body,因為對陣列的讀取觸發了連鎖反應。

解決方案:

  • 細顆粒度(Granular)View Model:捨棄讓所有視圖監聽大型集合的做法
  • 精確導向:為每個項目建立專屬的 View Model。當數據改變時,僅有該特定項目的視圖會被標記為「過期 Outdated」,確保系統僅執行最小範圍的更新

看透因果 Cause & Effect Graph 的力量

在傳統開發中,我們依賴回溯追蹤(Backtraces)來找 bug,但在宣告式的 SwiftUI 中,回溯追蹤通常只會顯示一堆無意義的 AttributeGraph 框架呼叫。

理解 AttributeGrap

AttributeGraph 是 SwiftUI 的核心心臟,負責定義視圖間的依賴關係。關鍵在於理解身分(Identity) 的概念:雖然視圖的結構體(Struct)會被頻繁地銷毀與重建,但對應的 Attribute 會在視圖的整個生命週期中保持穩定,這也是狀態(State)得以保存的原因。

追蹤因果鏈條

全新的 Cause & Effect Graph 讓我們能從左到右追蹤完整的觸發鏈:[手勢 Gesture] → [狀態改變 State Change] → [視圖更新 View Update] 透過此圖表,你能清楚看見哪一個狀態變動(例如點擊按鈕)導致了哪些視圖的 body 重新運算,徹底消除「為何這個視圖又更新了」的疑惑。

環境變數(Environment)的隱藏開銷

EnvironmentValues 的運作機制類似於字典。當環境中的任何一個值改變時,所有依賴環境的視圖都會收到通知。

即使該視圖讀取的特定數值沒有改變,系統仍需花費開銷進行檢查。在 Cause & Effect Graph 中,這種「已檢查但跳過 body 執行」的情況會以淡化圖示(Dimmed Icon)顯示。

  • External Environment:系統級更新(如深色模式切換)
  • EnvironmentWriter:透過 .environment 修飾符進行的內部更新

警告

避免在環境中存儲更新頻率極高的數據(如計時器或高頻率的幾何數值),這會迫使大量視圖不斷進行無謂的依賴檢查。

讓你的 AttributeGraph 節律優美

追求極致性能的黃金準則始終如一:「確保 View Body 更新快速,且僅在必要時更新。」

不要等到產品上線前夕才打開 Instruments。在開發早期,就應該運用 Time Profiler 尋找計算瓶頸,並透過 Cause & Effect Graph 優化數據流向。

身為追求卓越的 iOS工程師,在追求華麗新功能的同時,請務必停下來反思:「你能精確區分你的 EnvironmentWriter 更新與 External Environment 觸發之間的開銷差異嗎?」

現在就打開 Xcode 26,用最科學的方式,為你的使用者打造真正絲滑的感官體驗。

分享文章

已複製到剪貼板

主題文章

查看 WWDC25

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章