Swift 金属着色语言中平移手势纹理的再现

Swift 金属着色语言中平移手势纹理的再现,swift,textures,metal,metalkit,Swift,Textures,Metal,Metalkit,我不熟悉金属着色语言。所以您的指导会非常有帮助。 我只是重复使用金属纹理,如下图所示 但它似乎不平滑。我如何使它看起来像下面的金属点链接中所做的平滑线。() 目前,我所做的是为手势中每个接触点的顶点缓冲区(MTLBuffer)分配内存 代码: func allocateMemoryForVetexBuffer(顶点:数组){ var vertexData=Array() 对于顶点中的顶点{ vertexData+=vertex.floatBuffer() } 让dataSize=vertexDa

我不熟悉金属着色语言。所以您的指导会非常有帮助。 我只是重复使用金属纹理,如下图所示 但它似乎不平滑。我如何使它看起来像下面的金属点链接中所做的平滑线。()

目前,我所做的是为手势中每个接触点的顶点缓冲区(MTLBuffer)分配内存

代码:

func allocateMemoryForVetexBuffer(顶点:数组){
var vertexData=Array()
对于顶点中的顶点{
vertexData+=vertex.floatBuffer()
}
让dataSize=vertexData.count*MemoryLayout.size(of值:vertexData[0])
打印(“数据大小:\(数据大小)”)
vertexBuffer=device.makeBuffer(字节:vertexData,长度:dataSize,选项:[]))
vertexCount=顶点数
}

我在平移手势识别器中调用此方法。但它会导致FPS下降。因此,我的问题是,在不知道单个平移金属层上会添加多少纹理的情况下,如何为帧缓冲区分配内存。

您不必要地使用了实例

更改此项:

renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexCount, 
                             instanceCount: vertexCount / 3)
为此:

renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexCount)

您可能无法在每次收到触摸事件时都从CPU端更新缓冲区,但您可以分配一个足够大的缓冲区,以容纳(比如)64个四边形,然后在填满时将其长度加倍,仅绘制实际填充的缓冲区部分。这很有帮助。我只是分配内存并将新到达的数据复制到缓冲区中。但是当添加更多纹理时,FPS会下降。减少FPS的原因可能是什么?量化:您绘制了多少个点/四边形,以及您实现了多少FPS?FPS:60&一个纹理(图像)包含6个顶点。当触摸移动时,它会在每个触摸点绘制纹理。这意味着在我的绘图中可以有数千个点。我已经添加了工作项目供您参考。谢谢你。它起作用了。但在某一点上,它显示了一个错误。“由于执行过程中出现错误,命令缓冲区的执行被中止。已忽略(导致以前/过多的GPU错误)(IOAF代码4)”。那么可能的原因是什么呢?我也看到了。我认为,一旦通过了一定数量的顶点,GPU的读取就会超出缓冲区的范围。但我没有彻底调查这件事。
renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexCount)