Bildschirmrisse und Kameraaufnahmen mit Metal

9

Um nicht gleichzeitig in einen konstanten Puffer von GPU und CPU zu schreiben, empfiehlt Apple ein Triple-gepuffertes System mit Hilfe eines Semaphors, um zu verhindern, dass die CPU zu weit vor die GPU kommt (das ist in Ordnung) und in dieser Phase in mindestens drei Metal-Videos enthalten).

Wenn jedoch die konstante Ressource eine MTLTexture ist und der AVCaptureVideoDataOutput-Delegat separat von der Rendering-Schleife (CADisplaylink) ausgeführt wird, wie kann ein ähnliches dreifach gepuffertes System (wie in Apples Beispielcode MetalVideoCapture verwendet) die Synchronisierung garantieren? Screen Tearing (Textur Tearing) kann beobachtet werden, wenn Sie den MetalVideoCapture-Code nehmen und einfach ein Vollbild-Quadrupel rendern und das Preset auf AVCaptureSessionPresetHigh (in dem Moment, in dem der Tearing durch das rotierende Quad und Low-Quality-Preset verdeckt wird).

Ich stelle fest, dass die Rendering-Schleife und die captureOutput-Delegate-Methode (in diesem Fall) beide im Hauptthread sind und dass der Semaphor (in der Rendering-Schleife) die Ganzzahl _constantDataBufferIndex in Schach hält (welche Indizes in die MTLTexture zur Erstellung und Encoding), aber screen tearing kann immer noch beobachtet werden, was für mich rätselhaft ist (es wäre sinnvoll, wenn das GPU - Schreiben der Textur nicht der nächste Frame nach der Enkodierung ist, sondern 2 oder 3 Frames später, aber ich glaube das nicht der Fall sein). Nur ein kleiner Punkt: sollten die Rendering-Schleife und der captureOutput nicht die gleiche Bildrate für ein gepuffertes Textur-System haben, so werden alte Frames nicht mit den jüngsten interleaved gerendert.

Irgendwelche Gedanken oder Erläuterungen zu diesem Thema würden sehr geschätzt werden; Es gibt ein anderes Beispiel von McZonk, das nicht das dreifach gepufferte System verwendet, aber ich habe auch mit diesem Ansatz Risse beobachtet (aber weniger). Offensichtlich wird kein Tearing beobachtet, wenn ich waitUntilCompleted verwende (äquivalent zu Open GL's glfinish), aber das ist wie ein Akkordeon mit einem hinter dem Rücken gefesselten Arm zu spielen!

    
Gary 10.08.2016, 17:03
quelle

0 Antworten