top of page

macOS 15.8.2 在 RC 版本中導致 OpenGL 故障,Apple 其後修復

1 小時前
讀畢需時 13 分鐘

在兩個候選發布版本令多個 Mac 應用程式的加速 3D 檢視畫面一片空白後,「macOS 15.8.2 導致 OpenGL 故障」成為焦點。問題波及 Apple silicon Mac,影響原生及透過 Rosetta 運行的軟件,並持續至第二個候選版本。然而,這個令人憂慮的標題忽略了一項關鍵細節:Apple 在正式更新推出前,已於候選發布版本 3 修復此回歸問題。

這仍然是嚴重的 macOS OpenGL 問題。使用 NSOpenGLView,或將 NSOpenGLContext 直接附加到視窗的應用程式,可能會失去可繪製表面。選單及其他介面元素仍會顯示,但 CAD 模型、終端機視窗、遊戲及外掛介面則會呈現空白區域。

這次事件揭示了 Apple 持續承諾相容性,與其八年來致力推動開發者轉向 Metal 之間更大的矛盾。OpenGL 雖已被棄用,但不少仍在維護的應用程式依然依賴它。因此,破壞這個相容性層的維護更新,其影響可遠超已遭棄置的軟件。

macOS 15.8.2 對 OpenGL 造成了甚麼影響

這次回歸問題並非停用了所有 OpenGL 操作,而是破壞了在一般應用程式視窗內呈現加速 OpenGL 內容的路徑。

首份詳細的開發者報告描述了一部配備 M1 Pro 晶片的 MacBook Pro 上出現的故障。問題在由 macOS 15.8 升級至 macOS 15.8.2 候選發布版本 1、版本號 24H219 後出現。

一項最小測試建立了 NSOpenGLView、要求使用加速像素格式,並嘗試繪製一個綠色方格。程式沒有取得可用的預設 framebuffer,反而回報未有附加 drawable。

framebuffer 是儲存已繪製像素、並在畫面顯示前使用的影像儲存區。若沒有有效的預設 framebuffer,應用程式可以發出圖像指令,卻無法在視窗中呈現結果。

該測試返回了三項重要訊號:kCGLCPHasDrawable 為零、framebuffer 狀態為 GL_FRAMEBUFFER_UNDEFINED,而 glClear 產生 GL_INVALID_FRAMEBUFFER_OPERATION。相關的核心日誌則回報無效的表面識別碼。

這些結果大幅縮小了問題範圍。應用程式已建立 OpenGL context,但 macOS 在將該 context 連接至由作業系統管理的視窗表面時失敗。

這個分別解釋了令人困惑的使用者體驗。受影響的應用程式可正常啟動,並顯示選單、按鈕、檢查器或工具列;其加速畫布卻會維持白色、黑色或透明,因為最終呈現路徑已失效。

原始報告者發現,離屏 framebuffer object 仍可使用。同一個程序中的 CAOpenGLLayer 及 NSOpenGLLayer 亦能繼續繪製。這些結果顯示底層 OpenGL 實作並未完全消失。

故障同時影響 arm64 應用程式,以及經 Rosetta 運行的 x86_64 應用程式。它亦會在支援 layer 與不支援 layer 的檢視中出現,並涵蓋主執行緒及背景執行緒的繪製路徑。

這種廣泛性十分重要,因為它令單一應用程式 bug 的可能性較低。多種不同設定都在作業系統的視窗表面路徑中遇到同一故障。

報告提及 Sony Imaging Edge Desktop Viewer、DJI Studio、kitty、Alacritty、Godot 及 Bambu Studio。其後,其他使用者亦確認 FreeCAD、PrusaSlicer、OrcaSlicer、音訊外掛介面及多款 OpenGL 遊戲受到影響。

另一批使用者報告指出,OpenSCAD 及 Bambu Studio 的 3D 區域顯示空白。一項診斷測試發現,加速 OpenGL 呈現失敗,但軟件 OpenGL 與 Metal 均可通過測試。

這個組合提供了另一項有用線索。這些應用程式並非普遍無法繪製,而 Mac 亦沒有失去所有圖像加速功能。某一條舊式加速呈現路徑拒絕了獲提供的表面。

