我有一个复杂的Metal渲染器,它使用了许多MTLCommandBuffer
个对象,所以我开始使用newCommandQueueWithMaxCommandBufferCount
来允许我的MTLCommandQueue
支持超过默认的64个活动命令缓冲区,但据我所知,它不起作用。 无论我传递给MaxCommandBufferCount
的值是什么,我只能创建多达64个并发命令缓冲区。
这是我打电话来创建命令队列:
commandQueue = [_device newCommandQueueWithMaxCommandBufferCount: 128];
这是我用来测试它的代码:
- (id <MTLCommandBuffer>) makeCommandBuffer
{
id <MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];
commandBufferCounter ++;
NSLog(@"command buffer created. Total count = %d", commandBufferCounter);
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull buffer) {
commandBufferCounter--;
NSLog(@"command buffer completed. Total count = %d", commandBufferCounter);
}];
return commandBuffer;
}
这个函数是我程序中命令缓冲区的唯一创建者,所以我总能看到我有多少个活动的,未完成的缓冲区的精确计数。一旦我达到64,对[commandQueue commandBuffer]
的呼叫就会挂起,这导致我怀疑newCommandQueueWithMaxCommandBufferCount
中的错误。
我已经在iOS 9和10上证实了这种行为,所以我倾向于怀疑这样一个明显的错误会持续这么久。