SlideShare a Scribd company logo
非同期ロード画面
Asynchronous Loading Screen
#UE4 | @UNREALENGINE
自己紹介
Axel Riffard (アクセル リファール)
● 国籍:フランス
● Twitter : @AxRiff
● サポート エンジニア
● エピックゲームズジャパンに12月入社
● 趣味はPerfume、ベイスターズ、ウイスキー、日常最適化
● 最近の勉強:ASM x86-64
● 今プレイしてるゲーム:KH3
#UE4 | @UNREALENGINE
このセッションで学ぶこと
● UE4のモジュールの作り方
● スレッドを分けて、綺麗でヒッチしないロード画面UIの作り方
● UE4の非同期コードの動き方
スライドは後で公開しますよ!!Twitterで見てね!
#UE4 | @UNREALENGINE
初期検討
● マルチスレッドとは?
● UE4での実装は?
#UE4 | @UNREALENGINE
マルチスレッドとは?
● 同じCPUで複数な計算を動かすことです
● プラットフォームによって、別コアで動くものと、
同じコアでロジカルスレッドを作成するものがある。
OSレベルで決めることです。マルチプラットフォー
ムゲームを開発したら、注意!
Process
#UE4 | @UNREALENGINE
UE4内のマルチスレッド
● 何もしなくても、UE4がすでにマルチスレッドを使っている
● GameとDraw以外のスレッドを作れる
● エンジン内の非同期コール機能は、FAsyncTaskという関数です。いろんな所
で使われてるから、検索してみて!
実は…
FAsyncTaskは、別スレッドで走っているとは限らない!
#UE4 | @UNREALENGINE
ロード画面はどうやって作れる?
● レベルロードはゲームスレッドでしか出来ない
● だからロード画面は別スレッドにすれば、ゲームスレッドの邪魔にならない
● レベルのロードが終わったら、非同期で他のアセットをロードする
#UE4 | @UNREALENGINE
メインスレッドで
LoadLevelを呼ぶ
スレッドを作って、
画面を表示する
LoadLevelが終わったら、
作ったスレッドを閉めてメ
インスレッドを表示する
#UE4 | @UNREALENGINE
ActionRPG
● サンプルプロジェクト「ActionRPG」のロード画面の実装が
いいベース
● Googleかアンリアルラウンチャーで無料
#UE4 | @UNREALENGINE
https://youtu.be/FMtNr8xwam0
#UE4 | @UNREALENGINE
Engine
Game
LoadingModule GameModule
FLoadingScreenModule
Implementation UseInterface
IModuleInterface
SCompoundWidget
FSlateDynamicImageBrush
ILoadingScreenModule
SLoadingScreen
FLoadingScreenBrush
C++ BlueprintLibrary
Blueprint Use
#UE4 | @UNREALENGINE
使い方
#UE4 | @UNREALENGINE
ブループリント側
Small text can be placed in at 10pt
BP_GameInstance
Ji実際は、Absoluteパスを必
ず使いましょう!
#UE4 | @UNREALENGINE
ごめん、これからは、
プグラマー向けの話になる
#UE4 | @UNREALENGINE
モジュールとは
● モジュールはUE4のビルドブロックです
● エンジンは、モジュールの大きなコレクションとして実装され、ゲームは独
自のモジュールでそれらを拡張する
● モジュールを追加することが可能
#UE4 | @UNREALENGINE
モジュールのアプローチ
メリット
● ゲームのロジックと分かれている
● 管理しやすい
● 使いまわせる
● エンジンのアップデートがあっても、マージは楽(多分)
● ヒューマンエラーを防げる:関係ない人からみると実装が隠れているので、
副作用が少ない
#UE4 | @UNREALENGINE
#UE4 | @UNREALENGINE
モジュールのロードについて
● ロード画面だから、ゲームの前に作らなきゃいけない
● ELoadingPhase::TypeというEnumで設定する
● ゲームのモジュールはDefaultなので、ゲームとエンジンのinitの前にロードし
なきゃいけない。PreLoadingScreenでぴったり
#UE4 | @UNREALENGINE
.uprojectの編集
"Modules": [
{
"Name": “GameModule",
"Type": "Runtime",
"LoadingPhase": "Default"
},
{
"Name": “NewGameLoadingScreen",
"Type": "ClientOnly",
"LoadingPhase": "PreLoadingScreen"
}
],
#UE4 | @UNREALENGINE
実装
#UE4 | @UNREALENGINE
インターフェイス
#UE4 | @UNREALENGINE
モジュールインターフェイス作成
class INewGameLoadingScreenModule : public IModuleInterface
{
public:
static inline INewGameLoadingScreenModule& Get()
{
// Check if newly created module is correctly Loaded
return FModuleManager::LoadModuleChecked<INewGameLoadingScreenModule>(“NewGameLoadingScreen");
}
virtual void StartInGameLoadingScreen(bool bPlayUntilStopped, float PlayTime) = 0;
virtual void StopInGameLoadingScreen() = 0;
};
#UE4 | @UNREALENGINE
モジュールインターフェイスは完了です!
簡単でしょう?
#UE4 | @UNREALENGINE
モジュールインターフェイス実装作成
virtual void StartupModule() override
{
//Load assets to display during the loading screen
LoadObject<UObject>(nullptr, TEXT("/Game/UI/T_ActionRPG_TransparentLogo.T_ActionRPG_TransparentLogo") );
if (IsMoviePlayerEnabled())
{
CreateScreen();
}
}
virtual void CreateScreen()
{
FLoadingScreenAttributes LoadingScreen;
LoadingScreen.bAutoCompleteWhenLoadingCompletes = true;
LoadingScreen.MinimumLoadingScreenDisplayTime = 20.f;
LoadingScreen.WidgetLoadingScreen = SNew(SRPGLoadingScreen);
// Set up created loading screen UI and and movie to display in Slate
GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
}
};
#UE4 | @UNREALENGINE
UI
#UE4 | @UNREALENGINE
Slateとは
● アンリアルのカスタム仕様の UI プログラミングフレームワークの名称です
● エディタ インターフェースはスレートを使ってビルドされる
#UE4 | @UNREALENGINE
Slate Widget実装
class SNewGameLoadingScreen : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SNewGameLoadingScreen) {}
SLATE_END_ARGS()
void Construct(const FArguments& InArgs)
{
static const FName LoadingScreenName(TEXT(“ImagePathThere"));
LoadingScreenBrush = MakeShareable(new FLoadingScreenBrush(LoadingScreenName, FVector2D(1024, 256)));
FSlateBrush *BGBrush = new FSlateBrush();
// Creation of the ChildSlot in Slate
ChildSlot[...];
}
}
#UE4 | @UNREALENGINE
ChildSlot実装
ChildSlot
[
SNew(SOverlay)
+ SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SBorder)
.BorderImage(BGBrush)
]
+SOverlay::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SNew(SImage)
.Image(LoadingScreenBrush.Get())
]
+SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SVerticalBox)
+SVerticalBox::Slot()
.VAlign(VAlign_Bottom)
.HAlign(HAlign_Right)
.Padding(FMargin(10.0f))
[
SNew(SThrobber)
.Visibility(this,
&SRPGLoadingScreen::GetLoadIndicatorVisibility)
]
]
];
#UE4 | @UNREALENGINE
ChildSlotについて
書き方がおかしく見えるかもしれませんが、実は、正しいC++ですよ。
+SOverlay::Slot()はオペレターオバーロードです。
なれたら、読みやすくなります!
詳細はhttps://wiki.unrealengine.com/Slate,_Helloまで!
#UE4 | @UNREALENGINE
モジュール実装作成
class FActionRPGLoadingScreenModule : public IActionRPGLoadingScreenModule
{
virtual void StopInGameLoadingScreen() override
{
FLoadingScreenAttributes LoadingScreen;
LoadingScreen.bAutoCompleteWhenLoadingCompletes = !bPlayUntilStopped;
LoadingScreen.WidgetLoadingScreen = SNew(SRPGLoadingScreen);
// Set up created loading screen UI and and movie to display in Slate
GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
}
virtual void CreateScreen()
{
FLoadingScreenAttributes LoadingScreen;
LoadingScreen.bAutoCompleteWhenLoadingCompletes = true;
LoadingScreen.MinimumLoadingScreenDisplayTime = 20.f;
LoadingScreen.WidgetLoadingScreen = SNew(SRPGLoadingScreen);
// Set up created loading screen UI and and movie to display in Slate
GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
}
};
#UE4 | @UNREALENGINE
あれ?非同期のロジックがなくない??!
と思いますよね。
#UE4 | @UNREALENGINE
と思いますよね。
実は、あります。
#UE4 | @UNREALENGINE
Slateは、別スレッドで動いています。
#UE4 | @UNREALENGINE
スレッドと非同期で何をする?
● MoviePlayerがSlateThreadで動いています。
● 実装はRuntimeMoviePlayerPrivateMoviePlayerThreading.cpp
● 是非、ブレークポイントを入れてフローを詳しく見て下さい。
#UE4 | @UNREALENGINE
void FSlateLoadingSynchronizationMechanism::Initialize()
{
check(IsInGameThread());
ResetSlateDrawPassEnqueued();
SetSlateMainLoopRunning();
MainLoop.Lock();
FString ThreadName = TEXT("SlateLoadingThread");
ThreadName.AppendInt(LoadingThreadInstanceCounter.Increment());
// Create new thread
SlateRunnableTask = new FSlateLoadingThreadTask( *this );
SlateLoadingThread = FRunnableThread::Create(SlateRunnableTask, *ThreadName);
}
#UE4 | @UNREALENGINE
ロード画面完了!
#UE4 | @UNREALENGINE
Q&A

