Multithreading 使用金属缓冲器碰撞
我使用背景线程创建金属缓冲区:Multithreading 使用金属缓冲器碰撞,multithreading,macos,metal,Multithreading,Macos,Metal,我使用背景线程创建金属缓冲区: var vertices:UnsafeMutablePointer<Float>?=nil var indexes:UnsafeMutablePointer<UInt32>?=nil var vertexCount: UInt32=UInt32() var indexCount: UInt32=UInt32() triangulatePoints(hull, &vertices, &indexes, &vertex
var vertices:UnsafeMutablePointer<Float>?=nil
var indexes:UnsafeMutablePointer<UInt32>?=nil
var vertexCount: UInt32=UInt32()
var indexCount: UInt32=UInt32()
triangulatePoints(hull, &vertices, &indexes, &vertexCount, &indexCount)
defer {
free(vertices)
free(indexes)
}
if let vertexBuffer=device.makeBuffer(bytes: vertices!,
length: Int(vertexCount)*MemoryLayout<Float>.size*3,
options: .storageModeShared),
let indexBuffer=device.makeBuffer(bytes: indexes!,
length: Int(indexCount)*MemoryLayout<UInt32>.size,
options: .storageModeShared)
{
metalObject=MetalObject(vertices: vertexBuffer, indices: indexBuffer)
}
MetalObject
s是简单的容器,也存储在其他容器中:
class MetalObject: NSObject {
var vertexBuffer: MTLBuffer
var indexBuffer: MTLBuffer
init(vertices: MTLBuffer, indices:MTLBuffer) {
vertexBuffer=vertices
indexBuffer=indices
}
}
class MetalImageLayer: NSObject {
var layers=[MetalPolarityLayer]()
}
class MetalPolarityLayer: NSObject {
var elements=[MetalObject]() //For general objects that need to be drawn piece by piece
var regions=[MetalObject]() //For region objects that can be instanced
}
在调试模式下,我经常在使用EXC\u BAD\u访问(code=1,address=0x40dedededbec8)的行metalObject=metalObject(顶点:vertexBuffer,索引:indexBuffer)
上发生崩溃。堆栈跟踪如下所示:
#0 0x000000010166a6e2 in swift_unknownRetain ()
#1 0x000000010005bf5f in StrokeLine.constructMetalBuffers(withPrecision:device:) at Image+Metal.swift:445
#2 0x000000010005c8b2 in @objc StrokeLine.constructMetalBuffers(withPrecision:device:) ()
#3 0x0000000100050b4d in Image.constructMetalBuffers(withPrecision:device:) at Image+Metal.swift:40
#4 0x0000000100051082 in @objc Image.constructMetalBuffers(withPrecision:device:) ()
#5 0x0000000100067eef in closure #1 in WindowLayer.observeValue(forKeyPath:of:change:context:) at WindowLayer.swift:181
从调试器检查vertexBuffer
,然后给出:po vertexBuffer
错误:执行被中断,原因:EXC\u错误\u访问(代码=1,地址=0x2e7466697770)。
另一方面,在发布模式下,我有时会遇到崩溃
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Application Specific Information:
abort() called
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff60084fce __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff601c2150 pthread_kill + 333
2 libsystem_c.dylib 0x00007fff5ffe132a abort + 127
3 com.apple.IOAccelerator 0x00007fff5279a1ea ioAccelResourceListAddNewGroupAndResource + 221
4 com.apple.IOAccelerator 0x00007fff52799d19 IOAccelResourceListAddResource + 304
5 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa02ef IGBufferMemory<31ul>::listId(unsigned int) + 85
6 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa654b ShaderBindingStage::updateUAVTable(unsigned int, unsigned int, bool) + 459
7 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9fe0d ShaderBindingStage::updateBindingTableData() + 1631
8 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9f70b ShaderBindingStage::writeTableIf() + 55
9 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9cc11 IGAccelRenderCommandEncoder::programPipeline(sPrimitiveData const&) + 4685
10 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b7b4 IGAccelRenderCommandEncoder::drawIndexedPrimitives(MTLPrimitiveType, unsigned int, MTLIndexType, MTLIGAccelBuffer*, unsigned int, unsigned int, unsigned int, unsigned int) + 710
11 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b40c -[MTLIGAccelRenderCommandEncoder drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:] + 324
崩溃线程:0调度队列:com.apple.main-Thread
异常类型:EXC_崩溃(SIGABRT)
异常代码:0x0000000000,0x0000000000000000
例外说明:EXC_尸体通知
特定于应用程序的信息:
调用了abort()
线程0崩溃::调度队列:com.apple.main-Thread
0 libsystem_kernel.dylib 0x00007fff60084fce_uuupthread_kill+10
1 libsystem_pthread.dylib 0x00007fff601c2150 pthread_kill+333
2 libsystem_c.dylib 0x00007fff5ffe132a中止+127
3 com.apple.IOAccelerator 0x00007fff5279a1ea IOAccelerResourceListAddNewGroupandResource+221
4 com.apple.IOAccelerator 0x00007fff52799d19 IOAccelerResourceListAddResource+304
5 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa02ef IGBufferMemory::listId(无符号整数)+85
6 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa654b ShaderBindingStage::updateUAVTable(unsigned int,unsigned int,bool)+459
7 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9fe0d ShaderBindingStage::updateBindingTableData()+1631
8 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9f70b着色器绑定阶段::writeTableIf()+55
9 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9cc11 IGAccelRenderCommandEncoder::programPipeline(sPrimitiveData const&)+4685
10 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b7b4 IGAccelRenderCommandEncoder::drawIndexedPrimitives(MTLPrimitiveType、unsigned int、MTLIndexType、MTLIGAccelBuffer*、unsigned int、unsigned int、unsigned int、unsigned int)+710
11 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b40c-[MTLIGAccelRenderCommandEncoder drawindexedprimitions:indexCount:indexType:indexBuffer:indexBufferOffset:+324
没有记录可能导致崩溃的更多信息
使用仪器来寻找僵尸没有结果
我应该如何找出这里出了什么问题?MetalObject的代码是什么?调试版本崩溃的堆栈跟踪是什么?它出现在代码的哪一行?什么是顶点
和索引
?如何将MetalObject
s发送到主线程?您好,感谢您调查我的问题。我添加了很多信息。我希望这就是你需要的。那么,Image+Metal的代码是什么呢。swift:445,这显然是引起坠机的那一行。另外,我假设triangulatePoints()
正在为顶点和索引分配空间,对吗?代码是metalObject=metalObject(顶点:vertexBuffer,索引:indexBuffer)
,因此它是我复制的第一段代码的最后一行。三角化函数使用malloc,例如:*顶点=(float*)malloc(例如节点数()*sizeof(float)*3)代码>
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Application Specific Information:
abort() called
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff60084fce __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff601c2150 pthread_kill + 333
2 libsystem_c.dylib 0x00007fff5ffe132a abort + 127
3 com.apple.IOAccelerator 0x00007fff5279a1ea ioAccelResourceListAddNewGroupAndResource + 221
4 com.apple.IOAccelerator 0x00007fff52799d19 IOAccelResourceListAddResource + 304
5 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa02ef IGBufferMemory<31ul>::listId(unsigned int) + 85
6 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32aa654b ShaderBindingStage::updateUAVTable(unsigned int, unsigned int, bool) + 459
7 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9fe0d ShaderBindingStage::updateBindingTableData() + 1631
8 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9f70b ShaderBindingStage::writeTableIf() + 55
9 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9cc11 IGAccelRenderCommandEncoder::programPipeline(sPrimitiveData const&) + 4685
10 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b7b4 IGAccelRenderCommandEncoder::drawIndexedPrimitives(MTLPrimitiveType, unsigned int, MTLIndexType, MTLIGAccelBuffer*, unsigned int, unsigned int, unsigned int, unsigned int) + 710
11 com.apple.driver.AppleIntelKBLGraphicsMTLDriver 0x00007fff32a9b40c -[MTLIGAccelRenderCommandEncoder drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:] + 324