Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 正确的缓冲区大小_Swift_Metal - Fatal编程技术网

Swift 正确的缓冲区大小

Swift 正确的缓冲区大小,swift,metal,Swift,Metal,我正在尝试使用Metal 2设置一个实例化渲染系统。一切正常,但似乎仍有问题。我正在渲染约1000个实例,每个实例都需要一些数据,这些数据存储在统一的数据库中。制服在CPU方面看起来是这样的: struct InstanceUniform { var position: float2 var layer: Int } 我需要每个实例一个。为实例创建缓冲区时,我会执行以下操作: buffer = device.makeBuffer(length: MemoryLayout<

我正在尝试使用Metal 2设置一个实例化渲染系统。一切正常,但似乎仍有问题。我正在渲染约1000个实例,每个实例都需要一些数据,这些数据存储在统一的数据库中。制服在CPU方面看起来是这样的:

struct InstanceUniform {
    var position: float2
    var layer: Int
}
我需要每个实例一个。为实例创建缓冲区时,我会执行以下操作:

buffer = device.makeBuffer(length: MemoryLayout<InstanceUniform>.stride * instanceCount, options: [])
buffer=device.makeBuffer(长度:MemoryLayout.stride*instanceCount,选项:[])
它似乎应该为我的实例分配足够的内存。然而,从一次抽签到下一次抽签,数据总是“溢出”。我有两个绘制调用:第一个用于渲染实例,第二个是普通调用,没有实例。我第一次抽签有两个缓冲区,第二次抽签只有一个缓冲区。但是,当我调试Metal时,第二个draw调用显示它有一个与第一个调用的第二个缓冲区大小相同的第二个缓冲区附件,并且它填充了随机内存值

另外,我应该提到,将为实例统一缓冲区指定的长度修改为原始值除以4不会导致任何问题,因此我猜这个问题与缓冲区的大小有关

任何帮助都将不胜感激

我第一次抽签有两个缓冲区,第二次抽签只有一个缓冲区

缓冲区不是特定于绘图调用的。它们在渲染命令编码器中设置。如果将缓冲区设置到render command encoder的表中,则在清除缓冲区或使用其他缓冲区替换缓冲区之前,缓冲区将一直保留在那里。即使在第二次绘制调用中处于活动状态的着色器不使用它们,它们仍将被分配给任何后续绘制调用。(当然,如果完成一个编码器并创建一个新编码器,那么新编码器将以空缓冲区表开始。)


至于缓冲区的大小,结构的
属性的类型是
Int
,它是64位整数类型。Metal不处理64位整数类型。因此,应用程序代码中的缓冲区布局和着色器之间不可避免地存在不匹配。您应该使用Swift侧的
Int32
来对应金属中的
int

哇,非常感谢!我想把这个作为答案,但我还有一个简短的问题。这对性能有影响吗?我可以想象有许多具有巨大缓冲区的抽签调用是一个问题。另外,感谢您提供有关Swift中Int和Metal之间不匹配的提示!我认为这不会对性能产生太大影响。不会为每个绘图复制缓冲区。第一次需要它们时(如有必要)会复制它们。在那之后,他们已经在GPU上了。