背景:我们正在开发的游戏在更新到 iOS 10 或 11 的设备上性能急剧下降。两台运行 10.3.3 的 iPhone 6s 只能达到 20-30fps,而仍在运行 8.0 的 iPhone 5s 则轻松达到60 帧/秒。
最近,我将 iPod6 从 ios 9 更新到 ios 11,在运行完全相同的游戏版本时它也从 60 fps 下降到 20-30 fps。
注意:最初 GPU 分析器让我相信这是一个与着色器相关的问题,但这是一个错误的线索。感谢所有在此基础上发表评论的人。
以下是我缩小问题范围的方法:
正常运行时,我们的游戏每帧生成以下屏幕外纹理:
在 iPhone5s 上,所有这一切都以 60fps 的流畅速度进行。在 iPod6 和 iPhone6s 上,自从更新到 iOS10/11 后,很难达到 30fps。
作为测试,我将所有屏幕外渲染重定向到主帧缓冲区,禁用深度检查并在所有内容上启用 alpha 混合,以确保没有任何东西被瓦片渲染器优化掉。
结果是游戏被迫渲染超过之前十倍的像素数(因为填充 256x256 纹理的渲染现在全部填充 640x1136 屏幕),所有这些都启用了 alpha 混合(之前有很多它没有混合),而且它很高兴在 iPod6 上以 60fps 的速度执行此操作。
我知道我仍然可以对离屏渲染进行优化(我目前没有在阴影纹理上标记深度缓冲区以进行丢弃)但这不是重点:5s 正在处理未优化的渲染效果很好,iPod6 也曾经如此,那么在 iOS 10/11 下有什么变化?
重现步骤:
最佳答案
根据我的测试,某些 iOS OGLES 实现(特别是 10.3.3 和 11)似乎在优化屏幕交错渲染和屏幕外纹理方面做得非常糟糕。
理想情况下(1),从在基于图 block 的硬件上的帧期间渲染到多个目的地的角度来看,OpenGL 实现将尽可能长时间地推迟在主帧缓冲区上执行渲染命令,具有去交织此请求序列的效果:
进入这个视觉上等效的执行序列:
后者的顺序要高效得多,因为它避免了对主帧缓冲区内容的重复逻辑加载和存储(2)。
但是,从一个简单的基准测试可以明显看出,与过去相比,较新版本的 iOS 中的实现在执行此优化方面要差得多。
我的基准测试分配了十个 256x256 纹理和十个 512x512 纹理,并为每个纹理分配了一个帧缓冲区。每一帧它都会为每个纹理绘制许多大型 alpha 混合 Sprite ,然后将这些纹理渲染到屏幕上(也是 alpha 混合)。我将其设置为默认情况下以交错顺序执行,然后在触摸屏幕时取消交错。
以下是一系列测试设备的未触摸/触摸(差异)结果:
如您所见,所有设备都受益于手动更正渲染顺序。然而,在类似硬件上,不这样做的惩罚从 iOS8 下的 2.5 毫秒上升到 iOS11 下的惊人的 7.2 毫秒(在 iPod 上安装 iOS11 之前它运行我们的游戏很顺利,所以我觉得得出这个推论是合理的)。在 iPhone6s 上,惩罚甚至更高,这无疑是因为更大的屏幕分辨率。
似乎这种损失部分归因于逻辑加载和存储,部分归因于在将纹理渲染到屏幕之前完成渲染之间的依赖关系引入的停顿。同样:在延迟指向主帧缓冲区的命令的实现中,不会发生这些停顿。
拒绝的备选方案
逻辑加载和存储本身的成本大幅增加。
这可以解释观察到的减速,但不能解释当渲染顺序被手动去交错时 iPod 和 iPhone5s 之间性能的相似性。更正后的顺序仍然需要大量的逻辑存储 (10mb),并且没有明显的额外成本的证据。
引用资料:
关于ios - 与 iOS9 (OGLES2.0) 相比,iOS10/11 下的离屏渲染性能大幅下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789614/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro
我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/
我正在使用macos,我想使用ruby驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat