序文この記事では、主に Cocos のホット アップデートに関する公式ドキュメントを引用し、これに基づいて、Sprout の現在のホット アップデート プロセスを要約します。 ホットチェンジとはホットアップデートは基本的に、必要なリソースをサーバーからローカルデバイスにダウンロードし、新しいゲームロジックを実行して、ゲームで新しいリソースを使用できるようにします。これにより、開発者は新しいバージョンをリリースせずにバグを修正し、機能をリリースできるため、Apple のレビューメカニズムを回避し、長いレビュー待ち時間と複数の拒否によるコストを回避できます。 Cocos のデフォルトのホット アップデート メカニズムは、パッチ パッケージ アップデート メカニズムに基づいていません。従来のホット アップデートでは、多くの場合、複数のバージョンのパッチ パッケージが生成され、パッチ パッケージが順番にダウンロードされて最新バージョンにアップデートされます。 Cocos のホット アップデート メカニズムは、最新バージョンとローカル バージョンを直接比較して、差分リストを生成し、更新します。 Cocos Hot アップデートの概要マニフェストCocos Hot Update を理解する前に、まずマニフェストを理解する必要があります。 Cocos では、マニフェストはファイル形式であり、それに対応するファイルはリソース記述ファイルと呼ばれ、ローカルまたはリモートに含まれるリソース リストとリソース バージョンを記述するために使用されます。 マニフェスト形式は JSON 形式をモデルにしており、その主要フィールドの意味は次のとおりです。 { "packageUrl": リモート リソースのローカル キャッシュ ルート パス"remoteVersionUrl": [オプション] リモート バージョン ファイルのパス。サーバー側にリソースの新しいバージョンがあるかどうかを判断するために使用されます。"remoteManifestUrl": バージョン情報とすべてのリソース情報を含むリモート リソース マニフェスト ファイルのパス。"version": リソースのバージョン。"engineVersion": エンジンのバージョン。"assets": すべてのリソースのリスト。"key": リソースの相対パス (リソース ルート ディレクトリを基準) "md5": md5 値はリソース ファイルのバージョン情報を表します "compressed": [オプション] 値が true の場合、ファイルはダウンロード後に自動的に解凍されます。現在サポートされているのは zip 圧縮形式のみです "size": [オプション] 進行状況をすばやく取得するために使用されるファイルのバイト サイズ "searchPaths": FileUtils に追加する必要がある検索パス リスト} マニフェスト ファイルは、Cocos Creator ホット アップデート例のバージョン ジェネレーター スクリプトによって自動的に生成できます。 プロジェクトリソースとゲームパッケージリソースの違いCocos Creator プロジェクトを作成すると、その下にアセット ディレクトリが表示されます。このディレクトリには、エディターのアセット パネルに対応するシーン、スクリプト、プレハブなどが保存されます。ただし、これらのプロジェクト リソースはパッケージ化されたリソースと同じではありません。ビルド パネルを使用してネイティブ バージョンをビルドすると、ビルド ディレクトリに res フォルダーと src フォルダーが見つかります。これら 2 つのフォルダーには、実際にゲームを実行するゲーム パッケージ リソースが含まれています。 src にはすべてのスクリプトが含まれ、res にはすべてのリソースが含まれます。 したがって、リソースのホット アップデートでは、プロジェクトのアセット ディレクトリではなく、ビルドされたリソースが自然に更新されるはずです。 Creator2.4.3では、リソース管理モジュールが再構築され、バンドルモジュール化を使用してリソースを管理するようになりました。 uuidを介してリソースパスを取得するためのAPIは次のとおりです。 cc.assetmanager.utils.getUrlWithUuid // uuid を url に変換します。ここで返される url は、ランタイム ゲーム パッケージ内のリソース パスです。 searchPaths検索パスホットアップデートについて話す前に、searchPaths の概念を理解する必要があります。ほとんどの場合、ファイルのパスを記述するときは、「ルート ディレクトリ」に基づいて対応する「相対パス」を指定し、「絶対パス」として直接記述することはありません。これにより、メンテナンスと移行が容易になります。ゲーム開発において、「ルート ディレクトリ」の確実性と一意性を保証することは実際には困難です。ホットアップデート機能を例に挙げてみましょう。画像があります。対応するバンドルディレクトリ(デフォルトはリソース)の相対パスが「./png/icon1.png」であると仮定します。ゲームのバージョンが更新され、画像を更新する必要がある場合、パッケージ内のリソースは書き込み可能ではないため、別の場所から新しい画像を読み取ることしかできません。コードの一貫性を確保するために、対応する「ルートディレクトリ」を変更できれば、コード内の以前の相対パスを変更する必要がなく、新しい画像を見つけることができます。 Creator では、一連の検索パス戦略が維持されます。対応する API については、jsb.fileUtils.getSearchPaths、jsb.fileUtils.fullPathForFilename などを参照してください。ここでその原理を簡単に説明します。 FileUtils は「ルートディレクトリ」の配列を格納します。インデックスが小さいほど、優先順位が高くなります。リソースを検索するときに「相対パス」を指定すると、searchPaths の「ルートディレクトリ」の優先順位に従って「絶対パス」につなぎ合わせてリソースを検索します。パスが有効でファイルが見つかった場合は、検索を中止します。 ゲーム パッケージのインストール ディレクトリには、パッケージ化したさまざまなスクリプトやリソースを保存するディレクトリが必要です。ここではこれを「ゲーム パッケージ ディレクトリ」と呼びます。ホット アップデート ロジックでは、ホット アップデート コンテンツを保存する「ホット アップデート ディレクトリ」を指定する必要があります。両方のディレクトリを検索パスとして設定し、ディレクトリの優先度が高いほど、対応する検索パスの優先度が高くなるようにバージョンを制御する必要があります。このようにして、最新のファイルを見つけることができます。一般的に言えば、「ホット変更ディレクトリ」の優先度は「ゲーム パッケージ ディレクトリ」の優先度よりも高くする必要があります。 Cocosの基本的な修正プロセスこれはcocos公式サイトのフローチャートです。現在のプロセスは、ユーザーがアプリをインストールした後、初めてサーバーのバージョン更新を確認するプロセスです。完全なホットアップデートプロセスはより複雑になり、後でゆっくりと追加される予定です。 この記事は主に、ホット アップデート自体のプロセス ロジックを理解するのに役立ちます。ブレークポイントの再開、ダウンロードの進行状況、同時ダウンロード、エラー検出、解凍、エラー回復などの詳細については、今のところ説明しません。したがって、控訴フローチャートは次のように簡単にまとめることができます。 現在のパッケージのマニフェストの remoteVersionUrl フィールドに従って、現在のバージョン記述ファイルをダウンロードし、ローカルバージョンと比較します。更新が必要な場合は、対応する最新バージョンに更新します。それ以外の場合は更新は不要で、後続のプロセスを続行します。 ここでは、いくつかの重要なポイントをさらに分析する必要があります。 _localManifest: 現在のパッケージのマニフェストまず、「ゲーム パッケージ ディレクトリ」に、現在のゲーム バージョン (「バージョン」フィールド) を記述するデフォルトのマニフェスト ファイルが存在する必要があります。このマニフェストは通常、ゲーム パッケージがアンインストールまたはインストールされたときに更新されます。次に、「ホット変更ディレクトリ」には、現在のホット変更ディレクトリの下のバージョン情報を記述するマニフェスト ファイルも存在します。ゲームを起動するたびに、「ゲーム パッケージ ディレクトリ」または「ホット チェンジ ディレクトリ」が現在の環境で最新バージョンであるかどうかを判断し、searchPaths で対応する優先順位を調整する必要があります。新しいマニフェストは、現在のパッケージのマニフェストとも呼ばれ、_localManifest を使用してコードに記録されます。 まずリモートバージョンマニフェストをリクエストするマニフェストの「remoteVersionUrl」フィールドは、リモート サーバーのバージョン ファイルに対応します。理解を深めるために、公式デモの version.manifest を以下に示します。 { "packageUrl":"http://192.168.50.220:5555/tutorial-hot-update/remote-assets/", "remoteManifestUrl":"http://192.168.50.220:5555/tutorial-hot-update/remote-assets/project.manifest", "remoteVersionUrl":"http://192.168.50.220:5555/tutorial-hot-update/remote-assets/version.manifest", "バージョン":"2.0" } 上記のように、version.manifest には「version」フィールドがあり、これが簡単なバージョン比較の基礎にもなります。 version.manifest をダウンロードし、それをローカルの _localManifest バージョンと比較して、現在のパッケージを更新する必要があるかどうかを検出します。このプロセスは、コード内では通常 checkUpdate と呼ばれます。 一時フォルダの必要性ホットアップデートプロセスでは、複数のリソースを順番にダウンロードするため、この期間中にさまざまな問題が発生する可能性があります。そのため、ダウンロードを一時的に保存するための一時フォルダーが必要です。すべてのファイルがダウンロードされた後、「ホットアップデートディレクトリ」内の古いリソースを置き換える前に、ファイルが完全であるかどうかを確認する必要もあります。「ホットアップデートディレクトリ」に直接ダウンロードしないでください。問題が発生すると、どの部分が新しく、どの部分が古いかがわからなくなります。この考え方はプログラム設計にも応用できます。担当するデータやフィールドをメンテナンスする際は、勝手に変更したり値を割り当てたりするのではなく、全体として置き換えたり更新したりするように心がけるべきです。 よりホットなファイルはよりホットで差別化が図られていますが、これをどのように実現するのでしょうか?マニフェスト ファイルの「assets」フィールドに、各リソースのキーと md5 情報を記録します。リモートの _remoteManifest に記録されたリソースを比較するだけで済みます。新しいキーは新しく追加されたリソースであり、キーのないリソースは削除する必要があります。md5 が異なるファイルは更新する必要があるファイルです。 暑さが和らいだら、どうやって効果を出すか新しいリソースを追加した場合、コードを調整せずにそれらを有効にするにはどうすればよいでしょうか?ハハ、上で紹介したように、「ホット変更ディレクトリ」が「ゲーム パッケージ ディレクトリ」よりも優先されるように searchPaths を調整するだけで済みます。 古いバージョンのリソースの扱い方cocos のホットアップデートは差分ファイルですが、そのマニフェストスクリプトには対応するバンドルのすべてのリソースが記録されます。どのリソースが不要になったかを知ることができます。genDiff 関数についても上で説明しましたが、個人的には古いリソースの削除には注意が必要だと思います。少なくとも、古いリソースを削除する前に、新しいリソースが更新されていることを確認してください。 要約する読者が上記の知識を理解し、Cocos が提供する基本機能を使用すれば、独自のホット アップデート プロセスを完全にカスタマイズできます。簡単に言えば、ホット アップデートは最新のリモート リソースをダウンロードして、現在のパッケージ内の既存のリソースを置き換えます。たとえば、小規模なプロジェクトでは、パッケージ全体をダウンロードして置き換え、バージョンの比較、searchPath の調整、ファイルの検証などの詳細を無視することができます。 上記は、CocosCreator ホットアップデートの詳細についての包括的な説明です。CocosCreator ホットアップデートの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: LinuxのバックグラウンドでPythonプログラムを実行するいくつかの方法
>>: Linux の Centos7 に Mysql5.7.19 をインストールする詳細なチュートリアル
目次1. 理解2. 使用1. h() パラメータ2. 使い方が簡単3. カウンターケースを実装する4...
この記事では、LinuxにバイナリモードでMySQLをインストールする具体的な手順を参考までに紹介し...
Apache Log4j2 が核レベルの脆弱性を報告し、スタックリーダーの友人たちは大騒ぎになりまし...
感想:私はバックエンド開発者です。静的 (HTML) ページを取得すると、ページ構造と命名規則が極端...
html.cssオーバーフローの包括的な理解XML/HTML コードコンテンツをクリップボードにコピ...
find コマンドは、指定されたディレクトリ内のファイルを検索するために使用されます。引数の前の文字...
この記事では、MySQL無料インストール版(zip)のインストールと設定のチュートリアルを参考までに...
序文ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘ...
目次1. 概要1.1 定義1.2 機能説明2. ELKを展開する2.1 ディレクトリとファイルを作成...
目次序文複数の言語を切り替えるにはどうすればいいですか? 1. vue-i18nパッケージをインスト...
Vue で SVG アイコンを導入する方法Vue で svg アイコンを導入する方法 1インストール...
参考までに、JavaScriptのオブジェクトとメソッドを使用して実装されたWebピンボールゲームを...
目次1. pidファイルの紹介2.ソケットファイルの紹介要約:ソケット ファイル: Unix ドメイ...
毎日の統計情報を取得するプロジェクトを実行する際、プロジェクト ログを分析する必要があります。要件の...
1. 削除delete は、オブジェクトのプロパティを残さずに削除する唯一の方法ですが、その「代替」...