ある特定のプラットフォームのみ、起動時にFLinkerLoad::PreloadでASSERTとなります。

Xbox及びWinGDKのみですが、起動直後にクラッシュします。場所はFLinkerLoad::Preload内になります。

コールスタックをご覧いただければお分かりになるかと思いますが、EDL中にPreload処理を呼び出そうとしてcheckfに引っかかっています。

いろいろな理由があると思いますが、まずは順を追って質問させてください。

現在開発中のタイトルでは、UDeveloperSettingsから派生させたクラスがあり、プロジェクト設定でタイトルオリジナルの設定があります。

この中でハード参照している箇所があります。UDeveloperSettingsから派生させたクラスで、ハード参照を扱ってよいのか、を質問させてください。

参考用に、コールスタック及びログを添付します。

何卒宜しくお願い致します。

お世話になっております。

UDeveloperSettingsから派生させたクラスでハード参照を扱うことについては特に制限はありません。ハード参照を扱って頂いて問題なく、そこで問題が発生している場合はバグか、想定されていない挙動の可能性があります。ログではDataTableをロードしているようですが、特に問題はないはずです。しかしながら特定のプラットフォームだけで問題が起きているということなので、そのプラットフォームにおける.iniファイルの設定や、クック・パッケージ作成方法などで挙動に違いがあるのかもしれません。

1つ気になる点としてはログを拝見しましたが、このアプリケーションでは古いAsyncLoadingThreadが有効になっている(新しいAsyncLoadingThread2が動いていない)ということです。これはEDLが起動していることや “Async Loading initialized: Event Driven Loader: %s, Async Loading Thread: %s, Async Post Load: %s” のログが出力されていることがそれを示していますが、AsyncLoadingThreadを有効(s.AsyncLoadingThreadEnabled=True)にしていて、iostoreを有効(bUseIoStore=True)にしていればこのような挙動にはならず、推奨のAsyncLoadingThread2を利用することになるので、まずはこれらの設定が有効になっていて、動作するかどうかをご確認頂ければと思います。

回答ありがとうございました。

  • AsyncLoadingThreadを有効(s.AsyncLoadingThreadEnabled=True)にしていて、iostoreを有効(bUseIoStore=True)にしていれば

こちらですが、DefaultGame.iniやDefaultEngine.iniを確認する限りは条件を満たしていると思われます。

両ファイルを添付しましたので、ご確認をお願いできればと思います。

またUEエディタ上で「s.AsyncLoadingThreadEnabled」がTrue(1)になっているのは確認できたのですが、「bUseIoStore」については確認方法が分かりませんでした。

UEエディタ実行時に(Visual Studioも使って)AsyncLoadingThreadかAsyncLoadingThread2どちらが使われているかを確認する方法がありましたらご教示いただくと助かります。

何卒宜しくお願い致します。

AsyncLoadingThread2が使われない原因を探っていたのですが、s.UseOldLoaderAsFallback=True(というよりiniファイルで何も指定していないので、ソース側の初期設定「true」がそのまま入っていました)になっているのが理由のようです。これをFalseにしたところ、EDL中にPreload処理が呼び出されることはなくなりました。

まだソース側を試しに変更してみただけですので、iniファイルにこの設定(s.UseOldLoaderAsFallback=False)を行い、パッケージングして試してみます。

ご確認頂きありがとうございます。

> 「bUseIoStore」については確認方法が分かりませんでした。

bUseIoStore は プロジェクト設定で設定することができますが、デフォルトでは有効になっているはずです。そしてパッケージアプリケーションに対してはこの設定を有効にするか、パッケージング時にUATオプションとして -iostore を指定していれば有効になります。

> UEエディタ実行時に(Visual Studioも使って)AsyncLoadingThreadかAsyncLoadingThread2どちらが使われているかを確認する方法がありましたらご教示いただくと助かります。

エディタで確認する場合は以下のパラメータで設定された場合は AsyncLoadingThread2 が有効になります。InitAsyncThread() をステップ実行することでこれを確認できるかと思いますが、今回はXbox およびWinGDKで発生しているとのことで、エディタでの動作は直接関係がないものかと認識しております。

https://www.docswell.com/s/EpicGamesJapan/5W1L11\-UE5\_CEDEC2023\_ImproveIteration\#p73

[/Script/Engine.EditorStreamingSettings] s.ZenLoaderEnabled=True s.AsyncLoadingThreadEnabled=True

結局UseOldLoaderAsFallbackはiniファイルで設定しても変えられ内容でしたので、ソースを直接変更して対応しました。

改めてWinGDK版のパッケージングを行い、インストール後に起動してみたのですが、今度はUMaterialInterface::InitDefaultMaterials()内、Material.cpp(603)のcheckfに引っかかりました。この症状についても他のプラットフォーム(Win64、PS5)では見られない現象です。「/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial」というアセットが見つからないということなのですが、Engineフォルダにはそのアセットが存在することを確認しています。

