/// <summary> /// 处理事件结点。 /// </summary> /// <param name="sender">事件源。</param> /// <param name="e">事件参数。</param> private void HandleEvent(object sender, T e) { EventHandler <T> handlers = null; if (m_EventHandlers.TryGetValue(e.Id, out handlers)) { if (handlers != null) { handlers(sender, e); } } ReferencePool.Release(e.GetType(), e); if (handlers == null && (m_EventPoolMode & EventPoolMode.AllowNoHandler) == 0) { throw new GameFrameworkException(string.Format("Event '{0}' not allow no handler.", e.Id.ToString())); } }
/// <summary> /// 移除所有任务。 /// </summary> public void RemoveAllTasks() { foreach (T task in m_WaitingTasks) { ReferencePool.Release((IReference)task); } m_WaitingTasks.Clear(); foreach (ITaskAgent <T> workingAgent in m_WorkingAgents) { T task = workingAgent.Task; workingAgent.Reset(); m_FreeAgents.Push(workingAgent); ReferencePool.Release((IReference)task); } m_WorkingAgents.Clear(); }
/// <summary> /// 根据任务的标签移除任务。 /// </summary> /// <param name="tag">要移除任务的标签。</param> /// <returns>移除任务的数量。</returns> public int RemoveTasks(string tag) { int count = 0; LinkedListNode <T> currentWaitingTask = m_WaitingTasks.First; while (currentWaitingTask != null) { LinkedListNode <T> next = currentWaitingTask.Next; T task = currentWaitingTask.Value; if (task.Tag == tag) { m_WaitingTasks.Remove(currentWaitingTask); ReferencePool.Release(task); count++; } currentWaitingTask = next; } LinkedListNode <ITaskAgent <T> > currentWorkingAgent = m_WorkingAgents.First; while (currentWorkingAgent != null) { LinkedListNode <ITaskAgent <T> > next = currentWorkingAgent.Next; ITaskAgent <T> workingAgent = currentWorkingAgent.Value; T task = workingAgent.Task; if (task.Tag == tag) { workingAgent.Reset(); m_FreeAgents.Push(workingAgent); m_WorkingAgents.Remove(currentWorkingAgent); ReferencePool.Release(task); count++; } currentWorkingAgent = next; } return(count); }
private void ProcessRunningTasks(float elapseSeconds, float realElapseSeconds) { LinkedListNode <ITaskAgent <T> > current = m_WorkingAgents.First; while (current != null) { T task = current.Value.Task; if (!task.Done) { current.Value.Update(elapseSeconds, realElapseSeconds); current = current.Next; continue; } LinkedListNode <ITaskAgent <T> > next = current.Next; current.Value.Reset(); m_FreeAgents.Push(current.Value); m_WorkingAgents.Remove(current); ReferencePool.Release((IReference)task); current = next; } }
/// <summary> /// 移除所有任务。 /// </summary> /// <returns>移除任务的数量。</returns> public int RemoveAllTasks() { int count = m_WaitingTasks.Count + m_WorkingAgents.Count; foreach (T task in m_WaitingTasks) { ReferencePool.Release(task); } m_WaitingTasks.Clear(); foreach (ITaskAgent <T> workingAgent in m_WorkingAgents) { T task = workingAgent.Task; workingAgent.Reset(); m_FreeAgents.Push(workingAgent); ReferencePool.Release(task); } m_WorkingAgents.Clear(); return(count); }
/// <summary> /// 读取数据。 /// </summary> /// <param name="dataAssetName">内容资源名称。</param> /// <param name="priority">加载数据资源的优先级。</param> /// <param name="userData">用户自定义数据。</param> public void ReadData(string dataAssetName, int priority, object userData) { if (m_ResourceManager == null) { throw new GameFrameworkException("You must set resource manager first."); } if (m_DataProviderHelper == null) { throw new GameFrameworkException("You must set data provider helper first."); } HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName); switch (result) { case HasAssetResult.AssetOnDisk: case HasAssetResult.AssetOnFileSystem: m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData); break; case HasAssetResult.BinaryOnDisk: m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData); break; case HasAssetResult.BinaryOnFileSystem: int dataLength = m_ResourceManager.GetBinaryLength(dataAssetName); EnsureCachedBytesSize(dataLength); if (dataLength != m_ResourceManager.LoadBinaryFromFileSystem(dataAssetName, s_CachedBytes)) { throw new GameFrameworkException(Utility.Text.Format("Load binary '{0}' from file system with internal error.", dataAssetName)); } try { if (!m_DataProviderHelper.ReadData(m_Owner, dataAssetName, s_CachedBytes, 0, dataLength, userData)) { throw new GameFrameworkException(Utility.Text.Format("Load data failure in data provider helper, data asset name '{0}'.", dataAssetName)); } if (m_ReadDataSuccessEventHandler != null) { ReadDataSuccessEventArgs loadDataSuccessEventArgs = ReadDataSuccessEventArgs.Create(dataAssetName, 0f, userData); m_ReadDataSuccessEventHandler(this, loadDataSuccessEventArgs); ReferencePool.Release(loadDataSuccessEventArgs); } } catch (Exception exception) { if (m_ReadDataFailureEventHandler != null) { ReadDataFailureEventArgs loadDataFailureEventArgs = ReadDataFailureEventArgs.Create(dataAssetName, exception.ToString(), userData); m_ReadDataFailureEventHandler(this, loadDataFailureEventArgs); ReferencePool.Release(loadDataFailureEventArgs); return; } throw; } break; default: throw new GameFrameworkException(Utility.Text.Format("Data asset '{0}' is '{1}'.", dataAssetName, result)); } }