我無法找到保留CAMetalLayer支持的方法,因爲nextDrawable每次都從池中提供不同的MTLTexture。即使我在渲染過程描述符上設置了適當的loadAction和storeAction,也不會發生備份。內容閃爍爲紋理由nextDrawable調用交換。如何保留CAMetalLayer的支持?
我想要在OpenGL ES中與kEAGLDrawablePropertyRetainedBacking類似的行爲。
有人想出了這一個?
我無法找到保留CAMetalLayer支持的方法,因爲nextDrawable每次都從池中提供不同的MTLTexture。即使我在渲染過程描述符上設置了適當的loadAction和storeAction,也不會發生備份。內容閃爍爲紋理由nextDrawable調用交換。如何保留CAMetalLayer的支持?
我想要在OpenGL ES中與kEAGLDrawablePropertyRetainedBacking類似的行爲。
有人想出了這一個?
nextDrawable將始終爲您提供未定義狀態的紋理,並且據我所知,沒有像kEAGLDrawablePropertyRetainedBacking這樣的簡單選項來更改該行爲。
但是,顯然可以通過將舊的drawable保留一段時間並手動執行從前一個紋理到下一個紋理的GPU副本來實現副本。 https://devforums.apple.com/message/1060027#1060027
你會的,但是,必須按照
由於'CAMetalLayer'池中只有3個可繪製對象,在呈現它之前將可繪製對象放在比你絕對需要的時間更長的地方可能會阻塞或者在下一次嘗試'nextDrawable'時失敗。可能會更好地從另一個方向對其進行攻擊,並渲染到屏幕外紋理,您可以隨時保留該紋理,然後檢索可繪製的BLIT(或更好地渲染)該紋理到可繪製紋理,然後呈現drawable。這樣可以在更短的時間內保留drawable,從而減少阻塞的風險。 –
是的,我同意使用渲染紋理可能是一個更好的選擇。當我需要爲項目的加載屏幕保留後臺緩衝區時,我使用了渲染到紋理的解決方案,因爲這種方法比用繪圖工具更方便。我也不喜歡framebufferOnly性能成本的聲音,我認爲你必須在整個項目中支付費用,而不僅僅是你想要支持的特定場景。 – Columbo
嗨@BillHollings離線紋理效果很好,謝謝你的建議。爲什麼你更喜歡渲染BLIT?我目前在一次渲染過程中渲染爲離屏紋理,然後使用BLIT編碼器將離屏紋理複製到圖層的可繪製紋理。用另一個渲染階段替換BLIT階段會更好嗎? –
你嘗試過的文檔(https://developer.apple.com/library/ios/documentation/Animation/Reference/CAMetalLayer_Ref/#//apple_ref/occ/instp/CAMetalLayer/framebufferOnly)繼承MTKView而不是CAMetalLayer.framebufferOnly設置爲NO,這涉及「在成本績效」? – Marius