これはどのような原因が考えられるでしょうか?

3つのログファイル(パッケージング時に作成されるログ×2、起動時のログ)を添付します。

何卒宜しくお願い致します。

このログで問題となっている部分が以下の箇所です。WorldGridMaterialはパッケージ(パックファイル)に含まれているはずですが、ディスク上にないことをログが示しています。

LogStreaming: Warning: LoadPackage: SkipPackage: /Engine/EngineMaterials/WorldGridMaterial (0x953039A7B296B2EE) - The package to load does not exist on disk or in the loader LogUObjectGlobals: Warning: オブジェクト 'Material /Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial' が見つかりませんでした Assertion failed: GDefaultMaterials[Domain] != nullptr [File:C:\Project\MR_Prod\UE5\Engine\Source\Runtime\Engine\Private\Materials\Material.cpp] [Line: 603] Cannot load default material 'engine-ini:/Script/Engine.Engine.DefaultMaterialName' [Domain=MD_Surface] from path '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial'WinGDKだけ発生しているという点が奇妙ですが、パッケージ(パックファイル)に含まれていることを確認することである程度問題が切り分けできます。

パックファイルに含まれているかどうかは以下の記事で示す方法で確認できます。IOStoreを有効にしている場合は. utoc にファイルの情報が含まれているかを確認します。デフォルトではWorldGridMaterialもパックファイルに含まれるはずですが、仮に含まれていない場合は何らかの問題により含まれなくなっていることが起きているものと思われます。その場合は、一度 Saved/Cooked ディレクトリ、 Saved/StagedBuilds ディレクトリを削除して再度パッケージしてみることをおすすめします。

もしそれでもまだ問題が起きる場合は、同じエンジンで空のプロジェクトからWinGDKのパッケージを作成した際に、同じ問題が起きるかをご確認頂くことで、エンジンそのものが間違っているか、プロジェクトに関連する箇所で問題が起きているかも切り分けることができるかと思います。

もしかするとWorldGridMaterialの件と関連するかもしれませんので、以下の質問にご回答いただければと思います。

FAsyncPackageLoader2が作られず、FAsyncPackageLoaderが作られる理由としてはGUseOldLoaderAsFallback=trueだったのですが、そもそもAsyncPackageLoader.cpp(229)、InitAsyncThread()内の以下のコード、

else if (bHasScriptObjectsChunk) { GPackageLoader.Reset(MakeAsyncPackageLoader2(IoDispatcher)); }を通っていないのが原因のような気がするのですが、いかがでしょうか? このコードを通らずに下に抜けると、GUseOldLoaderAsFallback=trueなので必ずFAsyncPackageLoaderが作られてしまいます。

もしそうであるならば、その前のコードである(AsyncPackageLoader.cpp(216))

const bool bHasScriptObjectsChunk = FIoDispatcherInternal::HasPackageData();でFIoDispatcherInternal::HasPackageData()ががfalseを返しているのが問題かと思われます。それが問題であるならば、trueを返すようにするにはどうすればよいでしょうか?

何卒宜しくお願い致します。

パッケージングしたアプリケーションを作成する場合 IOStoreを有効にしてさえいれば、作成されたアプリケーションは起動時に AsyncPackageLoader2 を使用します。最後に共有頂いたログ Boot.log は少なくともAPL2が起動できているかと思います。これは以下の部分のログが示しています。

LogStreaming: Display: AsyncLoading2 - Created: Event Driven Loader: false, Async Loading Thread: true, Async Post Load: true LogStreaming: Display: AsyncLoading2 - InitializedVisual Studio からアプリケーションを起動する場合、デフォルトでルースファイル(パックファイルではない)を利用して起動するため、ALT2が選択されていない可能性があります。FIoDispatcherInternal::HasPackageData() が false を返していたらこれがその理由です。もしALT2の起動をVisual Studioを利用して確認したい場合は、パッケージアプリケーションに -WaitForDebugger の引数などを追加して起動し、パッケージアプリケーションに対してVisual Studioのプロセスをアタッチすることで確認できるはずです。

長々と質問させていただき申し訳ありません。ようやく非同期ロード処理について理解しました。

WinGDKについては、さらにプラグインの構造体やクラスが見つからないエラーが発生しましたが、こちらは.upluginでのプラットフォームの指定が抜けていたためでしたので、対処できました。そしてようやくタイトルの起動を確認しました。ありがとうございました。

さらにXbox Series S/Xの起動を確認してみます。

Xbox Series S/Xの起動も確認できました。アドバイス等大変助かりました。ありがとうございます。

