【问题标题】:Live AR data capture of ARFaceGeometry to a custom Metal pipeline将 ARFaceGeometry 的实时 AR 数据捕获到自定义 Metal 管道
【发布时间】:2018-11-30 00:58:29
【问题描述】:

我的金属管道正在工作。
我正在渲染实时面部几何,
从 iPhone X 上的原深感摄像头拍摄。

我每帧都从ARSessionDelegate 中抓取ARFaceGeometry
我将数据传递到我的框架到金属管道中。

渲染速度为 2.5fps...

这是渲染管道:PixelsRender.swift

数据:xyz 的 uv 和一个索引数组。 ARFaceGeometry 由 2304 个三角形组成。

我对渲染管道进行了计时:

[1.086ms] Command Buffer    
[0.006ms] Input Texture     
[0.054ms] Drawable          
[0.110ms] Command Encoder    
[0.123ms] Uniforms          
[0.006ms] Uniform Arrays    
[0.009ms] Fragment Texture  
[68.015ms] Vertices         
[0.002ms] Vertex Uniforms   
[0.000ms] Custom Vertex Texture
[0.027ms] Draw              
[0.036ms] Encode            
[80.207ms] All CPU
[346.936ms] GPU
[431.035ms] All CPU + GPU
[434.100ms] Total

是所有的顶点都需要这么长时间来渲染。
有没有办法在 GPU 上缓存内存空间?
我有很多需要优化的地方,我敢肯定,但我缺少任何明显的东西?

这是我朋友的脸:

更新(已解决)

我把实例误认为是三角形!

它在主绘图功能中。 (感谢 Ken Thomases 捕捉到这一点)

commandEncoder.drawPrimitives(type: vertices.type,
                              vertexStart: 0,
                              vertexCount: vertices.vertexCount,
                              instanceCount: 1 /* previously triangle count of 2304 */)

新的 GPU 时间:

[2.769ms] GPU

【问题讨论】:

  • vertecies.instanceCount 是不是除了 1 以外的任何东西?如果是这样,您真的是要进行实例渲染吗?似乎很多人误解了该参数,并有效地告诉 GPU 执行 n^2 他们认为的工作量。无论如何,2304 个三角形并不是一个很大的数字。 ARFaceGeometry 文档明确指出,至少在给定的程序运行中,这始终是相同的。
  • vertecies.instanceCount 当前确实设置为 2304 .. 所以我一直在渲染整个地理 2304 次? x)
  • 就是这样!现在快了 100 倍!!

标签: ios arkit metal


【解决方案1】:

您无意中使用了实例化绘图,为 instanceCount: 参数传递了一个大于 1 的值。这基本上成倍地增加了 GPU 必须完成的渲染工作量。因此,如果您实际上不需要/想要实例化绘图,请在此处传递 1。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2021-11-27
    • 2016-12-24
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多