/// <summary> /// リクエスト作成 /// </summary> public IAssetLoadOperater <T> Create <T>(string path) where T : UnityEngine.Object { var key = path; if (!Path.HasExtension(key)) { // 拡張子の無いリクエストは警告を出す ChipstarLog.Log_WarningNotHasExtensions(key); } else { // 拡張子があったら削る key = path.Replace(Path.GetExtension(key), string.Empty); } var match = m_regex.Match(key); if (!match.Success) { return(new ResourcesLoadOperation <T>(key)); } // Resources以下を拾う var accessKey = match.Groups[2].Value; return(new ResourcesLoadOperation <T>(key)); }
/// <summary> /// 初期化 /// </summary> public IEnumerator Initialize(RuntimePlatform platform, AssetBundleConfig config) { m_saveDirRoot = config.GetSaveStorage(platform); m_versionFile = config.GetSaveFile(platform); var path = m_versionFile.FullPath; ChipstarLog.Log_InitStorageDB(path); var isExist = File.Exists(path); if (!isExist) { // なければ空データ BuildEmpty(m_versionFile); yield break; } try { // あったら読み込んで変換 var table = m_builder.Read(path); m_runtimeTable = table.List .ToDictionary( c => c.Identifier, c => new CachedFileData(c, m_saveDirRoot) ); } catch (Exception e) { // 読み込み失敗したのでとりあえず空でつくりなおし ChipstarLog.Assert(e.Message); BuildEmpty(m_versionFile); } yield return(null); }
protected override void DoDispose() { m_data?.ReleaseRef(); ChipstarLog.Log_Dump_RefLog(m_data); m_data = null; base.DoDispose(); }
/// <summary> /// /// </summary> public void Create(IAssetManager manager, RuntimePlatform platform, IVersionManifest manifest, AssetBundleConfig config) { if (!(manifest?.IsValid ?? false)) { ChipstarLog.Log_Database_NotFound(); CreateResult = ChipstarResult.ClientError("BuildMap Get Error"); return; } CreateResult = CreateImpl(manager, platform, manifest, config); }
/// <summary> /// 保存 /// </summary> public virtual void Apply() { var path = m_versionFile.FullPath; var table = new TFileTable(); table.Save(m_runtimeTable.Values); m_builder.Write(path, table); IsDirty = false; ChipstarLog.Log_ApplyLocalSaveFile(path); }
/// <summary> /// クリーンアップ /// 保存先を空にする /// </summary> public void CleanUp() { ChipstarLog.Log_CleanupSaveDirectory(m_saveDirRoot); // フォルダごと削除 if (Directory.Exists(m_saveDirRoot.BasePath)) { Directory.Delete(m_saveDirRoot.BasePath, true); } m_runtimeTable.Clear(); IsDirty = true; }
/// <summary> /// 保存バージョンを破棄 /// </summary> private void RemoveVersion(ICachableBundle data) { IsDirty = true; ChipstarLog.Log_RemoveLocalVersion(data); var storageData = Get(data); if (storageData == null) { return; } m_runtimeTable.Remove(data.Identifier); }
/// <summary> /// Manifest自体の取得 /// </summary> public IEnumerator LoadWait(IManifestAccess manifest) { if (m_bundle) { m_bundle.Unload(true); m_bundle = null; } // manifestのパス // s3 : xxxx // server-version / fileName yield return(m_versionLoader.LoadWait( )); var version = m_versionLoader.Get(); while (!m_cache.ready) { yield return(null); } var location = manifest.Uri; ChipstarLog.Log_RequestVersionManifest(location); // 保存先指定 Caching.currentCacheForWriting = m_cache; // アセットバンドルとしてDL/キャッシュ var www = UnityWebRequestAssetBundle.GetAssetBundle(location, version.Hash); www.SendWebRequest(); // DL待ち while (!www.isDone) { yield return(null); if (www.isHttpError || www.isNetworkError) { throw new Exception(www.error + "\n" + www.url); } } // Manifestの取得 m_bundle = DownloadHandlerAssetBundle.GetContent(www); // 中身のLoad var loadMainfestAssets = m_bundle.LoadAllAssetsAsync(); while (!loadMainfestAssets.isDone) { yield return(null); } // 結果の保持 m_assets = loadMainfestAssets.allAssets; // Complete yield break; }
/// <summary> /// ローカルDB取得 /// </summary> public IEnumerator Setup(RuntimePlatform platform, IManifestLoader loader, SoundConfig config) { m_cacheDB = m_saveBuilder.Read(CacheDbLocation.FullPath); yield return(null); var manifest = loader.GetManifest(config.BuildMapName); m_builtinDatabase = config.BuildDatabase(platform); yield return(m_builtinDatabase.Build(platform, manifest)); ChipstarLog.Log_ReadLocalTable(m_cacheDB, CacheDbLocation); yield break; }
/// <summary> /// アセットバンドルの削除 /// </summary> private void DeleteBundle(ICachableBundle data) { var location = GetSaveLocation(data); var path = location.FullPath; if (!File.Exists(path)) { // 存在しないなら削除しない return; } ChipstarLog.Log_DeleteLocalBundle(data); File.Delete(path); }
private T Get <T>(string path, T afterLogin, T always) where T : ILoadOperateFactory { if (afterLogin.CanLoad(path)) { if (!m_isLogin) { // ログイン前なので警告を出力 ChipstarLog.Log_WarningAccessAfterLoginAsset(path); } return(afterLogin); } return(always); }
private IEnumerator Copy(IAccessLocation source, IAccessLocation dest) { ChipstarLog.Log_WriteLocalBundle(source, dest); if (File.Exists(dest.FullPath)) { ChipstarLog.Log($"Exsists File::{dest}"); yield break; } var www = UnityWebRequest.Get(source.FullPath); var handler = new DownloadHandlerFile(dest.FullPath); www.downloadHandler = handler; yield return(www.SendWebRequest()); }
/// <summary> /// 破棄 /// </summary> public void Unload() { if (!IsFree) { ChipstarLog.Log_Unload_Error(this); return; } if (Bundle) { ChipstarLog.Log_Unload_Bundle(this); Bundle.Unload(true); } Bundle = null; IsOnMemory = false; }
/// <summary> /// 未使用のモノを破棄 /// </summary> public IEnumerator UnloadUnusedAssets() { // 参照の無いやつを取得 GetFreeBudleList(ref m_bufferList); using (var scope = StopWatchScope.Create("UnloadProvider.[UnusedBudle.Unload]")) { // 解放 foreach (var bundle in m_bufferList) { bundle.Unload(); } } ChipstarLog.Log_DisposeUnused(m_bufferList); yield return(CallGC()); }
public bool IsBreakFile(ICachableBundle bundleData) { var data = Get(bundleData); if (data == null) { // まだ持ってない return(false); } var isBreak = data.IsBreak(bundleData); if (isBreak) { ChipstarLog.Log_MaybeFileBreak(data.FileInfo, bundleData.PreviewSize); } return(isBreak); }
/// <summary> /// ラベル指定Unload /// </summary> public IEnumerator UnloadUnusedAssets(string[] labels) { // 参照の無いやつを取得 GetFreeBudleList(ref m_bufferList); foreach (var label in labels) { // 一致するラベル以外を削除 m_bufferList.RemoveAll(c => !c.Labels.Contains(label)); } // 解放 foreach (var bundle in m_bufferList) { bundle.Unload(); } ChipstarLog.Log_DisposeUnused(m_bufferList); yield return(null); }
/// <summary> /// ロード処理 /// </summary> public ILoadProcess LoadFile(string identifier) { var data = LoadDatabase.GetBundleData(identifier); if (data == null) { OnError(ChipstarResult.ClientError($"Target Bundle Data is Not Found. == {identifier}")); return(SkipLoadProcess.Create(identifier)); } if (data.IsOnMemory) { // ロードしてあるならしない ChipstarLog.Log_Skip_OnMemory(data.Identifier); return(SkipLoadProcess.Create(identifier)); } // ローカルファイルを開く return(CreateLocalFileOpenJob(data)); }
/// <summary> /// バージョンの保存 /// </summary> private void SaveVersion(ICachableBundle data) { IsDirty = true; ChipstarLog.Log_SaveLocalVersion(data); // ストレージにあるかどうか var storageData = Get(data); if (storageData != null) { // 情報変更 storageData.DeleteFile(); storageData.Update(data, m_saveDirRoot); return; } // 追加 m_runtimeTable[data.Identifier] = new CachedFileData( new LocalBundleData(data.Identifier, data.Path, data.Hash, data.Crc), m_saveDirRoot ); }
private ILoadProcess PrepareImpl(string key) { var database = GetUseDatabase(key); // あったら落とす var fileData = database.Find(key); if (fileData == null) { //CriUtils.Warning( "Movie File Key Not Found : {0}", key ); return(SkipLoadProcess.Create(key)); } if (HasUsm(fileData)) { ChipstarLog.Log($"Cached :: {fileData.Identifier}"); return(SkipLoadProcess.Create(key)); } // Usmファイルを落とす var url = database.GetServerLocation(fileData); return(Download(url, fileData)); }
//================================== // 関数 //================================== /// <summary> /// ローカルのファイルを取得 /// </summary> public static CriVersionTableJson ReadLocal(string path, Encoding encoding) { var isExist = File.Exists(path); if (!isExist) { //なければ空データ return(new CriVersionTableJson()); } try { var contents = File.ReadAllText(path, encoding); return(JsonUtility.FromJson <CriVersionTableJson>(contents)); } catch (Exception e) { // 失敗したらとりあえず空でやり直し ChipstarLog.Assert(e.Message); return(new CriVersionTableJson()); } }
/// <summary> /// キャッシュ保持 /// </summary> public bool HasStorage(ICachableBundle bundleData) { var data = Get(bundleData); if (data == null) { return(false); } // 破損チェック / 一旦サイズチェックだけ if (IsBreakFile(bundleData)) { return(false); } // バージョン不一致 if (!data.IsMatchVersion(bundleData)) { ChipstarLog.Log_MissMatchVersion(bundleData.Path, data.ToString(), bundleData.Hash.ToString()); return(false); } // return(true); }
private ILoadProcess DownloadImpl(ISoundLoadDatabase database, string cueSheetName) { var fileData = database.Find(cueSheetName); if (fileData == null) { ChipstarLog.Log_RequestCueSheet_Error(cueSheetName); return(SkipLoadProcess.Create(cueSheetName)); } ChipstarLog.Log_Download_Sound(fileData); ILoadProcess acbJob = SkipLoadProcess.Create(cueSheetName); var(acbUrl, awbUrl) = database.GetServerLocation(fileData); if (!HasAcb(fileData)) { acbJob = Download(acbUrl, fileData.Acb); } else { ChipstarLog.Log($"Cached :: {fileData.Acb.Identifier}"); } if (!fileData.HasAwb()) { // Awbファイルがないならココまで return(acbJob); } ILoadProcess awbJob = SkipLoadProcess.Create(cueSheetName); if (!HasAwb(fileData)) { awbJob = Download(awbUrl, fileData.Awb); } else { ChipstarLog.Log($"Cached :: {fileData.Awb.Identifier}"); } return(acbJob.ToJoin(awbJob)); }
/// <summary> /// ダウンロード処理 /// </summary> public ILoadProcess CacheOrDownload(string identifier) { var data = LoadDatabase.GetBundleData(identifier); if (data == null) { OnError(ChipstarResult.ClientError($"Target Bundle Data is Not Found. == {identifier}")); return(SkipLoadProcess.Create(identifier)); } if (data.IsOnMemory) { // ロード済みは無視 ChipstarLog.Log_Skip_OnMemory(data.Identifier); return(SkipLoadProcess.Create(data.Identifier)); } if (StorageDatabase.HasStorage(data)) { // キャッシュ済は無視 ChipstarLog.Log_Cached(data); return(SkipLoadProcess.Create(data.Identifier)); } return(CreateDowloadJob(data.Url, data)); }
private bool HasFileImpl(ISoundLoadDatabase database, string cueSheetName) { if (database == null) { return(false); } if (!database.Contains(cueSheetName)) { ChipstarLog.Log_NotContains_RemoteDB_Sound(cueSheetName); return(false); } // サウンドデータ var data = database.Find(cueSheetName); // --- acb-check if (!HasAcb(data)) { return(false); } if (!data.HasAwb()) { // Awb無いならここまででいい return(true); } // --- awb-check // if (!HasAwb(data)) { return(false); } return(true); }
private ResultCode CreateImpl(IAssetManager manager, RuntimePlatform platform, IVersionManifest manifest, AssetBundleConfig config) { var table = m_parser.Parse(manifest.RawData); ChipstarLog.Log_GetBuildMap <TTable, TBundle, TAsset>(table); if (table == null) { return(ChipstarResult.ClientError("Json Parse Error")); } // アセットの一覧 foreach (var asset in table.AssetList) { var d = new AssetData(asset); m_assetsTable.Add(d.Path, d); } // バンドルの一覧 foreach (var bundle in table.BundleList) { var runtime = m_bundleDataCreater.Create(manager, bundle, platform, config); m_bundleTable.Add(bundle.Identifier, runtime); } // 依存関係とアセットデータを接続 foreach (var bundle in table.BundleList) { var runtime = m_bundleTable[bundle.Identifier]; var dependencies = CreateDependencies(bundle); var assets = CreateAssets(bundle); foreach (var asset in assets) { asset.Connect(runtime); } runtime.Set(dependencies); } return(ChipstarResult.Success); }
/// <summary> /// 実行 /// </summary> protected override void DoRun() { m_request = m_data?.LoadAsync <T>(); ChipstarLog.AssertNotNull(m_request, $"Bundle Rquest is Null ::{m_data?.Path ?? string.Empty}"); }
/// <summary> /// 更新 /// </summary> public void Update() { // 更新処理 var existsNullRun = false; for (int i = 0; i < m_runList.Count; i++) { var r = m_runList[i]; if (r == null) { existsNullRun = true; continue; } if (r.IsRunning == false) { r.Run(); } r.Update(); if (r.IsDisposed) { m_disposedList.Add(r); } else if (r.IsCompleted) { m_completeList.Add(r); } } if (existsNullRun) { ChipstarLog.Warning("OperationRoutine.Update() exists null-run."); m_runList.RemoveAll(n => n == null); } if (m_completeList.Count > 0) { for (int i = 0; i < m_completeList.Count; i++) { var c = m_completeList[i]; if (c.IsDisposed) { m_disposedList.Add(c); continue; } c.Complete(); } m_completeList.Clear(); } if (m_disposedList.Count > 0) { for (int i = 0; i < m_disposedList.Count; i++) { m_disposedList[i].Dispose(); } m_runList.RemoveAll(r => m_disposedList.Contains(r)); m_disposedList.Clear(); } }
/// <summary> /// 初期化処理 /// </summary> public void Init( ) { ChipstarLog.Log_Downloader_StartInit(); LoadDatabase.Clear(); }
/// <summary> /// 追加 /// </summary> public virtual void Enqueue(ILoadJob job) { ChipstarLog.Log_AddJob(job); m_queue.Enqueue(job); }
private void BuildEmpty(IAccessLocation location) { m_runtimeTable = new Dictionary <string, CachedFileData>(); ChipstarLog.Log_InitStorageDB_FirstCreate(location); }