ただちょっと問題があるのですが、Xboxコンソールを使ってデバッグするのはどうすればよいのか、という点です。

Xboxに関してはVisual Studioからの起動でFAsyncLoaingThread2でロードするのを確認しましたが、シリアライズで問題が発生してクラッシュしました。Xbox Managerからゲームを起動するのは問題ありませんので、XboxでもVisual Studioから起動することはできないのでしょうか?

またXboxコンソールで起動しているゲームに対してVisual Studioからアタッチができません。これはこういうものなのでしょうか?(アタッチするときのウィンドウでXboxコンソールの検索ができない)

何卒宜しくお願い致します。

起動時のログ及びクラッシュした時のログをお送りします。

何卒宜しくお願い致します。

大変申し訳ありません。Xboxのデバッグ環境についていろいろ設定が足りないと思われることを確認しましたので、今一度こちらで調査を進めていきたいと思います。

何卒宜しくお願い致します。

Xbox のデバッグに関しては以下のスレッドもご確認ください。

[Content removed]

GDKの場合は デフォルトでVSからの起動ができませんが、UE側でこれを対応できます。BuildConfiguration.xml に以下の定義を追加して GenerateProjectFiles.bat を実行します。これにより、Visual Studio 内からこれを使用してビルドすると、exe ファイルは自動的に devkit 上のオーバーレイ フォルダにコピーされます。

<Configuration> <XboxCommonPlatform> <bPackageDebugAssistance>true</bPackageDebugAssistance> </XboxCommonPlatform> </Configuration>以前の UE5 バージョンではこの機能は利用できませんが、UE5.2 以前の場合は Visual Studioから、Extensions -> Xbox -> Xbox Gaming Explorer を使用して、デバッグするインストール済みパッケージを選択してプロセスアタッチすることができます。

起動のエラーについては以下の箇所で起きていて、DataTableで ScriptStruct 構造体データをシリアライズする際に起きているようです。これがWindowsでも発生していないようであればXSXでデバッグをする必要がありますが、他のプラットフォームでも発生するようであればWindowsでもデバッグしていただくことができるかと思います。

[インライン フレーム] Scone.exe!FBinaryArchiveFormatter::Serialize(UObject * &) 行 273 C++ [インライン フレーム] Scone.exe!FStructuredArchiveSlot::operator<<(UObject * &) 行 349 C++ Scone.exe!FObjectProperty::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 239 C++ [インライン フレーム] Scone.exe!FUnversionedPropertySerializer::Serialize(FStructuredArchiveSlot) 行 118 C++ Scone.exe!SerializeUnversionedProperties(const UStruct * Struct, FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * DefaultsData) 行 961 C++ Scone.exe!UStruct::SerializeTaggedProperties(FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * Defaults, const UObject * BreakRecursionIfFullyLoad) 行 1446 C++ Scone.exe!UScriptStruct::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 3260 C++ [インライン フレーム] Scone.exe!UScriptStruct::SerializeItem(FArchive &) 行 3186 C++ Scone.exe!FInstancedStruct::Serialize(FArchive & Ar) 行 176 C++ Scone.exe!UScriptStruct::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 3231 C++ Scone.exe!FStructProperty::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 170 C++ [インライン フレーム] Scone.exe!FUnversionedPropertySerializer::Serialize(FStructuredArchiveSlot) 行 118 C++ Scone.exe!SerializeUnversionedProperties(const UStruct * Struct, FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * DefaultsData) 行 961 C++ Scone.exe!UStruct::SerializeTaggedProperties(FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * Defaults, const UObject * BreakRecursionIfFullyLoad) 行 1446 C++ Scone.exe!UScriptStruct::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 3260 C++ Scone.exe!FStructProperty::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 170 C++ Scone.exe!FArrayProperty::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 172 C++ [インライン フレーム] Scone.exe!FUnversionedPropertySerializer::Serialize(FStructuredArchiveSlot) 行 118 C++ Scone.exe!SerializeUnversionedProperties(const UStruct * Struct, FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * DefaultsData) 行 961 C++ Scone.exe!UStruct::SerializeTaggedProperties(FStructuredArchiveSlot Slot, unsigned char * Data, UStruct * DefaultsStruct, unsigned char * Defaults, const UObject * BreakRecursionIfFullyLoad) 行 1446 C++ Scone.exe!UScriptStruct::SerializeItem(FStructuredArchiveSlot Slot, void * Value, const void * Defaults) 行 3260 C++ Scone.exe!UDataTable::LoadStructData(FStructuredArchiveSlot Slot) 行 129 C++

回答ありがとうございました。起動時のエラーについては、パックされたアセットとexeに乖離があったのが理由のようです。パッケージしなおして実行して問題なくデバッグできることを確認しました。