MetalKitdrawInMTKView在它希望您的代表繪制一個新框架時呼叫,但我想知道它是否等待最后一個可繪制物件呈現后再要求您的代表繪制一個新框架?
根據我閱讀這篇文章的理解,CoreAnimation 最多可以提供三個“飛行中”可繪制物件,但我無法找到 MetalKit 嘗試盡快繪制它們或者等待其他事情發生的任何地方。
這會是什么別的東西? 讓我有點困惑的是提前繪制最多兩幀的想法,因為這意味著 CPU 必須已經知道它想要在未來渲染兩幀,而且我覺得情況并非總是如此。例如,如果您的應用程式依賴于用戶輸入,則您無法預先知道用戶從現在到您正在繪制的兩個框架何時將執行的操作,因此它們可能會顯示過時的內容。這個假設正確嗎?在這種情況下,僅以預期幀速率確定的最大速率呼叫委托方法可能是有意義的。與幀速率同步的問題在于,這意味著 CPU 有時可能會在它本可以完成一些有用的作業時處于非活動狀態。drawInMTKView盡可能頻繁地呼叫可繪制物件,因為它們似乎依賴于呼叫它來以一種避免 CPU 停滯的方式使用資源來進行作業,但是由于有很多我不清楚的點我不確定是什么正在發生。
謝謝
uj5u.com熱心網友回復:
MTKViewpaused頁面中提到的檔案
如果值為
NO,則視圖以 的值設定的幀速率周期性地重繪內容preferredFramesPerSecond。
根據 for 的示例MTKView,它可能使用內部計時器和CVDisplayLink回呼的組合。這意味著它基本上會選擇“正確”的間隔在正確的時間呼叫你的繪圖函式,通常在其他可繪制物件顯示在“玻璃上”之后,所以在 V-Sync 間隔點,這樣你的幀就有最多的 CPU 時間被吸引。
您可以創建自己的視圖并使用CVDisplayLink或CADisplayLink管理呼叫抽獎的速率。還有其他方法,比如依賴drawable佇列的背壓(基本上只是nextDrawable在回圈中呼叫,因為它會阻塞執行緒直到drawable可用)或使用presentAfterMinimumDuration. 其中一些在此WWDC 視頻中進行了討論。
我認為 Core Animation 三重緩沖由 Window Server 組成的所有內容,因此基本上它會等待您完成繪制幀,然后將其與其他幀一起繪制,然后將其呈現給“玻璃”。
至于您關于延遲的問題:您是對的,CPU 比 GPU 領先兩個甚至三個“幀”。我對此不太熟悉,也沒有嘗試過,但是我認為如果您將可繪制物件的呈現延遲到最后一刻,可能會延遲到預定的時間,實際上可以“跳過”您提前繪制的幀您的命令緩沖區之一上的處理程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/451647.html
上一篇:在陣列與物件陣列中宣告道具