More Related Content

PDF
UE4で作成するUIと最適化手法
PPTX
UE4ローカライズ事例 (UE4 Localization Deep Dive)
PDF
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
PDF
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
PPTX
[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)
PPTX
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
PDF
UE4で作成するUIと最適化手法
UE4ローカライズ事例 (UE4 Localization Deep Dive)
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>

What's hot (20)

PDF
UE4における大規模レベル実装ワークフローとブループリント活用事例
PDF
60fpsアクションを実現する秘訣を伝授 解析編
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
PPTX
猫でも分かる UE4のAnimation Blueprintの運用について
PDF
[UE4]マテリアルの注意すべきこと!~テクスチャロードとSwitch~
PDF
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
PDF
UE4 アセットロード周り-アセット参照調査-
PDF
UE4におけるエフェクトの為のエンジン改造事例
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
PDF
[CEDEC+KYUSHU 2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介! + UE4.18 モバイ...
PPTX
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
PDF
UE4 LODs for Optimization -Beginner-
PDF
[UE4]自動テストでもっと楽したい!
PPTX
大規模CSゲームにおけるライトマス運用
PDF
豚×京都 ~UE4でなろう破壊神~ (UE4 VFX Art Dive)
PDF
猫でも分かるUE4.22から入ったSubsystem
PDF
Unreal Engine 4を使って地球を衛る方法
PDF
個人製作インディーゲーム”ジラフとアンニカ” のUE4 制作事例紹介 | UNREAL FEST EXTREME 2020 WINTER
PDF
60fpsアクションを実現する秘訣を伝授 基礎編
PDF
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
UE4における大規模レベル実装ワークフローとブループリント活用事例
60fpsアクションを実現する秘訣を伝授 解析編
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
猫でも分かる UE4のAnimation Blueprintの運用について
[UE4]マテリアルの注意すべきこと!~テクスチャロードとSwitch~
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
UE4 アセットロード周り-アセット参照調査-
UE4におけるエフェクトの為のエンジン改造事例
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
[CEDEC+KYUSHU 2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介! + UE4.18 モバイ...
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
UE4 LODs for Optimization -Beginner-
[UE4]自動テストでもっと楽したい!
大規模CSゲームにおけるライトマス運用
豚×京都 ~UE4でなろう破壊神~ (UE4 VFX Art Dive)
猫でも分かるUE4.22から入ったSubsystem
Unreal Engine 4を使って地球を衛る方法
個人製作インディーゲーム”ジラフとアンニカ” のUE4 制作事例紹介 | UNREAL FEST EXTREME 2020 WINTER
60fpsアクションを実現する秘訣を伝授 基礎編
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
Ad

Similar to 非同期ロード画面 Asynchronous Loading Screen (8)

PPTX
猫でもわかるUnreal Engine4
PDF
【UE4.25 新機能】ロードの高速化機能「IOStore」について
PDF
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
PDF
【Unite 2018 Tokyo】エディター拡張マニアクス2018
PDF
Unityではじめるオープンワールド制作 エンジニア編
PDF
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
PPTX
Python / BlueprintによるUnreal Engineの自動化 / GTMF2019
PDF
中高校生対象プログラミング講座Part1
猫でもわかるUnreal Engine4
【UE4.25 新機能】ロードの高速化機能「IOStore」について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
【Unite 2018 Tokyo】エディター拡張マニアクス2018
Unityではじめるオープンワールド制作 エンジニア編
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
Python / BlueprintによるUnreal Engineの自動化 / GTMF2019
中高校生対象プログラミング講座Part1
Ad

More from エピック・ゲームズ・ジャパン Epic Games Japan (20)

PDF
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
PDF
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
PDF
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
PDF
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1
PDF
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
PDF
UE4を使った映像制作 (UE4 Character Art Dive Online)
PDF
Hair Groom入門 (UE4 Character Art Dive Online)
PDF
UE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive Online
PDF
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
PDF
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
PDF
Unreal Engineでのコンフィギュレーター制作と映像制作 UNREAL FEST EXTREME 2021 SUMMER
PDF
バレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏 UNREAL FEST EXTREME 2021 SUMMER
PDF
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
PDF
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
PDF
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMER
PDF
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
PDF
オンラインで同期した100体の巨大生物から地球を衛る方法 UNREAL FEST EXTREME 2021 SUMMER
PDF
MetaHumanサンプル解体新書 UNREAL FEST EXTREME 2021 SUMMER
PDF
Twinmotion 2021とAEC分野向けソリューションのご紹介
PDF
UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4を使った映像制作 (UE4 Character Art Dive Online)
Hair Groom入門 (UE4 Character Art Dive Online)
UE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive Online
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
Unreal Engineでのコンフィギュレーター制作と映像制作 UNREAL FEST EXTREME 2021 SUMMER
バレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏 UNREAL FEST EXTREME 2021 SUMMER
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMER
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
オンラインで同期した100体の巨大生物から地球を衛る方法 UNREAL FEST EXTREME 2021 SUMMER
MetaHumanサンプル解体新書 UNREAL FEST EXTREME 2021 SUMMER
Twinmotion 2021とAEC分野向けソリューションのご紹介
UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)

非同期ロード画面 Asynchronous Loading Screen