我一直在尝试使用多重采样在iOS 4上的iPhone和iPad上进行全景抗锯齿。一般机制使用Apple的APPLE_framebuffer_multisample扩展(http://www.khronos.org/registry/gles/extensions/APPLE/APPLE_framebuffer_multisample.txt)并在此答案中有所描述问题:How do you activate multisampling in OpenGL ES on the iPhone?并由Apple在其OpenGL ES编程指南中记录。
它按照描述工作,但是当我将样本数量设置为2时,我的测试应用程序的绘图性能会受到约50%的影响。我主要在iPhone 4上测试,使用非视网膜启用的应用程序。我正在使用Apple在其文档中提供的其他性能建议(使用glDiscardFramebufferEXT丢弃附加到多重采样帧缓冲区的渲染缓冲区,使用glClear清除帧开始处的整个帧缓冲区等)。
以这种方式启用多重采样的性能开销对我来说似乎非常大。你们是否看到类似的结果,或者这表明我做错了什么?
答案 0 :(得分:2)
您提到您在iPhone 4上运行此功能。您的OpenGL ES图层是否以完整的2X Retina显示比例因子呈现?也就是说,您是否已将OpenGL ES托管层的contentScaleFactor
设置为[[UIScreen mainScreen] scale]
?如果是这样,那么你要推动大量像素开始。
在应用多重采样抗锯齿之前,您的填充率是否受限?要检查,请使用Instruments中的OpenGL ES仪器来运行正在运行的应用程序,并启用Tiler Utilization和Renderer Utilization统计信息。如果您的应用程序在未启用MSAA的情况下显示较高的渲染器利用率,则您的填充率将受限制。由于这个瓶颈,在此基础上添加MSAA可能会显着降低帧率。
在我所拥有的几何有限的应用程序中,没有填充率受限,我在iPhone 4上使用4X MSAA时没有看到那么大的减速。我猜你的应用程序存在瓶颈将像素推向屏幕。
答案 1 :(得分:1)
当您将样本数设置为2时,您的性能会受到约50%的影响并不奇怪:您抽取了两倍的样本!多重采样意味着您实际上以比屏幕更高的分辨率将场景绘制到屏幕外缓冲区,然后使用过滤算法将更高分辨率的多采样缓冲区降低到显示屏分辨率,希望使用更少的混叠伪像,因为最终图片实际上包含比单采样版本更多的细节(过滤的更高分辨率输出)。
这是图形中非常常见的(如果不是最常见的)性能问题:绘制的样本越多,就越慢。