void ReleaseSenderObjects() { // Total synchronization: This may cause a frame hiccup, but it's // needed to dispose the readback buffers safely. AsyncGPUReadback.WaitAllRequests(); // Game view capture method: Leave the sender instance without // disposing (we're not the owner) but synchronize it. It's needed to // dispose the readback buffers safely too. if (SharedInstance.IsGameViewSend(_send)) { _send.SendVideoAsync(); // Sync by null-send _send = null; } // Private objet disposal _send?.Dispose(); _send = null; _pool?.Dispose(); _pool = null; _converter?.Dispose(); _converter = null; // We don't dispose _onReadback because it's reusable. }
void PrepareSenderObjects() { // Game view capture method: Borrow the shared sender instance. if (_send == null && captureMethod == CaptureMethod.GameView) { _send = SharedInstance.GameViewSend; } // Private object initialization if (_send == null) { _send = Interop.Send.Create(ndiName); } if (_pool == null) { _pool = new ReadbackPool(); } if (_converter == null) { _converter = new FormatConverter(_resources); } if (_onReadback == null) { _onReadback = OnReadback; } }