gpt4 book ai didi

ios - 用 Metal 渲染四边形性能

转载 作者:搜寻专家 更新时间:2023-10-31 23:04:23 24 4
gpt4 key购买 nike

我正在尝试使用 Metal API 在 Apple A7 GPU 上尽可能快地渲染大量非常小的 2D 四边形。研究该 GPU 的三角吞吐量数字,例如here ,并且从 Apple 在他们的主题演示期间引用屏幕上超过 100 万个三角形,我希望能够以 60fps 的速度每帧渲染大约 500,000 个这样的四边形。也许少一点,因为它们都是可见的(在屏幕上,没有被 z 缓冲区隐藏)并且很小(对于光栅化器来说很棘手),所以这可能不是 GPU super 优化的用例。也许 Apple 演示以 30fps 的速度运行,所以假设 ~200,000 应该是可行的。当然是 100,000 ……对吧?

但是,在我的测试应用程序中,最大值仅为 20,000 左右——不止于此,而且在 iPad Air 上帧率降至 60 以下。它有 100,000 个四边形,以 14 fps 的速度运行,即吞吐量为 2.8M trianlges/sec(与 AnandTech 文章中引用的 68.1M 屏幕 三角形相比!)。

即使我将四边形缩小为单个像素,使用普通的片段着色器,性能也不会提高。所以我们可以假设这是顶点绑定(bind),并且 Xcode 中的 GPU 报告同意(“Tiler”为 100%)。顶点着色器也很简单,只做一点缩放和平移数学,所以我假设瓶颈是某个固定功能阶段......?

只是为了了解更多背景信息,我使用单个实例化绘制调用渲染所有几何体,每个实例一个四边形,即每个实例 4 个顶点。四边形的位置是从一个单独的缓冲区应用的,该缓冲区由顶点着色器中的实例 ID 索引。我也尝试了一些其他方法(非实例化,所有顶点都预先转换,实例化+索引等),但这没有帮助。没有复杂的顶点属性、缓冲区/表面格式或我能想到的任何其他似乎可能会在驱动程序/GPU 中运行缓慢的路径(尽管我当然不能确定)。混合关闭。几乎所有其他内容都处于默认状态(例如视口(viewport)、剪刀、ztest、剔除等)。

该应用程序是用 Swift 编写的,但希望这无关紧要;)

我想了解的是,在渲染这样的四边形(与“正确的”3d 场景相对)时,我所看到的性能是否符合预期,或者是否需要一些更高级的技术才能接近广告三角吞吐量。人们认为这里的限制瓶颈可能是什么?

此外,如果有人知道为什么这在 OpenGL 中可能比在 Metal 中更快(我没有尝试过,也想不出任何原因),那么我也很想听听。

谢谢

编辑:添加着色器代码。

vertex float4 vertex_shader(
const constant float2* vertex_array [[ buffer(0) ]],
const device QuadState* quads [[ buffer(1) ]],
constant const Parms& parms [[ buffer(2) ]],
unsigned int vid [[ vertex_id ]],
unsigned int iid [[ instance_id ]] )
{
float2 v = vertex_array[vid]*0.5f;

v += quads[iid].position;

// ortho cam and projection transform
v += parms.cam.position;
v *= parms.cam.zoom * parms.proj.scaling;

return float4(v, 0, 1.0);
}


fragment half4 fragment_shader()
{
return half4(0.773,0.439,0.278,0.4);
}

最佳答案

如果没有看到您的 Swift/Objective-C 代码,我无法确定,但我的猜测是您花费了太多时间来调用您的实例化代码。当您的模型中有数百个三角形而不是两个时,实例化很有用。

尝试创建一个包含 1000 个四边形的顶点缓冲区,看看性能是否有所提高。

关于ios - 用 Metal 渲染四边形性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27967170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com