4.6が日本語でクラッシュする?この方法で対策出来ます!

新しいランタイムフォントシステム(日本語などのキャラクターが多い言語をもっとよく対応する為に追加したシステム)にあるFCharacterList::GetKerning()の関数の中にクラッシュがあります。

この原因で一番めんどくさい現象は、4.6で新しいプロジェクトをThird Personなどのテンプレートにベースして、Starter Contentを含んで作成しようとするとクラッシュすることです。そして前のバージョンで作ったそのようなプロジェクトに似ているプロジェクトを「コピーを開く」しようとするとクラッシュすることもあります。

このクラッシュは以下の3つのチェンジに既に修正してありますが、このチェンジはUE4.6の為にブランチした後にコミットした物ですので、4.6に含んでいません。

Fixed crash in FCharacterList::GetKerning
Fixed crash in FSlateFontMeasure::MeasureStringInternal.
Fixed crash in FSlateElementBatcher::AddTextElement

(そのリンクをアクセスする為にUEサブスクリプションアカウントとリンクされているGitHubアカウントでログインする必要があります。)

とりあえず、以下の3つの対策の中の1つを使えるとこのクラッシュを防げます:

  1. プロジェクトを作成・「コピーを開く」時に一旦英語に戻してからやること
  2. 前のバージョンのプロジェクトの「コピーを開く」オプションを使うことの代わりにWindows ExplorerやMacのFinderで手動プロジェクトをコピーして、そのコピーを「同じフォルダで変換」するオプションの使用
  3. 上記にある3つのコードチェンジをマージすること

このバグはアジアのフォントに関する物ですので、これ以外の場合にも発生している可能性が十分あると思いますので、4.6.1をリリースするか3つのチェンジをローカルでマージする前に、別の場所でも出ると思います。

ご迷惑をかけて申し訳ございませんが、よろしくお願いします!

コールスタックは以下の感じです。他の再現ステップで似ているクラッシュがありましたら、このスレッドに再現ステップをコメント出来ますと幸いです。


