背景:我们的开发中游戏在我们更新至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