這個 macOS OpenGL 問題亦在多代 Apple silicon 上重現。公開報告包括 M1、M2 Pro、M4、M4 Pro 及 M4 Max 系統。這些證據顯示,問題並不限於某一種 GPU 型號。

回歸問題在 macOS 15.8.2 候選發布版本 2、版本號 24H225 中仍然存在。10 月 14 日的測試同樣出現缺少 drawable、未定義 framebuffer 及無效表面訊息。

當時的擔憂是合理的。兩個候選發布版本都暴露出維護分支中廣泛的相容性故障,而來自互不相關開發者的應用程式亦呈現相同症狀。

不過,兩個版本都不是最終公開發布版本。當第三個候選版本推出後,這一點便變得關鍵。

為何「已棄用」不等於「可隨意捨棄」

Apple 在 2018 年棄用 OpenGL,但 macOS 仍為相容性而提供該框架,因而實際上有責任讓現有應用程式繼續運作。

Apple 在 macOS Mojave 10.14 宣布棄用 OpenGL。其 Mojave 發行說明指出,OpenGL 及 OpenCL 框架會繼續提供以維持相容性。Apple 建議開發者把新工作轉移至 Metal。

棄用是開發訊號,而非即時移除。它表示開發者應避免為新項目建立對該介面的依賴,因為其前景有限。現有二進制程式仍可在多年後依賴該介面。

OpenGL 本身是一種跨平台圖像 API,用於向 GPU 提交繪製指令。Apple 首選的替代方案 Metal,則是其為 macOS、iOS、iPadOS 及相關系統提供的平台專屬圖像與運算 API。

對新的 Mac 應用程式而言,Metal 顯然是長遠選擇。它獲得目前的平台功能,也符合 Apple 的圖像架構。然而,這不代表所有現有產品都能輕易遷移。

CAD 程式、科學視覺化工具、創意應用程式、終端機模擬器、遊戲及跨平台框架,常常在不同作業系統之間共用繪製程式碼。取代一個後端可能需要架構工作、額外測試,以及在漫長的過渡期內支援兩條繪製路徑。

部分項目採用 Qt、GLFW、SDL、遊戲引擎或其他抽象層。這些層可減少平台專屬工作,但未必總能完全消除。框架仍可能因應特定版本、功能或部署目標而選用 OpenGL 後端。

較舊的商業應用程式則面對另一個問題。其開發者可能只維護必要的相容性,特別是當 Mac 版本只佔使用者群很小一部分時。即使客戶仍依賴該軟件,完整的 Metal renderer 未必在財務上合理。

開源項目亦面對類似限制。貢獻者可能要在有限的測試硬件下支援多個平台。由於大部分繪製邏輯可在 Linux、Windows 及 macOS 之間共用,OpenGL 路徑仍具吸引力。

Apple 亦一直讓 Apple silicon 支援 OpenGL。這項決定令不少 Intel 時代的應用程式得以在架構轉換期間繼續運作。因此,使用者逐漸認為已棄用的 OpenGL 是舊技術但仍可用,而非已不存在。

15.8.2 的回歸問題正好衝擊這項預期。應用程式沒有顯示技術不獲支援的有序警告,而是啟動後失去最重要的可視區域。

這就是為何「開發者本應遷移」並非完整回應。遷移可減少日後風險,但使用者無法重寫已購買的應用程式、專門工程工具或已遭棄置的遊戲。

反過來說,另一種觀點亦過於延伸。測試版回歸問題並不證明 Apple 暗中移除了 OpenGL,也不代表其蓄意強迫使用者升級。仍然可運作的離屏及 layer 型路徑,與故意全面關閉框架的說法相矛盾。

較狹義的證據指向加速視窗呈現中的相容性 bug。其技術特徵及其後的逆轉,都支持這個解讀。

關鍵壓力落在兩個群體身上。Apple 必須防止低優先度的舊式程式碼成為難以預測的故障點。應用程式開發者則必須決定,能依賴一個自 2018 年起已被 Apple 勸阻使用的框架多久。

任何一方都無法令轉換成本消失。使用者正處於兩者之間的不舒服位置。

真正的矛盾是相容性與遷移之爭

