public IEnumerator Clear() { _logger.InfoFormat("Clear UnityAssetManager: Wait Asset loaded..."); if (!_bundlePool.IsIdle) { yield return(new WaitUntil(() => { UpdateBundlePool(); _logger.InfoFormat("_bundlePool: {0}", _bundlePool.Status()); return _bundlePool.IsIdle; })); } _logger.InfoFormat("Clear UnityAssetManager: Start..."); foreach (var req in _pendingRequests) { AbstractAssetLoadRequest.Free(req); } foreach (var node in _loadingRequests.Values) { var curNode = node; while (curNode != null) { AbstractAssetLoadRequest.Free(curNode.Value); AssetLoadRequestNode.Free(curNode); curNode = curNode.Next; } _loadingRequestCount = 0; } foreach (var req in _loadedRequests) { AbstractAssetLoadRequest.Free(req, true); } _assetPool.Clear(); _loadingScenes.Clear(); _objectPool.Clear(); _bundlePool.Reset(); failed_CallBack_Asset_List.Clear(); _logger.InfoFormat("Clear UnityAssetManager End"); }
private bool OnAssetLoaded(string bunldeName, string assetName, Object obj) { var assetInfo = GetAssetInfo(bunldeName, assetName); AssetLoadRequestNode node; if (_loadingRequests.TryGetValue(assetInfo, out node)) { //empty if (node.Next == null) { _loadingRequests.Remove(assetInfo); } else { var rmNode = node.Next; node.Next = rmNode.Next; node = rmNode; } var req = node.Value; AssetLoadRequestNode.Free(node); _loadedRequests.Enqueue(req); _loadingRequestCount--; if (_useAssetPool && !_assetPool.ContainsKey(assetInfo)) { _assetPool.Add(assetInfo, obj); } TryLoadAsGameObject(obj, assetInfo, req); return(true); } return(false); }
private void UpdatePendingRequests() { if (_lockCount <= 0 && _pendingRequests.Count > 0) { var pendingIt = _pendingRequests.First; while (pendingIt != null) { if (_loadingRequestCount > _maxLoadingAssetNum) { break; } var req = pendingIt.Value; var next = pendingIt.Next; var assetInfo = req.AssetInfo; if (IsPendingReuqest(req)) { pendingIt = next; //waiting for previous identical assets loaded. continue; } if (req.IsDisposed) { _loadedRequests.Enqueue(req); } else { switch (req.RequestType) { case ELoadRequestType.Bundle: { try { _bundleLoadProfile.BeginProfileOnlyEnableProfile(); _bundlePool.LoadAssetBundle(req.AssetInfo.BundleName); } finally { _bundleLoadProfile.EndProfileOnlyEnableProfile(); } break; } case ELoadRequestType.Scene: { try { _sceneLoadProfile.BeginProfileOnlyEnableProfile(); _bundlePool.LoadScene(assetInfo.BundleName, assetInfo.AssetName, req.IsAdditiveScene); _loadingScenes.Add(assetInfo); _loadedRequests.Enqueue(req); req.IsDisposed = true; } finally { _sceneLoadProfile.EndProfileOnlyEnableProfile(); } break; } case ELoadRequestType.Asset: { try { _assetLoadProfile.BeginProfileOnlyEnableProfile(); if (TryLoadFromAssetPool(req)) { _loadedRequests.Enqueue(req); } else { _bundlePool.LoadAsset(assetInfo.BundleName, assetInfo.AssetName, req.Option.ObjectType); var node = AssetLoadRequestNode.Alloc(req); AssetLoadRequestNode cachedNode; if (_loadingRequests.TryGetValue(req.AssetInfo, out cachedNode)) { node.Next = cachedNode.Next; cachedNode.Next = node; } else { _loadingRequests[req.AssetInfo] = node; } _loadingRequestCount++; } } finally { _assetLoadProfile.EndProfileOnlyEnableProfile(); } break; } } } _pendingRequests.Remove(pendingIt); pendingIt = next; } } }
public static void Free(AssetLoadRequestNode node) { node.Value = null; node.Next = null; ObjectAllocatorHolder <AssetLoadRequestNode> .Free(node); }