public void ReadClose() { ReadHandle?.Dispose(); }
internal GenericReadOperation(ReadHandle handle, NativeArray <byte> buffer) { m_Err = ReadError.InProgress; m_Handle = handle; m_Buffer = buffer; }
private void UpdateAsync() { //@TODO: Try to overlap Resources load and entities scene load // Begin Async resource load if (_LoadingStatus == LoadingStatus.NotStarted) { if (_SceneSize == 0) { return; } try { _StartTime = Time.realtimeSinceStartup; _FileContent = (byte *)UnsafeUtility.Malloc(_SceneSize, 16, Allocator.Persistent); ReadCommand cmd; cmd.Buffer = _FileContent; cmd.Offset = 0; cmd.Size = _SceneSize; _ReadHandle = AsyncReadManager.Read(_ScenePath, &cmd, 1); if (_ExpectedObjectReferenceCount != 0) { #if UNITY_EDITOR var resourceRequests = UnityEditorInternal.InternalEditorUtility.LoadSerializedFileAndForget(_ResourcesPathObjRefs); _ResourceObjRefs = (ReferencedUnityObjects)resourceRequests[0]; _LoadingStatus = LoadingStatus.WaitingForResourcesLoad; #else _SceneBundleHandle = SceneBundleHandle.CreateOrRetainBundle(_ResourcesPathObjRefs); _LoadingStatus = LoadingStatus.WaitingForAssetBundleLoad; #endif } else { _LoadingStatus = LoadingStatus.WaitingForEntitiesLoad; } } catch (Exception e) { _LoadingFailure = e.Message; _LoadingStatus = LoadingStatus.Completed; } } // Once async asset bundle load is done, we can read the asset if (_LoadingStatus == LoadingStatus.WaitingForAssetBundleLoad) { if (!_SceneBundleHandle.IsReady()) { return; } if (!_SceneBundleHandle.AssetBundle) { _LoadingFailure = $"Failed to load Asset Bundle '{_ResourcesPathObjRefs}'"; _LoadingStatus = LoadingStatus.Completed; return; } var fileName = Path.GetFileName(_ResourcesPathObjRefs); _AssetRequest = _SceneBundleHandle.AssetBundle.LoadAssetAsync(fileName); _LoadingStatus = LoadingStatus.WaitingForAssetLoad; } // Once async asset bundle load is done, we can read the asset if (_LoadingStatus == LoadingStatus.WaitingForAssetLoad) { if (!_AssetRequest.isDone) { return; } if (!_AssetRequest.asset) { _LoadingFailure = $"Failed to load Asset '{Path.GetFileName(_ResourcesPathObjRefs)}'"; _LoadingStatus = LoadingStatus.Completed; return; } _ResourceObjRefs = _AssetRequest.asset as ReferencedUnityObjects; if (_ResourceObjRefs == null) { _LoadingFailure = $"Failed to load object references resource '{_ResourcesPathObjRefs}'"; _LoadingStatus = LoadingStatus.Completed; return; } _LoadingStatus = LoadingStatus.WaitingForEntitiesLoad; } // Once async resource load is done, we can async read the entity scene data if (_LoadingStatus == LoadingStatus.WaitingForResourcesLoad) { if (_ResourceObjRefs == null) { _LoadingFailure = $"Failed to load object references resource '{_ResourcesPathObjRefs}'"; _LoadingStatus = LoadingStatus.Completed; return; } _LoadingStatus = LoadingStatus.WaitingForEntitiesLoad; } if (_LoadingStatus == LoadingStatus.WaitingForEntitiesLoad) { try { _LoadingStatus = LoadingStatus.WaitingForSceneDeserialization; ScheduleSceneRead(_ResourceObjRefs); if (_BlockUntilFullyLoaded) { _EntityManager.ExclusiveEntityTransactionDependency.Complete(); } } catch (Exception e) { _LoadingFailure = e.Message; _LoadingStatus = LoadingStatus.Completed; } } // Complete Loading status if (_LoadingStatus == LoadingStatus.WaitingForSceneDeserialization) { if (_EntityManager.ExclusiveEntityTransactionDependency.IsCompleted) { _EntityManager.ExclusiveEntityTransactionDependency.Complete(); _LoadingStatus = LoadingStatus.Completed; var currentTime = Time.realtimeSinceStartup; var totalTime = currentTime - _StartTime; System.Console.WriteLine($"Streamed scene with {totalTime * 1000,3:f0}ms latency from {_ScenePath}"); } } }
public void Update() { //@TODO: Try to overlap Resources load and entities scene load // Begin Async resource load if (_LoadingStatus == LoadingStatus.NotStarted) { if (_SceneSize == 0) { return; } try { _StartTime = Time.realtimeSinceStartup; if (_ExpectedSharedComponentCount != 0) { _ResourceRequest = Resources.LoadAsync <GameObject>(_ResourcesPath); _LoadingStatus = LoadingStatus.WaitingForResourcesLoad; } else { _LoadingStatus = LoadingStatus.WaitingForEntitiesLoad; } _FileContent = (byte *)UnsafeUtility.Malloc(_SceneSize, 16, Allocator.Persistent); ReadCommand cmd; cmd.Buffer = _FileContent; cmd.Offset = 0; cmd.Size = _SceneSize; _ReadHandle = AsyncReadManager.Read(_ScenePath, &cmd, 1); } catch (Exception e) { _LoadingFailure = e.Message; _LoadingStatus = LoadingStatus.Completed; } } // Once async resource load is done, we can async read the entity scene data if (_LoadingStatus == LoadingStatus.WaitingForResourcesLoad) { if (!_ResourceRequest.isDone) { return; } if (!_ResourceRequest.asset) { _LoadingFailure = $"Failed to load Shared component resource '{_ResourcesPath}'"; _LoadingStatus = LoadingStatus.Completed; return; } try { _LoadingStatus = LoadingStatus.WaitingForEntitiesLoad; ScheduleSceneRead(_ResourceRequest.asset as GameObject); } catch (Exception e) { _LoadingFailure = e.Message; _LoadingStatus = LoadingStatus.Completed; } } // Complete Loading status if (_LoadingStatus == LoadingStatus.WaitingForEntitiesLoad) { if (_EntityManager.ExclusiveEntityTransactionDependency.IsCompleted) { _EntityManager.ExclusiveEntityTransactionDependency.Complete(); _LoadingStatus = LoadingStatus.Completed; var currentTime = Time.realtimeSinceStartup; var totalTime = currentTime - _StartTime; System.Console.WriteLine($"Streamed scene with {totalTime*1000,3:f0}ms latency from {_ScenePath}"); } } }