Apple 希望開發者採用 Metal,而使用者仍期望已隨系統提供的相容性框架能在例行作業系統更新後繼續運作。

這正是整個故事的核心張力。OpenGL 的棄用令它對 Apple 的策略而言不再重要,但持續提供它,則令它對使用者的實際運作變得重要。

成熟的相容性層在正常運作時很少引起注意;當一項微小的內部變更令表面上毫無關係的應用程式失效時,其價值才會浮現。

15.8.2 的故障就是清晰例子。攝影師的檢視器、3D 打印切片軟件、終端機模擬器、音訊外掛及開源遊戲並不屬於同一市場,卻可能匯聚到同一條作業系統繪製路徑。

這帶來了一項不尋常的測試挑戰。Apple 無須逐一驗證每個應用程式,便可捕捉這種廣泛回歸問題。一項透過 NSOpenGLView 呈現加速 OpenGL 的小型自動化測試,應足以揭露缺少 drawable 的問題。

公開的最小重現程式正好完成了這項工作。它使用公開的 Apple 框架、繪製簡單顏色,並檢查 framebuffer 狀態。其狹窄範圍令這份報告比單純列出故障應用程式更具可操作性。

Apple Developer Technical Support 工程師確認收到該報告,並要求提供較後版本的結果。工程師亦要求提交 sysdiagnose,這會擷取接近故障發生時的詳細系統狀態。

Apple 並未公開承諾修復的發布日期。該工程師表示,公司不能評論已知問題或修正是否會推出。這項回應令一些開發者感到不滿,因為他們在沒有明確承諾下仍要負責重複測試。

其他人則較正面地看待這次交流。報告已送達正確渠道、包含最小重現程式,並獲要求提供額外證據。這正是候選發布版本測試的目的。

有關分歧在 Hacker News 討論中尤其明顯,討論吸引數百則留言。批評者認為,這次回歸問題是 Apple 忽視已棄用技術的另一個跡象;辯護者則強調,受影響的版本屬於預發布軟件,而且 Apple 正積極收集結果。

兩種立場各自反映了部分情況。候選發布版本的存在目的,是在正式發布前找出缺陷;在該階段發現 bug,不等同於將其大規模推出。

不過,候選發布版本亦代表被認為接近完成的版本。影響許多常用應用程式的回歸問題值得審視,特別是在第二個候選版本中仍然持續時。

精確用語在此至關重要。「macOS 15.8.2 Breaks OpenGL」準確描述了已測試的候選版本,但暗示最終正式版已出現這個結果,實際上當時尚未發生。加入「RC」既能保留警示,又不會抹去該軟件仍屬預發佈版本的狀態。

這個區別不只是標題措辭問題。用戶會根據所感知的發佈狀態作決定。若有人讀到一個已完成的更新破壞了關鍵軟件,可能會嘗試具風險的回退操作;若知道是 beta 缺陷,則可避開該版本並觀察下一個候選版本。

相容性與遷移之間的衝突,也會影響開發者的規劃。專案可保留其 OpenGL 渲染器,同時加入針對性的防護措施,但每次未來的 macOS 更新都會帶來不確定性。原生 Metal 後端需要更多投入,卻更符合 Apple 支援的方向。

轉譯層提供了一條中間路線。MoltenVK 將 Vulkan 應用程式映射至 Metal,而較新的可攜性工作可透過現代 API 轉譯 OpenGL 行為。這些層可減少部分平台特定的工作,但也帶來自身的相容性及效能考量。

OpenGL 的動態狀態模型,可能難以高效率地映射至現代圖形 API。Metal 與 Vulkan 鼓勵開發者預先組裝更多狀態。OpenGL 則容許在渲染期間進行大量狀態變更,這可能迫使轉譯層重建或快取現代管線物件。

這種架構上的不匹配,意味著遷移並非機械式地重新命名函式。應用程式必須重新考慮資源管理、shader 編譯、同步及呈現行為。

即使如此,這次回歸問題仍展示了延後遷移的代價。已棄用的程式碼獲得的功能開發較少,測試覆蓋率也可能較低。其使用者會異常依賴細小的維護修復。

