背景:我們的開發中遊戲在我們更新至iOS 10或11的設備上進行了性能潛水。兩款iPhone 6s的運行時間爲10.3 .3只能達到20-30fps,而iPhone 5s仍然以每秒60fps的速度順利通過8.0。與iOS9(OGLES2.0)相比,iOS10/11下的海量屏幕外渲染性能下降
最近我更新了iPod6從ios 9到ios 11,它也從60下降到20-30 fps,運行完全相同的遊戲構建。
注意:最初GPU分析器讓我相信這是一個着色器相關問題,但那是一個錯誤的線索。感謝所有在此基礎上評論的人。
下面是我已經收窄的問題了下來:
運行正常,我們的遊戲生成以下屏幕外的紋理每一幀:
- 十選手的陰影,在256×256(無alpha混合參與)
- 十128×256 256×256到動畫「電視屏幕」紋理
- 一個256×512個「全球思考」的質感結合場景模型的一小部分。
在iPhone5s上,所有這些都以平穩的60fps進行。在iPod6和iPhone6s上,由於更新到iOS10/11,它努力達到30fps。
作爲測試,我將所有離屏渲染重定向到主幀緩衝區,禁用了深度檢查並啓用了對所有內容的Alpha混合,以確保任何內容都不會被tile渲染器優化。
結果是,遊戲被迫渲染的像素數量是以前的十倍(因爲填充256x256紋理的渲染現在全部填充640x1136屏幕),所有的alpha混合(在很多之前它沒有混合),它在iPod6上以60fps的速度高興地做到了這一點。
我知道我仍然可以對離屏渲染進行優化(我目前沒有標記用於丟棄的陰影紋理上的深度緩衝區),但這不是真正的重點:5s是處理未經優化的渲染效果還不錯,而iPod6也曾經使用過,所以在iOS 10/11下改變了什麼?
重現步驟:
- 生成20小(256×256)的紋理和爲它們分配幀緩存。
- 每一幀,爲每個紋理渲染幾個精靈,然後將紋理渲染到屏幕上。
- OpenGL剖析這個設置。
- 將所有精靈渲染重定向到屏幕(但保留'渲染紋理到屏幕'步驟)
- 剖析此設置。在我的測試中,儘管精靈渲染必須覆蓋更多像素,但第二個設置的速度要快10ms。
你在談論的OpenGL-ES,對不對?您定位的是哪個版本? – BDL
OGLES2.0 - 現在添加到主帖。 – Peeling
幾件事情要嘗試:1.用兩個獨立的vec2替換vec4 texcoord,可以避免依賴於紋理的讀取(儘管它們在新硬件上並不那麼糟糕)。 2.使用臨時vec4而不是多次寫入/修改gl_FragColor。 – Columbo