UE4Editor_SlateCore! FCharacterList::GetKerning() + 19 bytes fontcache.cpp:967 
UE4Editor_SlateCore! FSlateFontMeasure::MeasureStringInternal() + 1343 bytes fontmeasure.cpp:205 
UE4Editor_SlateCore! FSlateFontMeasure::Measure() + 174 bytes fontmeasure.cpp:59 
UE4Editor_UnrealEd! SSlowTaskWidget::GetMainTextFont() + 340 bytes feedbackcontexteditor.cpp:232 
UE4Editor_UnrealEd! TMemberFunctionCaller<SSlowTaskWidget,FSlateFontInfo (__cdecl SSlowTaskWidget::*)(void)const __ptr64>::operator()<>() + 48 bytes delegateinstanceinterface_variadics.h:161 
UE4Editor_UnrealEd! TTupleImpl<TIntegerSequence<> >::ApplyAfter_ExplicitReturnType<FSlateFontInfo,TMemberFunctionCaller<SSlowTaskWidget,FSlateFontInfo (__cdecl SSlowTaskWidget::*)(void)const __ptr64> >() + 25 bytes tuple.h:113 
UE4Editor_UnrealEd! TBaseSPMethodDelegateInstance<1,SSlowTaskWidget,0,FSlateFontInfo __cdecl(void)>::Execute() + 89 bytes delegateinstancesimpl_variadics.inl:283 
UE4Editor_Slate! TBaseDelegate<FSlateFontInfo>::Execute() + 26 bytes delegatesignatureimpl_variadics.inl:439 
UE4Editor_Slate! TAttribute<FSlateFontInfo>::Get() + 56 bytes attribute.h:135 
UE4Editor_Slate! STextBlock::GetFont() + 38 bytes stextblock.cpp:43 
UE4Editor_Slate! STextBlock::GetComputedTextStyle() + 81 bytes stextblock.cpp:261 
UE4Editor_Slate! STextBlock::ComputeDesiredSize() + 44 bytes stextblock.cpp:189 
UE4Editor_SlateCore! SWidget::CacheDesiredSize() + 23 bytes swidget.cpp:370 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_SlateCore! SWidget::SlatePrepass() + 163 bytes swidget.cpp:358 
UE4Editor_Slate! DrawWindowPrepass() + 550 bytes slateapplication.cpp:956 
UE4Editor_Slate! FSlateApplication::DrawPrepass() + 87 bytes slateapplication.cpp:973 
UE4Editor_Slate! FSlateApplication::PrivateDrawWindows() + 471 bytes slateapplication.cpp:1023 
UE4Editor_Slate! FSlateApplication::Tick() + 2946 bytes slateapplication.cpp:1263 
UE4Editor_UnrealEd! TickSlate() + 204 bytes feedbackcontexteditor.cpp:312 
UE4Editor_UnrealEd! FFeedbackContextEditor::ProgressReported() + 79 bytes feedbackcontexteditor.cpp:423 
UE4Editor_Core! FFeedbackContext::UpdateUI() + 148 bytes feedbackcontext.cpp:27 
UE4Editor_Core! FFeedbackContext::RequestUpdateUI() + 159 bytes feedbackcontext.cpp:19 
UE4Editor_Core! FFeedbackContext::UpdateProgress() + 124 bytes feedbackcontext.cpp:47 
UE4Editor_GameProjectGeneration! GameProjectUtils::DuplicateProjectForUpgrade() + 3186 bytes gameprojectutils.cpp:2048 
UE4Editor_GameProjectGeneration! SProjectBrowser::OpenProject() + 1653 bytes sprojectbrowser.cpp:1006 
UE4Editor_GameProjectGeneration! SProjectBrowser::HandleProjectItemDoubleClick() + 76 bytes sprojectbrowser.cpp:1132 
UE4Editor_GameProjectGeneration! TBaseSPMethodDelegateInstance<0,SProjectBrowser const ,0,TTypeWrapper<void> __cdecl(TSharedPtr<FProjectItem,0>)>::Execute() + 97 bytes delegateinstancesimpl_variadics.inl:283 
UE4Editor_GameProjectGeneration! TBaseSPMethodDelegateInstance<0,SProjectBrowser const ,0,void __cdecl(TSharedPtr<FProjectItem,0>)>::ExecuteIfSafe() + 90 bytes delegateinstancesimpl_variadics.inl:381 
UE4Editor_GameProjectGeneration! TBaseDelegate<void,TSharedPtr<FProjectItem,0> >::ExecuteIfBound() + 86 bytes delegatesignatureimpl_variadics.inl:507 
UE4Editor_GameProjectGeneration! SListView<TSharedPtr<FProjectItem,0> >::Private_OnItemDoubleClicked() + 63 bytes slistview.h:692 
UE4Editor_GameProjectGeneration! STableRow<TSharedPtr<FProjectItem,0> >::OnMouseButtonDoubleClick() + 223 bytes stablerow.h:180 
UE4Editor_Slate! <lambda_58ede244782f1e594383d45514e1d7c8>::operator()() + 30 bytes slateapplication.cpp:3790 
UE4Editor_Slate! FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FPointerEvent,<lambda_58ede244782f1e594383d45514e1d7c8> >() + 189 bytes slateapplication.cpp:208 
UE4Editor_Slate! FSlateApplication::ProcessMouseButtonDoubleClickEvent() + 473 bytes slateapplication.cpp:3791 
UE4Editor_Slate! FSlateApplication::OnMouseDoubleClick() + 299 bytes slateapplication.cpp:3772 
UE4Editor_Core! FWindowsApplication::ProcessDeferredMessage() + 3036 bytes windowsapplication.cpp:1303 
UE4Editor_Core! FWindowsApplication::DeferMessage() + 299 bytes windowsapplication.cpp:1657 
UE4Editor_Core! FWindowsApplication::ProcessMessage() + 3483 bytes windowsapplication.cpp:742 
UE4Editor_Core! FWindowsApplication::AppWndProc() + 98 bytes windowsapplication.cpp:604 
user32! UserCallWinProcCheckWow() + 429 bytes 
user32! DispatchMessageWorker() + 949 bytes 
UE4Editor_Core! FWindowsPlatformMisc::PumpMessages() + 118 bytes windowsplatformmisc.cpp:774 
UE4Editor! FEngineLoop::Tick() + 3434 bytes launchengineloop.cpp:2193 
UE4Editor! GuardedMain() + 479 bytes launch.cpp:131 
UE4Editor! GuardedMainWrapper() + 26 bytes launchwindows.cpp:126 
UE4Editor! WinMain() + 249 bytes launchwindows.cpp:202 
UE4Editor! __tmainCRTStartup() + 329 bytes crtexe.c:618 

今まで見つけた再現ステップ:

Convert Project Crash

  1. Open UE 4.5 editor and set language to Japanese and restart editor
  2. Create a new project from Third Person template
  3. Include starter content
  4. Close UE 4.5
  5. Open UE 4.6 editor and set language to Japanese and restart
  6. Select project you just created to open in 4.6
  7. When asked how to convert, choose “Create a copy”
  8. Observe crash

New project crash

  1. Open UE 4.6 and set language to Japanese and restart
  2. Create a new project from Third Person template
  3. Include starter content
  4. Observe crash after hitting “create”

Hi all,

This issue can be fixed by applying latest QFE, found here:

https://forums.unrealengine.com/showthread.php?3147-Current-Available-Quick-Fix-Solutions

Hope that helps!