Apple 仍掌握協議的另一半。若它提供相容性介面,點更新便不應在支援的硬件上悄然破壞一條核心路徑。

RC 3 修復改寫了事件脈絡

macOS 15.8.2 release candidate 3 恢復了損壞的路徑,將原本可能公開出現的相容性故障,變成一次成功捕捉到的預發佈問題。

原始開發者在測試 release candidate 3、build 24H230 後更新了論壇討論串。獲採納的答案指出,問題已修復,而 OpenGL 視窗呈現亦再次正常運作。

報告亦發現了一項值得注意的版本變更。IOGPUFamily 在損壞版本中為 104.6.6,於 RC 3 則回到 104.6.5。

這項觀察顯示 Apple 可能已回退或替換與回歸問題相關的圖形元件。單憑此點,無法揭示有缺陷的程式碼,也無法證明整個元件導致故障。

修復後的版本,是反駁「故意移除」說法的最有力現有證據。Apple 沒有讓視窗路徑繼續失效,亦沒有宣稱該行為屬預期;後續候選版本恢復了它。

這個逆轉並不代表最初的報告不重要。RC 1 和 RC 2 確實在多部電腦及多個應用程式上失效。安裝這些版本的開發者曾面對真實的干擾。

但它改變了應有的結論。最終事件並非 Apple 在 macOS 15.8.2 終止 OpenGL 相容性,而是嚴重回歸問題進入了兩個預發佈版本,透過可重現測試被記錄下來,並在第三個版本中得到修正。

時間點亦說明為何 beta 報告需要持續更新。一篇基於 RC 2 的靜態文章,會在 RC 3 發佈後變得具誤導性。軟件報道必須追蹤 build 編號,而不僅是市場版本號。

Build 編號之所以重要,是因為 Apple 可發佈多個帶有相同可見版本標籤的二進位檔。在本例中,24H219、24H225 和 24H230 均屬於 15.8.2 測試序列,但表現並不相同。

因此,用戶在診斷 OpenGL 故障前應確認已安裝的 build。單靠 macOS 版本未必能區分受影響的候選版本與已修復的版本。

這次修復也驗證了原始報告者的工作。他們提供了最小化公開範例、kernel 輸出、呼叫追蹤、受影響配置,以及獨立回饋識別碼。這些證據讓 Apple 能夠鎖定一項明確而可重複的故障。

較不具體的報告,可能只會指出數個應用程式顯示空白視窗。該症狀可源於應用程式設定、損壞的快取、不相容的外掛程式、GPU 故障或 framework 問題。

這個重現測試將這些可能性區分開來。它證實同一個公開 API 在一個極小型程式中失效,而相關渲染路徑仍可運作;其後又使用相同測試確認修正結果。

仍有一個合理的品質問題:一條核心相容性路徑在多代 Apple silicon 上失效。重現程式的簡單程度,引發了 Apple 的自動化覆蓋範圍是否包括維護分支上加速 NSOpenGLView 呈現的疑問。

沒有公開證據可確定 Apple 內部測試甚麼。因此,聲稱不存在任何回歸測試會是不正確的。這次故障只顯示,任何既有流程都未能阻止前兩個候選版本送達測試者手中。

這次事件亦不能證實 macOS 軟件品質出現更廣泛的下滑。個別開發者提到其他長期問題,但這些軼事並不能提供受控的趨勢衡量。

證據所支持的結論較為狹窄,但仍然重要。已棄用 framework 可承載廣泛的應用程式依賴範圍,同時得到的可見關注少於現行 API。這種組合使基本相容性測試尤其有價值。

開發者不應將 RC 3 解讀為可以永遠忽略遷移的許可。修復保留的是現時相容性,而非 OpenGL 的長期地位。Apple 的建議依然是 Metal。

用戶亦不應把每項 beta 故障都視作永久的平台決策。Release candidate 是特定 build 的證據,並非最終產品行為的證明。

開發者與 Mac 用戶接下來應留意甚麼

下一項測試是經修正的 build 能否原封不動地進入正式版,接著是受影響應用程式是否確認渲染恢復正常。

第一個訊號是最終 macOS 15.8.2 的 build 編號。若 Apple 發佈 build 24H230,或較後而保留修正的 build,核心回歸問題便已為一般用戶解決。

