我经历了https://www.raywenderlich.com/146414/metal-tutorial-swift-3-part-1-getting-started。对于每一帧
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0)
renderEncoder.setFragmentTexture(texture, at: 0)
完成了。但是顶点和纹理数据永远不会改变。只有统一矩阵会发生变化。我渲染的对象包含8*4*4*4*4
个三角形(是的,它是一个球体)。我只能得到4FPS。我对每帧设置vertexBuffer持怀疑态度。
在OpenGL教程http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/
中也是如此在OpenGL中,我可以从渲染循环中拉出顶点/纹理缓冲区绑定。但是在金属MTLRenderCommandEncoder
中需要CAMetalDrawable
,这是为每一帧提取的。
答案 0 :(得分:2)
您通常会为每个帧使用新的渲染命令编码器。使用上一个渲染命令编码器执行的任何操作(如设置顶点缓冲区或片段纹理)在该编码器结束时都会“丢失”并删除对它的任何引用。所以,是的,你需要再次设置缓冲区和纹理。
然而,这不应该是昂贵的。这两种方法都只是将引用放入缓冲区或纹理中。它很便宜。如果尚未在CPU上修改其内容,则不必复制任何数据。它也不应该导致任何状态编译。 (Apple已经说过Metal的设计目标是避免任何隐式状态编译。它都是显式的,例如从渲染管道描述符创建渲染管道状态对象时。)
您需要对应用进行分析,以确定限制帧速率的因素,而不是猜测。