Repository: EllanJiang/GameFramework
Branch: master
Commit: d0c010b05167
Files: 335
Total size: 1.9 MB
Directory structure:
gitextract_cx5fvckj/
├── .gitignore
├── GameFramework/
│ ├── Base/
│ │ ├── DataProvider/
│ │ │ ├── DataProvider.cs
│ │ │ ├── DataProviderCreator.cs
│ │ │ ├── IDataProvider.cs
│ │ │ ├── IDataProviderHelper.cs
│ │ │ ├── ReadDataDependencyAssetEventArgs.cs
│ │ │ ├── ReadDataFailureEventArgs.cs
│ │ │ ├── ReadDataSuccessEventArgs.cs
│ │ │ └── ReadDataUpdateEventArgs.cs
│ │ ├── DataStruct/
│ │ │ └── TypeNamePair.cs
│ │ ├── EventPool/
│ │ │ ├── BaseEventArgs.cs
│ │ │ ├── EventPool.Event.cs
│ │ │ ├── EventPool.cs
│ │ │ └── EventPoolMode.cs
│ │ ├── GameFrameworkAction.cs
│ │ ├── GameFrameworkEntry.cs
│ │ ├── GameFrameworkEventArgs.cs
│ │ ├── GameFrameworkException.cs
│ │ ├── GameFrameworkFunc.cs
│ │ ├── GameFrameworkLinkedList.cs
│ │ ├── GameFrameworkLinkedListRange.cs
│ │ ├── GameFrameworkModule.cs
│ │ ├── GameFrameworkMultiDictionary.cs
│ │ ├── GameFrameworkSerializer.cs
│ │ ├── Log/
│ │ │ ├── GameFrameworkLog.ILogHelper.cs
│ │ │ ├── GameFrameworkLog.cs
│ │ │ └── GameFrameworkLogLevel.cs
│ │ ├── ReferencePool/
│ │ │ ├── IReference.cs
│ │ │ ├── ReferencePool.ReferenceCollection.cs
│ │ │ ├── ReferencePool.cs
│ │ │ └── ReferencePoolInfo.cs
│ │ ├── TaskPool/
│ │ │ ├── ITaskAgent.cs
│ │ │ ├── StartTaskStatus.cs
│ │ │ ├── TaskBase.cs
│ │ │ ├── TaskInfo.cs
│ │ │ ├── TaskPool.cs
│ │ │ └── TaskStatus.cs
│ │ ├── Variable/
│ │ │ ├── GenericVariable.cs
│ │ │ └── Variable.cs
│ │ └── Version/
│ │ ├── Version.IVersionHelper.cs
│ │ └── Version.cs
│ ├── Config/
│ │ ├── ConfigManager.ConfigData.cs
│ │ ├── ConfigManager.cs
│ │ ├── IConfigHelper.cs
│ │ └── IConfigManager.cs
│ ├── DataNode/
│ │ ├── DataNodeManager.DataNode.cs
│ │ ├── DataNodeManager.cs
│ │ ├── IDataNode.cs
│ │ └── IDataNodeManager.cs
│ ├── DataTable/
│ │ ├── DataTableBase.cs
│ │ ├── DataTableManager.DataTable.cs
│ │ ├── DataTableManager.cs
│ │ ├── IDataRow.cs
│ │ ├── IDataTable.cs
│ │ ├── IDataTableHelper.cs
│ │ └── IDataTableManager.cs
│ ├── Debugger/
│ │ ├── DebuggerManager.DebuggerWindowGroup.cs
│ │ ├── DebuggerManager.cs
│ │ ├── IDebuggerManager.cs
│ │ ├── IDebuggerWindow.cs
│ │ └── IDebuggerWindowGroup.cs
│ ├── Download/
│ │ ├── Constant.cs
│ │ ├── DownloadAgentHelperCompleteEventArgs.cs
│ │ ├── DownloadAgentHelperErrorEventArgs.cs
│ │ ├── DownloadAgentHelperUpdateBytesEventArgs.cs
│ │ ├── DownloadAgentHelperUpdateLengthEventArgs.cs
│ │ ├── DownloadFailureEventArgs.cs
│ │ ├── DownloadManager.DownloadAgent.cs
│ │ ├── DownloadManager.DownloadCounter.DownloadCounterNode.cs
│ │ ├── DownloadManager.DownloadCounter.cs
│ │ ├── DownloadManager.DownloadTask.cs
│ │ ├── DownloadManager.DownloadTaskStatus.cs
│ │ ├── DownloadManager.cs
│ │ ├── DownloadStartEventArgs.cs
│ │ ├── DownloadSuccessEventArgs.cs
│ │ ├── DownloadUpdateEventArgs.cs
│ │ ├── IDownloadAgentHelper.cs
│ │ └── IDownloadManager.cs
│ ├── Entity/
│ │ ├── EntityManager.EntityGroup.cs
│ │ ├── EntityManager.EntityInfo.cs
│ │ ├── EntityManager.EntityInstanceObject.cs
│ │ ├── EntityManager.EntityStatus.cs
│ │ ├── EntityManager.ShowEntityInfo.cs
│ │ ├── EntityManager.cs
│ │ ├── HideEntityCompleteEventArgs.cs
│ │ ├── IEntity.cs
│ │ ├── IEntityGroup.cs
│ │ ├── IEntityGroupHelper.cs
│ │ ├── IEntityHelper.cs
│ │ ├── IEntityManager.cs
│ │ ├── ShowEntityDependencyAssetEventArgs.cs
│ │ ├── ShowEntityFailureEventArgs.cs
│ │ ├── ShowEntitySuccessEventArgs.cs
│ │ └── ShowEntityUpdateEventArgs.cs
│ ├── Event/
│ │ ├── EventManager.cs
│ │ ├── GameEventArgs.cs
│ │ └── IEventManager.cs
│ ├── FileSystem/
│ │ ├── CommonFileSystemStream.cs
│ │ ├── FileInfo.cs
│ │ ├── FileSystem.BlockData.cs
│ │ ├── FileSystem.HeaderData.cs
│ │ ├── FileSystem.StringData.cs
│ │ ├── FileSystem.cs
│ │ ├── FileSystemAccess.cs
│ │ ├── FileSystemManager.cs
│ │ ├── FileSystemStream.cs
│ │ ├── IFileSystem.cs
│ │ ├── IFileSystemHelper.cs
│ │ └── IFileSystemManager.cs
│ ├── Fsm/
│ │ ├── Fsm.cs
│ │ ├── FsmBase.cs
│ │ ├── FsmManager.cs
│ │ ├── FsmState.cs
│ │ ├── IFsm.cs
│ │ └── IFsmManager.cs
│ ├── GameFramework.csproj
│ ├── Localization/
│ │ ├── ILocalizationHelper.cs
│ │ ├── ILocalizationManager.cs
│ │ ├── Language.cs
│ │ └── LocalizationManager.cs
│ ├── Network/
│ │ ├── AddressFamily.cs
│ │ ├── INetworkChannel.cs
│ │ ├── INetworkChannelHelper.cs
│ │ ├── INetworkManager.cs
│ │ ├── IPacketHandler.cs
│ │ ├── IPacketHeader.cs
│ │ ├── NetworkClosedEventArgs.cs
│ │ ├── NetworkConnectedEventArgs.cs
│ │ ├── NetworkCustomErrorEventArgs.cs
│ │ ├── NetworkErrorCode.cs
│ │ ├── NetworkErrorEventArgs.cs
│ │ ├── NetworkManager.ConnectState.cs
│ │ ├── NetworkManager.HeartBeatState.cs
│ │ ├── NetworkManager.NetworkChannelBase.cs
│ │ ├── NetworkManager.ReceiveState.cs
│ │ ├── NetworkManager.SendState.cs
│ │ ├── NetworkManager.TcpNetworkChannel.cs
│ │ ├── NetworkManager.TcpWithSyncReceiveNetworkChannel.cs
│ │ ├── NetworkManager.cs
│ │ ├── NetworkMissHeartBeatEventArgs.cs
│ │ ├── Packet.cs
│ │ └── ServiceType.cs
│ ├── ObjectPool/
│ │ ├── IObjectPool.cs
│ │ ├── IObjectPoolManager.cs
│ │ ├── ObjectBase.cs
│ │ ├── ObjectInfo.cs
│ │ ├── ObjectPoolBase.cs
│ │ ├── ObjectPoolManager.Object.cs
│ │ ├── ObjectPoolManager.ObjectPool.cs
│ │ ├── ObjectPoolManager.cs
│ │ └── ReleaseObjectFilterCallback.cs
│ ├── Procedure/
│ │ ├── IProcedureManager.cs
│ │ ├── ProcedureBase.cs
│ │ └── ProcedureManager.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Resource/
│ │ ├── ApplyResourcesCompleteCallback.cs
│ │ ├── CheckResourcesCompleteCallback.cs
│ │ ├── CheckVersionListResult.cs
│ │ ├── Constant.cs
│ │ ├── DecryptResourceCallback.cs
│ │ ├── HasAssetResult.cs
│ │ ├── ILoadResourceAgentHelper.cs
│ │ ├── IResourceGroup.cs
│ │ ├── IResourceGroupCollection.cs
│ │ ├── IResourceHelper.cs
│ │ ├── IResourceManager.cs
│ │ ├── InitResourcesCompleteCallback.cs
│ │ ├── LoadAssetCallbacks.cs
│ │ ├── LoadAssetDependencyAssetCallback.cs
│ │ ├── LoadAssetFailureCallback.cs
│ │ ├── LoadAssetSuccessCallback.cs
│ │ ├── LoadAssetUpdateCallback.cs
│ │ ├── LoadBinaryCallbacks.cs
│ │ ├── LoadBinaryFailureCallback.cs
│ │ ├── LoadBinarySuccessCallback.cs
│ │ ├── LoadBytesCallbacks.cs
│ │ ├── LoadBytesFailureCallback.cs
│ │ ├── LoadBytesSuccessCallback.cs
│ │ ├── LoadResourceAgentHelperErrorEventArgs.cs
│ │ ├── LoadResourceAgentHelperLoadCompleteEventArgs.cs
│ │ ├── LoadResourceAgentHelperParseBytesCompleteEventArgs.cs
│ │ ├── LoadResourceAgentHelperReadBytesCompleteEventArgs.cs
│ │ ├── LoadResourceAgentHelperReadFileCompleteEventArgs.cs
│ │ ├── LoadResourceAgentHelperUpdateEventArgs.cs
│ │ ├── LoadResourceProgress.cs
│ │ ├── LoadResourceStatus.cs
│ │ ├── LoadSceneCallbacks.cs
│ │ ├── LoadSceneDependencyAssetCallback.cs
│ │ ├── LoadSceneFailureCallback.cs
│ │ ├── LoadSceneSuccessCallback.cs
│ │ ├── LoadSceneUpdateCallback.cs
│ │ ├── LocalVersionList.FileSystem.cs
│ │ ├── LocalVersionList.Resource.cs
│ │ ├── LocalVersionList.cs
│ │ ├── PackageVersionList.Asset.cs
│ │ ├── PackageVersionList.FileSystem.cs
│ │ ├── PackageVersionList.Resource.cs
│ │ ├── PackageVersionList.ResourceGroup.cs
│ │ ├── PackageVersionList.cs
│ │ ├── PackageVersionListSerializer.cs
│ │ ├── ReadOnlyVersionListSerializer.cs
│ │ ├── ReadWriteVersionListSerializer.cs
│ │ ├── ResourceApplyFailureEventArgs.cs
│ │ ├── ResourceApplyStartEventArgs.cs
│ │ ├── ResourceApplySuccessEventArgs.cs
│ │ ├── ResourceManager.AssetInfo.cs
│ │ ├── ResourceManager.LoadType.cs
│ │ ├── ResourceManager.ReadWriteResourceInfo.cs
│ │ ├── ResourceManager.ResourceChecker.CheckInfo.CheckStatus.cs
│ │ ├── ResourceManager.ResourceChecker.CheckInfo.LocalVersionInfo.cs
│ │ ├── ResourceManager.ResourceChecker.CheckInfo.RemoteVersionInfo.cs
│ │ ├── ResourceManager.ResourceChecker.CheckInfo.cs
│ │ ├── ResourceManager.ResourceChecker.cs
│ │ ├── ResourceManager.ResourceGroup.cs
│ │ ├── ResourceManager.ResourceGroupCollection.cs
│ │ ├── ResourceManager.ResourceInfo.cs
│ │ ├── ResourceManager.ResourceIniter.cs
│ │ ├── ResourceManager.ResourceLoader.AssetObject.cs
│ │ ├── ResourceManager.ResourceLoader.LoadAssetTask.cs
│ │ ├── ResourceManager.ResourceLoader.LoadBinaryInfo.cs
│ │ ├── ResourceManager.ResourceLoader.LoadDependencyAssetTask.cs
│ │ ├── ResourceManager.ResourceLoader.LoadResourceAgent.cs
│ │ ├── ResourceManager.ResourceLoader.LoadResourceTaskBase.cs
│ │ ├── ResourceManager.ResourceLoader.LoadSceneTask.cs
│ │ ├── ResourceManager.ResourceLoader.ResourceObject.cs
│ │ ├── ResourceManager.ResourceLoader.cs
│ │ ├── ResourceManager.ResourceName.cs
│ │ ├── ResourceManager.ResourceNameComparer.cs
│ │ ├── ResourceManager.ResourceUpdater.ApplyInfo.cs
│ │ ├── ResourceManager.ResourceUpdater.UpdateInfo.cs
│ │ ├── ResourceManager.ResourceUpdater.cs
│ │ ├── ResourceManager.ResourceVerifier.VerifyInfo.cs
│ │ ├── ResourceManager.ResourceVerifier.cs
│ │ ├── ResourceManager.VersionListProcessor.cs
│ │ ├── ResourceManager.cs
│ │ ├── ResourceMode.cs
│ │ ├── ResourcePackVersionList.Resource.cs
│ │ ├── ResourcePackVersionList.cs
│ │ ├── ResourcePackVersionListSerializer.cs
│ │ ├── ResourceUpdateAllCompleteEventArgs.cs
│ │ ├── ResourceUpdateChangedEventArgs.cs
│ │ ├── ResourceUpdateFailureEventArgs.cs
│ │ ├── ResourceUpdateStartEventArgs.cs
│ │ ├── ResourceUpdateSuccessEventArgs.cs
│ │ ├── ResourceVerifyFailureEventArgs.cs
│ │ ├── ResourceVerifyStartEventArgs.cs
│ │ ├── ResourceVerifySuccessEventArgs.cs
│ │ ├── UnloadSceneCallbacks.cs
│ │ ├── UnloadSceneFailureCallback.cs
│ │ ├── UnloadSceneSuccessCallback.cs
│ │ ├── UpdatableVersionList.Asset.cs
│ │ ├── UpdatableVersionList.FileSystem.cs
│ │ ├── UpdatableVersionList.Resource.cs
│ │ ├── UpdatableVersionList.ResourceGroup.cs
│ │ ├── UpdatableVersionList.cs
│ │ ├── UpdatableVersionListSerializer.cs
│ │ ├── UpdateResourcesCompleteCallback.cs
│ │ ├── UpdateVersionListCallbacks.cs
│ │ ├── UpdateVersionListFailureCallback.cs
│ │ ├── UpdateVersionListSuccessCallback.cs
│ │ └── VerifyResourcesCompleteCallback.cs
│ ├── Scene/
│ │ ├── ISceneManager.cs
│ │ ├── LoadSceneDependencyAssetEventArgs.cs
│ │ ├── LoadSceneFailureEventArgs.cs
│ │ ├── LoadSceneSuccessEventArgs.cs
│ │ ├── LoadSceneUpdateEventArgs.cs
│ │ ├── SceneManager.cs
│ │ ├── UnloadSceneFailureEventArgs.cs
│ │ └── UnloadSceneSuccessEventArgs.cs
│ ├── Setting/
│ │ ├── ISettingHelper.cs
│ │ ├── ISettingManager.cs
│ │ └── SettingManager.cs
│ ├── Sound/
│ │ ├── Constant.cs
│ │ ├── ISoundAgent.cs
│ │ ├── ISoundAgentHelper.cs
│ │ ├── ISoundGroup.cs
│ │ ├── ISoundGroupHelper.cs
│ │ ├── ISoundHelper.cs
│ │ ├── ISoundManager.cs
│ │ ├── PlaySoundDependencyAssetEventArgs.cs
│ │ ├── PlaySoundErrorCode.cs
│ │ ├── PlaySoundFailureEventArgs.cs
│ │ ├── PlaySoundParams.cs
│ │ ├── PlaySoundSuccessEventArgs.cs
│ │ ├── PlaySoundUpdateEventArgs.cs
│ │ ├── ResetSoundAgentEventArgs.cs
│ │ ├── SoundManager.PlaySoundInfo.cs
│ │ ├── SoundManager.SoundAgent.cs
│ │ ├── SoundManager.SoundGroup.cs
│ │ └── SoundManager.cs
│ ├── UI/
│ │ ├── CloseUIFormCompleteEventArgs.cs
│ │ ├── IUIForm.cs
│ │ ├── IUIFormHelper.cs
│ │ ├── IUIGroup.cs
│ │ ├── IUIGroupHelper.cs
│ │ ├── IUIManager.cs
│ │ ├── OpenUIFormDependencyAssetEventArgs.cs
│ │ ├── OpenUIFormFailureEventArgs.cs
│ │ ├── OpenUIFormSuccessEventArgs.cs
│ │ ├── OpenUIFormUpdateEventArgs.cs
│ │ ├── UIManager.OpenUIFormInfo.cs
│ │ ├── UIManager.UIFormInstanceObject.cs
│ │ ├── UIManager.UIGroup.UIFormInfo.cs
│ │ ├── UIManager.UIGroup.cs
│ │ └── UIManager.cs
│ ├── Utility/
│ │ ├── Utility.Assembly.cs
│ │ ├── Utility.Compression.ICompressionHelper.cs
│ │ ├── Utility.Compression.cs
│ │ ├── Utility.Converter.cs
│ │ ├── Utility.Encryption.cs
│ │ ├── Utility.Json.IJsonHelper.cs
│ │ ├── Utility.Json.cs
│ │ ├── Utility.Marshal.cs
│ │ ├── Utility.Path.cs
│ │ ├── Utility.Random.cs
│ │ ├── Utility.Text.ITextHelper.cs
│ │ ├── Utility.Text.cs
│ │ ├── Utility.Verifier.Crc32.cs
│ │ ├── Utility.Verifier.cs
│ │ └── Utility.cs
│ └── WebRequest/
│ ├── Constant.cs
│ ├── IWebRequestAgentHelper.cs
│ ├── IWebRequestManager.cs
│ ├── WebRequestAgentHelperCompleteEventArgs.cs
│ ├── WebRequestAgentHelperErrorEventArgs.cs
│ ├── WebRequestFailureEventArgs.cs
│ ├── WebRequestManager.WebRequestAgent.cs
│ ├── WebRequestManager.WebRequestTask.cs
│ ├── WebRequestManager.WebRequestTaskStatus.cs
│ ├── WebRequestManager.cs
│ ├── WebRequestStartEventArgs.cs
│ └── WebRequestSuccessEventArgs.cs
├── GameFramework.sln
├── LICENSE.md
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
build/
bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015 cache/options directory
.vs/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
## TODO: Comment the next line if you want to checkin your
## web deploy settings but do note that will include unencrypted
## passwords
#*.pubxml
*.publishproj
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# Windows Azure Build Output
csx/
*.build.csdef
# Windows Store app package directory
AppPackages/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
================================================
FILE: GameFramework/Base/DataProvider/DataProvider.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Resource;
using System;
namespace GameFramework
{
///
/// 数据提供者。
///
/// 数据提供者的持有者的类型。
internal sealed class DataProvider : IDataProvider
{
private const int BlockSize = 1024 * 4;
private static byte[] s_CachedBytes = null;
private readonly T m_Owner;
private readonly LoadAssetCallbacks m_LoadAssetCallbacks;
private readonly LoadBinaryCallbacks m_LoadBinaryCallbacks;
private IResourceManager m_ResourceManager;
private IDataProviderHelper m_DataProviderHelper;
private EventHandler m_ReadDataSuccessEventHandler;
private EventHandler m_ReadDataFailureEventHandler;
private EventHandler m_ReadDataUpdateEventHandler;
private EventHandler m_ReadDataDependencyAssetEventHandler;
///
/// 初始化数据提供者的新实例。
///
/// 数据提供者的持有者。
public DataProvider(T owner)
{
m_Owner = owner;
m_LoadAssetCallbacks = new LoadAssetCallbacks(LoadAssetSuccessCallback, LoadAssetOrBinaryFailureCallback, LoadAssetUpdateCallback, LoadAssetDependencyAssetCallback);
m_LoadBinaryCallbacks = new LoadBinaryCallbacks(LoadBinarySuccessCallback, LoadAssetOrBinaryFailureCallback);
m_ResourceManager = null;
m_DataProviderHelper = null;
m_ReadDataSuccessEventHandler = null;
m_ReadDataFailureEventHandler = null;
m_ReadDataUpdateEventHandler = null;
m_ReadDataDependencyAssetEventHandler = null;
}
///
/// 获取缓冲二进制流的大小。
///
public static int CachedBytesSize
{
get
{
return s_CachedBytes != null ? s_CachedBytes.Length : 0;
}
}
///
/// 读取数据成功事件。
///
public event EventHandler ReadDataSuccess
{
add
{
m_ReadDataSuccessEventHandler += value;
}
remove
{
m_ReadDataSuccessEventHandler -= value;
}
}
///
/// 读取数据失败事件。
///
public event EventHandler ReadDataFailure
{
add
{
m_ReadDataFailureEventHandler += value;
}
remove
{
m_ReadDataFailureEventHandler -= value;
}
}
///
/// 读取数据更新事件。
///
public event EventHandler ReadDataUpdate
{
add
{
m_ReadDataUpdateEventHandler += value;
}
remove
{
m_ReadDataUpdateEventHandler -= value;
}
}
///
/// 读取数据时加载依赖资源事件。
///
public event EventHandler ReadDataDependencyAsset
{
add
{
m_ReadDataDependencyAssetEventHandler += value;
}
remove
{
m_ReadDataDependencyAssetEventHandler -= value;
}
}
///
/// 确保二进制流缓存分配足够大小的内存并缓存。
///
/// 要确保二进制流缓存分配内存的大小。
public static void EnsureCachedBytesSize(int ensureSize)
{
if (ensureSize < 0)
{
throw new GameFrameworkException("Ensure size is invalid.");
}
if (s_CachedBytes == null || s_CachedBytes.Length < ensureSize)
{
FreeCachedBytes();
int size = (ensureSize - 1 + BlockSize) / BlockSize * BlockSize;
s_CachedBytes = new byte[size];
}
}
///
/// 释放缓存的二进制流。
///
public static void FreeCachedBytes()
{
s_CachedBytes = null;
}
///
/// 读取数据。
///
/// 内容资源名称。
public void ReadData(string dataAssetName)
{
ReadData(dataAssetName, Constant.DefaultPriority, null);
}
///
/// 读取数据。
///
/// 内容资源名称。
/// 加载数据资源的优先级。
public void ReadData(string dataAssetName, int priority)
{
ReadData(dataAssetName, priority, null);
}
///
/// 读取数据。
///
/// 内容资源名称。
/// 用户自定义数据。
public void ReadData(string dataAssetName, object userData)
{
ReadData(dataAssetName, Constant.DefaultPriority, userData);
}
///
/// 读取数据。
///
/// 内容资源名称。
/// 加载数据资源的优先级。
/// 用户自定义数据。
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));
}
}
///
/// 解析内容。
///
/// 要解析的内容字符串。
/// 是否解析内容成功。
public bool ParseData(string dataString)
{
return ParseData(dataString, null);
}
///
/// 解析内容。
///
/// 要解析的内容字符串。
/// 用户自定义数据。
/// 是否解析内容成功。
public bool ParseData(string dataString, object userData)
{
if (m_DataProviderHelper == null)
{
throw new GameFrameworkException("You must set data helper first.");
}
if (dataString == null)
{
throw new GameFrameworkException("Data string is invalid.");
}
try
{
return m_DataProviderHelper.ParseData(m_Owner, dataString, userData);
}
catch (Exception exception)
{
if (exception is GameFrameworkException)
{
throw;
}
throw new GameFrameworkException(Utility.Text.Format("Can not parse data string with exception '{0}'.", exception), exception);
}
}
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 是否解析内容成功。
public bool ParseData(byte[] dataBytes)
{
if (dataBytes == null)
{
throw new GameFrameworkException("Data bytes is invalid.");
}
return ParseData(dataBytes, 0, dataBytes.Length, null);
}
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 用户自定义数据。
/// 是否解析内容成功。
public bool ParseData(byte[] dataBytes, object userData)
{
if (dataBytes == null)
{
throw new GameFrameworkException("Data bytes is invalid.");
}
return ParseData(dataBytes, 0, dataBytes.Length, userData);
}
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 是否解析内容成功。
public bool ParseData(byte[] dataBytes, int startIndex, int length)
{
return ParseData(dataBytes, startIndex, length, null);
}
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 用户自定义数据。
/// 是否解析内容成功。
public bool ParseData(byte[] dataBytes, int startIndex, int length, object userData)
{
if (m_DataProviderHelper == null)
{
throw new GameFrameworkException("You must set data helper first.");
}
if (dataBytes == null)
{
throw new GameFrameworkException("Data bytes is invalid.");
}
if (startIndex < 0 || length < 0 || startIndex + length > dataBytes.Length)
{
throw new GameFrameworkException("Start index or length is invalid.");
}
try
{
return m_DataProviderHelper.ParseData(m_Owner, dataBytes, startIndex, length, userData);
}
catch (Exception exception)
{
if (exception is GameFrameworkException)
{
throw;
}
throw new GameFrameworkException(Utility.Text.Format("Can not parse data bytes with exception '{0}'.", exception), exception);
}
}
///
/// 设置资源管理器。
///
/// 资源管理器。
internal void SetResourceManager(IResourceManager resourceManager)
{
if (resourceManager == null)
{
throw new GameFrameworkException("Resource manager is invalid.");
}
m_ResourceManager = resourceManager;
}
///
/// 设置数据提供者辅助器。
///
/// 数据提供者辅助器。
internal void SetDataProviderHelper(IDataProviderHelper dataProviderHelper)
{
if (dataProviderHelper == null)
{
throw new GameFrameworkException("Data provider helper is invalid.");
}
m_DataProviderHelper = dataProviderHelper;
}
private void LoadAssetSuccessCallback(string dataAssetName, object dataAsset, float duration, object userData)
{
try
{
if (!m_DataProviderHelper.ReadData(m_Owner, dataAssetName, dataAsset, 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, duration, 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;
}
finally
{
m_DataProviderHelper.ReleaseDataAsset(m_Owner, dataAsset);
}
}
private void LoadAssetOrBinaryFailureCallback(string dataAssetName, LoadResourceStatus status, string errorMessage, object userData)
{
string appendErrorMessage = Utility.Text.Format("Load data failure, data asset name '{0}', status '{1}', error message '{2}'.", dataAssetName, status, errorMessage);
if (m_ReadDataFailureEventHandler != null)
{
ReadDataFailureEventArgs loadDataFailureEventArgs = ReadDataFailureEventArgs.Create(dataAssetName, appendErrorMessage, userData);
m_ReadDataFailureEventHandler(this, loadDataFailureEventArgs);
ReferencePool.Release(loadDataFailureEventArgs);
return;
}
throw new GameFrameworkException(appendErrorMessage);
}
private void LoadAssetUpdateCallback(string dataAssetName, float progress, object userData)
{
if (m_ReadDataUpdateEventHandler != null)
{
ReadDataUpdateEventArgs loadDataUpdateEventArgs = ReadDataUpdateEventArgs.Create(dataAssetName, progress, userData);
m_ReadDataUpdateEventHandler(this, loadDataUpdateEventArgs);
ReferencePool.Release(loadDataUpdateEventArgs);
}
}
private void LoadAssetDependencyAssetCallback(string dataAssetName, string dependencyAssetName, int loadedCount, int totalCount, object userData)
{
if (m_ReadDataDependencyAssetEventHandler != null)
{
ReadDataDependencyAssetEventArgs loadDataDependencyAssetEventArgs = ReadDataDependencyAssetEventArgs.Create(dataAssetName, dependencyAssetName, loadedCount, totalCount, userData);
m_ReadDataDependencyAssetEventHandler(this, loadDataDependencyAssetEventArgs);
ReferencePool.Release(loadDataDependencyAssetEventArgs);
}
}
private void LoadBinarySuccessCallback(string dataAssetName, byte[] dataBytes, float duration, object userData)
{
try
{
if (!m_DataProviderHelper.ReadData(m_Owner, dataAssetName, dataBytes, 0, dataBytes.Length, 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, duration, 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;
}
}
}
}
================================================
FILE: GameFramework/Base/DataProvider/DataProviderCreator.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Resource;
namespace GameFramework
{
///
/// 数据提供者创建器。
///
public static class DataProviderCreator
{
///
/// 获取缓冲二进制流的大小。
///
/// 数据提供者的持有者的类型。
/// 缓冲二进制流的大小。
public static int GetCachedBytesSize()
{
return DataProvider.CachedBytesSize;
}
///
/// 确保二进制流缓存分配足够大小的内存并缓存。
///
/// 数据提供者的持有者的类型。
/// 要确保二进制流缓存分配内存的大小。
public static void EnsureCachedBytesSize(int ensureSize)
{
DataProvider.EnsureCachedBytesSize(ensureSize);
}
///
/// 释放缓存的二进制流。
///
/// 数据提供者的持有者的类型。
public static void FreeCachedBytes()
{
DataProvider.FreeCachedBytes();
}
///
/// 创建数据提供者。
///
/// 数据提供者的持有者的类型。
/// 数据提供者的持有者。
/// 资源管理器。
/// 数据提供者辅助器。
/// 创建的数据提供者。
public static IDataProvider Create(T owner, IResourceManager resourceManager, IDataProviderHelper dataProviderHelper)
{
if (owner == null)
{
throw new GameFrameworkException("Owner is invalid.");
}
if (resourceManager == null)
{
throw new GameFrameworkException("Resource manager is invalid.");
}
if (dataProviderHelper == null)
{
throw new GameFrameworkException("Data provider helper is invalid.");
}
DataProvider dataProvider = new DataProvider(owner);
dataProvider.SetResourceManager(resourceManager);
dataProvider.SetDataProviderHelper(dataProviderHelper);
return dataProvider;
}
}
}
================================================
FILE: GameFramework/Base/DataProvider/IDataProvider.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
namespace GameFramework
{
///
/// 数据提供者接口。
///
/// 数据提供者的持有者的类型。
public interface IDataProvider
{
///
/// 读取数据成功事件。
///
event EventHandler ReadDataSuccess;
///
/// 读取数据失败事件。
///
event EventHandler ReadDataFailure;
///
/// 读取数据更新事件。
///
event EventHandler ReadDataUpdate;
///
/// 读取数据时加载依赖资源事件。
///
event EventHandler ReadDataDependencyAsset;
///
/// 读取数据。
///
/// 内容资源名称。
void ReadData(string dataAssetName);
///
/// 读取数据。
///
/// 内容资源名称。
/// 加载数据资源的优先级。
void ReadData(string dataAssetName, int priority);
///
/// 读取数据。
///
/// 内容资源名称。
/// 用户自定义数据。
void ReadData(string dataAssetName, object userData);
///
/// 读取数据。
///
/// 内容资源名称。
/// 加载数据资源的优先级。
/// 用户自定义数据。
void ReadData(string dataAssetName, int priority, object userData);
///
/// 解析内容。
///
/// 要解析的内容字符串。
/// 是否解析内容成功。
bool ParseData(string dataString);
///
/// 解析内容。
///
/// 要解析的内容字符串。
/// 用户自定义数据。
/// 是否解析内容成功。
bool ParseData(string dataString, object userData);
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 是否解析内容成功。
bool ParseData(byte[] dataBytes);
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 用户自定义数据。
/// 是否解析内容成功。
bool ParseData(byte[] dataBytes, object userData);
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 是否解析内容成功。
bool ParseData(byte[] dataBytes, int startIndex, int length);
///
/// 解析内容。
///
/// 要解析的内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 用户自定义数据。
/// 是否解析内容成功。
bool ParseData(byte[] dataBytes, int startIndex, int length, object userData);
}
}
================================================
FILE: GameFramework/Base/DataProvider/IDataProviderHelper.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 数据提供者辅助器接口。
///
public interface IDataProviderHelper
{
///
/// 读取数据。
///
/// 数据提供者的持有者。
/// 内容资源名称。
/// 内容资源。
/// 用户自定义数据。
/// 是否读取数据成功。
bool ReadData(T dataProviderOwner, string dataAssetName, object dataAsset, object userData);
///
/// 读取数据。
///
/// 数据提供者的持有者。
/// 内容资源名称。
/// 内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 用户自定义数据。
/// 是否读取数据成功。
bool ReadData(T dataProviderOwner, string dataAssetName, byte[] dataBytes, int startIndex, int length, object userData);
///
/// 解析内容。
///
/// 数据提供者的持有者。
/// 要解析的内容字符串。
/// 用户自定义数据。
/// 是否解析内容成功。
bool ParseData(T dataProviderOwner, string dataString, object userData);
///
/// 解析内容。
///
/// 数据提供者的持有者。
/// 要解析的内容二进制流。
/// 内容二进制流的起始位置。
/// 内容二进制流的长度。
/// 用户自定义数据。
/// 是否解析内容成功。
bool ParseData(T dataProviderOwner, byte[] dataBytes, int startIndex, int length, object userData);
///
/// 释放内容资源。
///
/// 数据提供者的持有者。
/// 要释放的内容资源。
void ReleaseDataAsset(T dataProviderOwner, object dataAsset);
}
}
================================================
FILE: GameFramework/Base/DataProvider/ReadDataDependencyAssetEventArgs.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 读取数据时加载依赖资源事件。
///
public sealed class ReadDataDependencyAssetEventArgs : GameFrameworkEventArgs
{
///
/// 初始化读取数据时加载依赖资源事件的新实例。
///
public ReadDataDependencyAssetEventArgs()
{
DataAssetName = null;
DependencyAssetName = null;
LoadedCount = 0;
TotalCount = 0;
UserData = null;
}
///
/// 获取内容资源名称。
///
public string DataAssetName
{
get;
private set;
}
///
/// 获取被加载的依赖资源名称。
///
public string DependencyAssetName
{
get;
private set;
}
///
/// 获取当前已加载依赖资源数量。
///
public int LoadedCount
{
get;
private set;
}
///
/// 获取总共加载依赖资源数量。
///
public int TotalCount
{
get;
private set;
}
///
/// 获取用户自定义数据。
///
public object UserData
{
get;
private set;
}
///
/// 创建读取数据时加载依赖资源事件。
///
/// 内容资源名称。
/// 被加载的依赖资源名称。
/// 当前已加载依赖资源数量。
/// 总共加载依赖资源数量。
/// 用户自定义数据。
/// 创建的读取数据时加载依赖资源事件。
public static ReadDataDependencyAssetEventArgs Create(string dataAssetName, string dependencyAssetName, int loadedCount, int totalCount, object userData)
{
ReadDataDependencyAssetEventArgs loadDataDependencyAssetEventArgs = ReferencePool.Acquire();
loadDataDependencyAssetEventArgs.DataAssetName = dataAssetName;
loadDataDependencyAssetEventArgs.DependencyAssetName = dependencyAssetName;
loadDataDependencyAssetEventArgs.LoadedCount = loadedCount;
loadDataDependencyAssetEventArgs.TotalCount = totalCount;
loadDataDependencyAssetEventArgs.UserData = userData;
return loadDataDependencyAssetEventArgs;
}
///
/// 清理读取数据时加载依赖资源事件。
///
public override void Clear()
{
DataAssetName = null;
DependencyAssetName = null;
LoadedCount = 0;
TotalCount = 0;
UserData = null;
}
}
}
================================================
FILE: GameFramework/Base/DataProvider/ReadDataFailureEventArgs.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 读取数据失败事件。
///
public sealed class ReadDataFailureEventArgs : GameFrameworkEventArgs
{
///
/// 初始化读取数据失败事件的新实例。
///
public ReadDataFailureEventArgs()
{
DataAssetName = null;
ErrorMessage = null;
UserData = null;
}
///
/// 获取内容资源名称。
///
public string DataAssetName
{
get;
private set;
}
///
/// 获取错误信息。
///
public string ErrorMessage
{
get;
private set;
}
///
/// 获取用户自定义数据。
///
public object UserData
{
get;
private set;
}
///
/// 创建读取数据失败事件。
///
/// 内容资源名称。
/// 错误信息。
/// 用户自定义数据。
/// 创建的读取数据失败事件。
public static ReadDataFailureEventArgs Create(string dataAssetName, string errorMessage, object userData)
{
ReadDataFailureEventArgs loadDataFailureEventArgs = ReferencePool.Acquire();
loadDataFailureEventArgs.DataAssetName = dataAssetName;
loadDataFailureEventArgs.ErrorMessage = errorMessage;
loadDataFailureEventArgs.UserData = userData;
return loadDataFailureEventArgs;
}
///
/// 清理读取数据失败事件。
///
public override void Clear()
{
DataAssetName = null;
ErrorMessage = null;
UserData = null;
}
}
}
================================================
FILE: GameFramework/Base/DataProvider/ReadDataSuccessEventArgs.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 读取数据成功事件。
///
public sealed class ReadDataSuccessEventArgs : GameFrameworkEventArgs
{
///
/// 初始化读取数据成功事件的新实例。
///
public ReadDataSuccessEventArgs()
{
DataAssetName = null;
Duration = 0f;
UserData = null;
}
///
/// 获取内容资源名称。
///
public string DataAssetName
{
get;
private set;
}
///
/// 获取加载持续时间。
///
public float Duration
{
get;
private set;
}
///
/// 获取用户自定义数据。
///
public object UserData
{
get;
private set;
}
///
/// 创建读取数据成功事件。
///
/// 内容资源名称。
/// 加载持续时间。
/// 用户自定义数据。
/// 创建的读取数据成功事件。
public static ReadDataSuccessEventArgs Create(string dataAssetName, float duration, object userData)
{
ReadDataSuccessEventArgs loadDataSuccessEventArgs = ReferencePool.Acquire();
loadDataSuccessEventArgs.DataAssetName = dataAssetName;
loadDataSuccessEventArgs.Duration = duration;
loadDataSuccessEventArgs.UserData = userData;
return loadDataSuccessEventArgs;
}
///
/// 清理读取数据成功事件。
///
public override void Clear()
{
DataAssetName = null;
Duration = 0f;
UserData = null;
}
}
}
================================================
FILE: GameFramework/Base/DataProvider/ReadDataUpdateEventArgs.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 读取数据更新事件。
///
public sealed class ReadDataUpdateEventArgs : GameFrameworkEventArgs
{
///
/// 初始化读取数据更新事件的新实例。
///
public ReadDataUpdateEventArgs()
{
DataAssetName = null;
Progress = 0f;
UserData = null;
}
///
/// 获取内容资源名称。
///
public string DataAssetName
{
get;
private set;
}
///
/// 获取读取数据进度。
///
public float Progress
{
get;
private set;
}
///
/// 获取用户自定义数据。
///
public object UserData
{
get;
private set;
}
///
/// 创建读取数据更新事件。
///
/// 内容资源名称。
/// 读取数据进度。
/// 用户自定义数据。
/// 创建的读取数据更新事件。
public static ReadDataUpdateEventArgs Create(string dataAssetName, float progress, object userData)
{
ReadDataUpdateEventArgs loadDataUpdateEventArgs = ReferencePool.Acquire();
loadDataUpdateEventArgs.DataAssetName = dataAssetName;
loadDataUpdateEventArgs.Progress = progress;
loadDataUpdateEventArgs.UserData = userData;
return loadDataUpdateEventArgs;
}
///
/// 清理读取数据更新事件。
///
public override void Clear()
{
DataAssetName = null;
Progress = 0f;
UserData = null;
}
}
}
================================================
FILE: GameFramework/Base/DataStruct/TypeNamePair.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using System.Runtime.InteropServices;
namespace GameFramework
{
///
/// 类型和名称的组合值。
///
[StructLayout(LayoutKind.Auto)]
internal struct TypeNamePair : IEquatable
{
private readonly Type m_Type;
private readonly string m_Name;
///
/// 初始化类型和名称的组合值的新实例。
///
/// 类型。
public TypeNamePair(Type type)
: this(type, string.Empty)
{
}
///
/// 初始化类型和名称的组合值的新实例。
///
/// 类型。
/// 名称。
public TypeNamePair(Type type, string name)
{
if (type == null)
{
throw new GameFrameworkException("Type is invalid.");
}
m_Type = type;
m_Name = name ?? string.Empty;
}
///
/// 获取类型。
///
public Type Type
{
get
{
return m_Type;
}
}
///
/// 获取名称。
///
public string Name
{
get
{
return m_Name;
}
}
///
/// 获取类型和名称的组合值字符串。
///
/// 类型和名称的组合值字符串。
public override string ToString()
{
if (m_Type == null)
{
throw new GameFrameworkException("Type is invalid.");
}
string typeName = m_Type.FullName;
return string.IsNullOrEmpty(m_Name) ? typeName : Utility.Text.Format("{0}.{1}", typeName, m_Name);
}
///
/// 获取对象的哈希值。
///
/// 对象的哈希值。
public override int GetHashCode()
{
return m_Type.GetHashCode() ^ m_Name.GetHashCode();
}
///
/// 比较对象是否与自身相等。
///
/// 要比较的对象。
/// 被比较的对象是否与自身相等。
public override bool Equals(object obj)
{
return obj is TypeNamePair && Equals((TypeNamePair)obj);
}
///
/// 比较对象是否与自身相等。
///
/// 要比较的对象。
/// 被比较的对象是否与自身相等。
public bool Equals(TypeNamePair value)
{
return m_Type == value.m_Type && m_Name == value.m_Name;
}
///
/// 判断两个对象是否相等。
///
/// 值 a。
/// 值 b。
/// 两个对象是否相等。
public static bool operator ==(TypeNamePair a, TypeNamePair b)
{
return a.Equals(b);
}
///
/// 判断两个对象是否不相等。
///
/// 值 a。
/// 值 b。
/// 两个对象是否不相等。
public static bool operator !=(TypeNamePair a, TypeNamePair b)
{
return !(a == b);
}
}
}
================================================
FILE: GameFramework/Base/EventPool/BaseEventArgs.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
///
/// 事件基类。
///
public abstract class BaseEventArgs : GameFrameworkEventArgs
{
///
/// 获取类型编号。
///
public abstract int Id
{
get;
}
}
}
================================================
FILE: GameFramework/Base/EventPool/EventPool.Event.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace GameFramework
{
internal sealed partial class EventPool where T : BaseEventArgs
{
///
/// 事件结点。
///
private sealed class Event : IReference
{
private object m_Sender;
private T m_EventArgs;
public Event()
{
m_Sender = null;
m_EventArgs = null;
}
public object Sender
{
get
{
return m_Sender;
}
}
public T EventArgs
{
get
{
return m_EventArgs;
}
}
public static Event Create(object sender, T e)
{
Event eventNode = ReferencePool.Acquire();
eventNode.m_Sender = sender;
eventNode.m_EventArgs = e;
return eventNode;
}
public void Clear()
{
m_Sender = null;
m_EventArgs = null;
}
}
}
}
================================================
FILE: GameFramework/Base/EventPool/EventPool.cs
================================================
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using System.Collections.Generic;
namespace GameFramework
{
///
/// 事件池。
///
/// 事件类型。
internal sealed partial class EventPool where T : BaseEventArgs
{
private readonly GameFrameworkMultiDictionary> m_EventHandlers;
private readonly Queue m_Events;
private readonly Dictionary