Metal を使用して OS X Sierra でアプリを作成しています。私がやっていることは、画面がひどくグリッチし始め、さまざまな場所で黒く点滅し、すぐに画面全体が黒くなります。
XCode で GPU フレーム キャプチャを使用すると、一時停止したフレームは正しく表示されますが、黒い深淵から突然戻ってきます。GPU フレーム情報にエラーや警告が表示されません。ただし、私は Metal に比較的慣れておらず、フレーム デバッガーの経験もありません。
通常、コンソールには何も表示されませんが、ときどき次のいずれかが表示されます。
実行中にエラーが発生したため、コマンド バッファの実行が中止されました。内部エラー (IOAF コード 1)
同じアプリを iOS デバイスで実行しても、この問題は発生しません。これまでのところ、問題は OS X でのみ発生します。何を確認する必要があるかについての提案はありますか?
役立つコードがあれば投稿できますが、現時点では、プログラムのどの部分に問題があるかはわかりません。
編集: Noah Witherspoon への対応 - 問題は、私のシーン描画と UI 描画の間の何らかの相互作用によって引き起こされているようです。太くてぼやけた線で構成されている自分のシーンだけを表示すると、問題は発生しません。また、正投影である UI のみを表示し、角の丸い四角形と何らかのタイプを表示しても発生しません。この問題は、両方が表示されている場合にのみ発生します。これは大量のコード、多数のバッファー、および大量の commandBuffer の使用法であり、投稿するには多すぎます。しかし、ここで少しです。
私の行は、頂点ごとに 4 つの float の配列である頂点バッファーでレンダリングされます。
let dataSize = count * 4 * MemoryLayout<Float>.size
vertexBuffer = device.makeBuffer(bytes: points, length: dataSize, options: MTLResourceOptions())!
これらは次のようにレンダリングされます。
renderEncoder.setVertexBuffer(self.vertexBuffer, offset: 0, index: 0)
renderEncoder.setRenderPipelineState(strokeNode.strokePipelineState)
renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: Int(widthCountEdge.count)*2-4)
renderEncoder.setRenderPipelineState(strokeNode.capPipelineState)
renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 12)
コマンド Buffer を使用して描画するためのメイン ループを次に示します。
if let commandBuffer = commandQueue.makeCommandBuffer() {
commandBuffer.addCompletedHandler { (commandBuffer) -> Void in
self.strokeNode.bufferProvider.availableResourcesSemaphore.signal()
}
self.updateDynamicBufferState()
self.updateGameState(timeInterval)
let renderPassDescriptor = view.currentRenderPassDescriptor
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
renderPassDescriptor?.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
renderPassDescriptor?.colorAttachments[0].storeAction = .store
if let renderPassDescriptor = renderPassDescriptor, let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) {
strokeNode.subrender(renderEncoder, parentModelViewMatrix: viewMatrix, projectionMatrix: projectionMatrix, renderer:self)
mainscreen.draw(renderEncoder);
renderEncoder.endEncoding()
if let drawable = view.currentDrawable {
commandBuffer.present(drawable)
}
}
commandBuffer.commit()
}
線の描画は strokeNode.subrender で行われ、UI の描画は mainscreen.draw で行われます。UI の描画には多くのコンポーネントがあります (ここにリストする必要はありません) が、それらを 1 つずつ取り出して、絞り込めるかどうかを確認します。これで問題がないように見える場合は、その一部を編集して投稿します...
ありがとう!