任何正在使用較早 release candidate 的人,都不應假定版本標籤代表修復已存在。查看 build 編號可將受影響的 24H219 和 24H225 候選版本,與 RC 3 區分開來。

第二個訊號是應用程式層面的確認。最小化範例證明 framework 路徑可運作,但正式軟件還涉及 toolkit、外掛程式、渲染迴圈及應用程式特定狀態。

開發者應重新測試報告中提及的應用程式,包括 CAD 及切片工具、終端機模擬器、遊戲、影像軟件和音訊外掛程式介面。這些類別均成功渲染,將增強人們對修復涵蓋更廣泛影響的信心。

若用戶在 RC 3 或正式版上仍看到空白的 3D 視窗,應記錄確切 macOS build、Mac 型號、應用程式版本及渲染後端。這些資訊可將原始回歸問題與無關的應用程式問題區分開來。

第三個訊號是未來維護版本如何處理已棄用的圖形路徑。一次獲修正的回歸問題,並不能回答 Apple 是否已加強對 NSOpenGLView、NSOpenGLContext 及相關呈現路徑的覆蓋。

應用程式開發者毋須立即重寫每一個渲染器,也可減少所面對的風險。自動化啟動測試可驗證視窗是否接收有效 framebuffer、呈現已知影像,以及返回預期的圖形錯誤。

若產品依賴舊式圖形技術,團隊應在 Apple 的 beta 及 release-candidate builds 上執行這些測試。一套小型相容性測試可在客戶遇到問題前,識別作業系統的回歸問題。

如有可能,開發者可保留備援路徑。論壇報告發現 CAOpenGLLayer 仍可運作,而軟件 OpenGL 在至少一項用戶測試中仍然可用。這些選項或能讓應用程式維持可用,但效能及整合方式可能不同。

另一項提出的解決方法,是渲染至由 IOSurface 支援的離屏 framebuffer,並透過 Core Animation layer 呈現。IOSurface 是 Apple 用作在圖形及系統元件之間共享影像緩衝區的機制。

這項解決方法在技術上有意義,但並不簡單。它改變了呈現架構、增加同步方面的考量,並要求應用程式開發者發佈新版本。對使用封閉或不再支援軟件的用戶而言,它並非實際可行的修復方式。

對壽命較長的產品而言,策略問題仍是應加入 Metal、採用可攜性層,還是轉向具備持續維護 macOS 後端的 framework。正確選擇取決於效能要求、平台覆蓋範圍及可用的工程時間。

依賴專用 OpenGL 應用程式的 Mac 用戶,應審慎看待重大及維護更新。保留最新備份,並等待針對應用程式的確認,可降低意外回歸問題的代價。

這項建議並不代表應無限期避開更新。安全性修正很重要,而繼續使用舊作業系統亦會帶來自身風險。較佳做法是分階段部署,特別是在工作室、實驗室、工場及生產環境中。

「macOS 15.8.2 Breaks OpenGL」這句話捕捉到一次真實而嚴重的 beta 故障,但未能呈現完整結果。RC 3 在最終發佈前恢復了受影響的視窗渲染路徑,顯示 beta 流程在一次令人不安的遺漏後發揮了作用。

長遠的教訓並非已棄用軟件不值得支援,亦非每項 release-candidate 缺陷都代表平台崩潰。重點是:相容性承諾需要測試,而報道需要 build 級別的精確度。

若你的工作依賴某個 OpenGL 應用程式,請先確認確切的 macOS build,並在一部非關鍵用途的 Mac 上測試已修正的版本。然後向應用程式開發者提出一個較長遠的問題:當 Apple 最終不再把修復 OpenGL 相容性視為值得處理的事情時,甚麼渲染路徑能保障這個工作流程?

 
 

為每個智能代理提供更完整的背景,提升工作表現

讓智能代理連接 remio 已整理好的知識、決策和歷史紀錄。

remio 目前支援 Windows 10+(x64) 及配備 Apple 晶片的 Mac。

你的 AI 工作夥伴
和 remio 一起高效工作

規劃、創作、交付
一站式完成

bottom of page