diff --git a/Runtime/Tx/CompressedImageTx.cs b/Runtime/Tx/CompressedImageTx.cs index 9769285..d1767bd 100644 --- a/Runtime/Tx/CompressedImageTx.cs +++ b/Runtime/Tx/CompressedImageTx.cs @@ -81,6 +81,9 @@ public void Dispose() private bool __active = false; + private bool inRequest; + private bool disposing; + protected override void AfterEnable() { if (renderCamera == null) @@ -112,6 +115,7 @@ protected override void AfterEnable() __pb.Init(textureWidth, textureHeight); __active = true; + disposing = false; __readyRawTextureData.Reset(); jpegCompressionThread = new Thread(JpegCompressor); jpegCompressionThread.Start(); @@ -122,10 +126,20 @@ protected override void AfterEnable() protected override void AfterDisable() { - __active = false; + if(inRequest) + { + disposing = true; + return; + } - CancelInvoke(nameof(RenderLoop)); - CancelInvoke(nameof(CalcFPS)); + __active = false; + + // This might be called after the component got destroyed; prevents getting a null ref exception. + if (this != null) + { + CancelInvoke(nameof(RenderLoop)); + CancelInvoke(nameof(CalcFPS)); + } if (jpegCompressionThread != null) { @@ -163,6 +177,9 @@ void RenderLoop() __pb.useRender = false; __pb.timeRender = ProBridgeServer.SimTime; + if (inRequest) return; + inRequest = true; + switch (format) { case Format.jpeg: @@ -178,6 +195,13 @@ void RenderLoop() private void OnCompleteReadback(AsyncGPUReadbackRequest request) { + inRequest = false; + if (disposing) + { + AfterDisable(); + return; + } + __pb.useRender = true; if (request.hasError || !__active || !__pb.useCompressor) return; diff --git a/Runtime/Tx/DepthCameraTx.cs b/Runtime/Tx/DepthCameraTx.cs index eda2de0..c36fb4a 100644 --- a/Runtime/Tx/DepthCameraTx.cs +++ b/Runtime/Tx/DepthCameraTx.cs @@ -43,6 +43,11 @@ protected override void AfterEnable() _cameraSensor.Init(); } + protected override void AfterDisable() + { + _cameraSensor.DisposeSensor(); + } + private void OnSensorUpdated() { sensorReady = true; diff --git a/Runtime/Utils/UnitySensors/Scripts/Sensors/Camera/DepthCamera/DepthCameraSensor.cs b/Runtime/Utils/UnitySensors/Scripts/Sensors/Camera/DepthCamera/DepthCameraSensor.cs index db6c977..99fb2c8 100644 --- a/Runtime/Utils/UnitySensors/Scripts/Sensors/Camera/DepthCamera/DepthCameraSensor.cs +++ b/Runtime/Utils/UnitySensors/Scripts/Sensors/Camera/DepthCamera/DepthCameraSensor.cs @@ -168,16 +168,25 @@ private bool LoadTexture() protected override void OnSensorDestroy() { - _jobHandle.Complete(); - _pointCloud.Dispose(); - _noises.Dispose(); - _directions.Dispose(); - _rt.Release(); + // _jobHandle.Complete(); + // _pointCloud.Dispose(); + // _noises.Dispose(); + // _directions.Dispose(); + // _rt.Release(); } private void OnRenderImage(RenderTexture source, RenderTexture dest) { Graphics.Blit(source, dest, mat); } + + public void DisposeSensor() + { + _jobHandle.Complete(); + _pointCloud.Dispose(); + _noises.Dispose(); + _directions.Dispose(); + _rt.Release(); + } } }