x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

ハッシュ値を参照したChunk更新について

Chunkのアップデートの仕組みについて、よくわからないところがあり、問い合わさせていただきました。 具体的には、SlideShareにアップロードされている以下のスライド資料に関する質問になります。

「徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!」 https://www.slideshare.net/EpicGamesJapan/ue4-95204920

「Chunkの更新フローの方針」というページにおいて、以下のような記述があります。

「特定のChunkのみ修正したい場合はバージョンを変えずに、Chunkパッケージを作成・差し替え

・変更がないChunkはハッシュ値が変化しないので再ダウンロードは行われない」 https://image.slidesharecdn.com/upload-180427074031/95/ue4-48-638.jpg

この「ハッシュ値を参照したChunk更新」の仕方についてご教示いただきたく、質問させていただきました。

当方の検証により、以下のことを確認しております。

・Chunkをビルドすると、書き出された”CloudDir“ディレクトリ内に、windowsnoeditor.manifestというファイルが作成される。

・その中に、書き出された全てのChunkのハッシュ値が記載されており、Chunkが更新された場合は、その値も更新される。

Blueprint上で“Request Content”ノードを使用して、Chunkのダウンロードを実装していますが、この場合ですと、ハッシュ値が参照されず、ハッシュ値が更新されていようといまいと、Chunkをダウンロードしてしまいます。

windowsnoeditor.manifestのコピーをローカルに保持し、アセットロード時に毎回、サーバ上のものとローカルのものを比較して更新されているかどうかを判断することもできなくはありませんが、正規のやり方ではないように思われます。

ハッシュ値を参照したChunkのアップデートはどのように実装するのが正しいのでしょうか。 Chunk周りにつきましては、web上の情報が非常に限られており、なかなか手がかりを得ることができません。 情報が記載されているwebページ(英語でも可)や、実装のヒント等、ご教示いただけましたら幸いです。

どうぞよろしくお願い申し上げます。

Product Version: UE 4.21
Tags:
more ▼

asked Apr 24 '19 at 11:58 AM in Packaging & Deployment

avatar image

tkixd
6

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

1 answer: sort voted first

FHttpChunkInstall::ParseTitleFileManifest()内のバージョンアップ検知部分を以下のように変更することでHash違いも検出できるようにすることが可能です。

 if ((InstalledVersion != RemoteVersion && bInstallIsPatch == bRemoteIsPatch) || FilesHaveChanged(InstalledManifest, RemoteManifest, ChunkID))
 {
 
 ...
 }
 
 bool FHTTPChunkInstall::FilesHaveChanged(IBuildManifestPtr LocalManifest, IBuildManifestPtr RemoteManifest, int32 InInstallingChunkID)
 {
 #if (!WITH_EDITORONLY_DATA || IS_PROGRAM)
     if (LocalManifest->GetDownloadSize() != RemoteManifest->GetDownloadSize())
     {
         return true;
     }
 
     // same number of files check to see if the file StartBuis out dated
     auto ChunkFolderName = FString::Printf(TEXT("%s%d"), TEXT("base"), InInstallingChunkID);
     auto ChunkInstallDir = FPaths::Combine(*InstallDir, *ChunkFolderName);
     FBuildPatchAppManifestPtr CurrentManifest = StaticCastSharedPtr< FBuildPatchAppManifest >(LocalManifest);
     FBuildPatchAppManifestPtr InstallManifest = StaticCastSharedPtr< FBuildPatchAppManifest >(RemoteManifest);
     TSet<FString> OutOfDateFiles;
     CurrentManifest->GetOutdatedFiles(InstallManifest.ToSharedRef(), ChunkInstallDir, OutOfDateFiles);
     return OutOfDateFiles.Num() > 0;
 #else
     return false;
 #endif
 }

または、以下の変更でも対応可能です。

 bool isHashMatch = true;
 TSet<FString> Tags;
 auto DonwloadSize = (double)RemoteManifest->GetDeltaDownloadSize(Tags, InstalledManifest.ToSharedRef());
 isHashMatch = DonwloadSize == 0;
   
 if (!isHashMatch || (InstalledVersion != RemoteVersion && bInstallIsPatch == bRemoteIsPatch))
 
 

ご参考になれば幸いです。

more ▼

answered May 14 '19 at 09:11 AM

avatar image

Kaz.Okada STAFF
6 1

(comments are locked)
10|2000 characters needed characters left
Viewable by all users
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question