C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

C++

std::mutex vs. boost::mutex (1.71.0) vs. Windows CRITICAL_SECTION with VS2019 and Windows 10

現在の Windows 10 で Visual Studio 2019 の C++ プロジェクトので一般的に採用しやすい Mutex の各種の実装の実効速度的な優位性についてのメモです。特に結論とかべき論を展開する気はないのであくまでも参考程度に図ってみたらこういう結果になる事もあ…

Visual Studio 2019/C++: ファイル単位で設定された Configuration はどこにあるかのメモ

このメモを残した経緯 保守性の視点では使わない方がよいのですが、諸事情によりファイル単位で Configuration を施される事はしばしばあります。そして、プロジェクトの責任者が変わり、ドキュメントにも注意が残されず、ファイル単位で特殊な Configuratio…

VS2019/C++: stdafx.h stdafx.cpp または pch.h pch.cpp つまり「プリコンパイル済みヘッダー」( Precompiled Headers ) の使い方のメモ

このメモの経緯 VSのPCH(PreCompiled Headers)機能は "使うためにユーザーがする事" はもうたぶん20年以上昔から変わっていないと思うので "いまさら" なのですが、ぼちぼち使い方がおかしくてビルド時間を無駄にしているプロジェクトに関わります。そこで、…

C++/Windows: WinMain/wWinMain な Windows デスクトップ向けアプリで std::cout / std::wcout とかをコンソールに直接出したいときのメモ

Visual Studio で Windows デスクトップアプリを作る場合は WinMain / wWinMain がエントリーポイントのプロジェクトを扱うのが一般的です。コンソールアプリとして作って GLFW から画面を出したり imgui でGUIを作ったり、コンソールアプリの実行時に Win32…

Visual Studio 2019 C++: Configuration に「絵文字」を使える、というメモ

この画面写真↑には3つの構成(Configuration)が含まれています: Debug Release tmp exp hoge 絵文字/everywhere です。上手く使うと構成が多数あったり、似た構成がある場合の間違い防止効果を期待した使い方もできそうです。 全ての表示がUNICODE絵文字に…

Visual Studio 2019 C++: _DEBUG _WINDOWS _WIN32 _WIN64 _UNICODE NDEBUG WIN32 WIN64 UNICODE のメモ

シンボル 自動的に定義される?(predefined macro?) VSが新規作成で構成に追加? そもそも何? 効果ある?(*2) _DEBUG yes ( msbuild ) yes ( Debug ) デバッグビルドを意味する識別用にmsbuild がプロジェクトの Configuration -> Advanced -> Use Debug Li…

UE4/C++: USoundWave と USoundCue または何れにせよ USoundBase でいいやのメモ

UE4 プロジェクト内のアセット化された「なにか」を C++ コードの ctor で拾いたい場合には以下のようにする、するのだが…: #include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h" // どこかの UObject 系の ctor でプロジェクト内のアセット…

UE4/C++/BP: UGameplayStatics::OpenLevel の Options が ? に化ける怪異、あるいは UEngine::SetClientTravel のパラメーターの本当の意味について

次のコードあるいは相当のBPは期待とは異なる動作を招くかもしれない。 UGameplayStatics::OpenLevel ( GetWorld() , TEXT( "Sushi" ) , true , TEXT( "#Tako" ) ); 『このようなレベルの開き方をした場合、開かれたレベルでは AGameMode::OptionsString が …

UE4/C++: UEDirectInputPadPlugin を Fork してにゃんにゃん

katze_7514 さんの UEDirectInputPadPlugin を Fork して でにゃんにゃんしました。 Fork 先: usagi/UEDirectInputPadPlugin Fork 元: katze7514/UEDirectInputPadPlugin UE4 には 4.15 以降は標準で Windows RawInput Plugin が入りましたが、 軸の入力値が…

UE4/C++: NewObject で生成したオブジェクトの Outer を変更したい場合のメモ

↓こういうのが居たとする。 // UObject 派生だがシングルトンファクトリーで生成されるオブジェクトがあったとする UA* UA::GetInstance() { if ( ! my_static_instance ) my_static_instance = NewObject< UA >(); return my_static_instance; } このような…

UE4/C++: ジェネリック・プラットフォーム・罠ビリティー

諸事情により UE4 でゲームではない何かを開発したりユカイなマルチプロセスのゲームを作ったりすると プロセスID を取得したくなるかもしれない。わたしはなった。 UE4 にはそんな時に便利そうな FGenericPlatform::GetCurrentProcessId がある プロセスID…

UE4/C++: C++er がUE4型のシングルトンを作る際に気をつける事

「UE4 にはガベージコレクションがある。しかし特に C++er は正しい実装を過剰に気に掛ける必要がある。」 UE4Editor から GUI でも設定できる GameSingletonClass, GameInstance を使う場合は気にする必要は無い。今回はその仕組みを使わない場合の話。 UOb…

UE4/C++: USaveData 系のセーブデータの Slot 群をすべて取得する方法

USaveData 派生型のセーブデータを作り UGameplayStatics::SaveGameToSlot, UGameplayStatics::LoadGameFromSlot を用いてセーブとロードを実装する手法を用いるとそれ自体の実装労力は節約できて嬉しい。しかし、これらの API は UE4 プロジェクトの開発時…

UE4/C++: AActor の Tick が来ない!・おまけ編

本編は以前書いた 「UE4/C++ Tick が来ない!そんなときのトラブルシュート備忘録」 です。今回はそのおまけ。 行動パターンで書くと「ああ、なんだ」と気づく事も多いのですが… Tick が来ない!(気づき) PrimaryActorTick.bCanEverTick = true していなか…

UE4/C++: FHttpModule で SetContentAsString して POST で投げたら落ちた時のメモ

次のようなごく簡単な FHttpModule の実装例を実行するとゲームまたは UE4Editor ごとプロセスが落ちてしまう。 TSharedRef< IHttpRequest > r = FHttpModule::Get().CreateRequest(); r->OnProcessRequestComplete().BindUObject( this, &UMyHttpTask::Hand…

UE4/C++: rapidxml を UE4 で使いたい場合の例外不使用化のメモ

1つ前の記事 「UE4/C++: 実行時に取得したドキュメントが SJIS だった時に ICU で UTF8 にしたり UTF16 で TCHAR にするメモ」 でUE4のユーザープロジェクトレベルで ICU ライブラリーを取り込んで文字コードを操作する実装のメモを書きました。この記事の執…

UE4/C++, Blueprint: UAsyncTaskDownloadImage を拡張した実装を使いたい場合にリンクが必要となる RHI と RenderCore のメモ

状況 UAsyncTaskDownloadImage はブループリントでは癖の強めの非同期処理ノード。何かを For などでループしながら DownloadImage ノードを使い OnSuccess にテクスチャーデータだけでなく何らかのインデックスなどの付加情報を引っ掛けた処理を行わせよう…

UE4/C++,Blueprint: BPへ関数のパラメーターを参照だけど入力としてノードを与えたい場合にどうするか

問題 UFUNCTION( BlueprintCallable ) static void Something1( FVector& VR , const FIntVector VC ); このような UE4/C++ で生成される Blueprint ノードは、 VC を入力ピン、 VR を出力ピンにしてしまう。 VR も入力ピンの意図で実装した場合に Blueprint…

UE4/C++: Stats ( Profiler ) 機能の組み込みと使い方メモ

Runtime/Core/Public/Stats/Stats.h で宣言・定義される Stats ( Profiler ) 機能を C++ コードに仕込んで UE4Editor のプロファイラーでお手軽に負荷など調べる方法のメモ。 仕込み // MySourceFile.h #pragma once #include "CoreMinimal.h" // 略 // MySo…

UE4/C++: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam と TArray

問題 C++ コードの実装に DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam マクロを使い、パラメーターに TArray を入れて Delay (Blueprintノード右上に時計マークの出るアレ)を経て結果を処理できる非同期動作のデータのジェネレーターを UE4 の勉強と練習…

UE4/C++: http(s) リクエストに FHttpModule 系を使う場合の OnProcessRequestComplete/FHttpRequestCompleteDelegate の成否フラグの注意どころ

UE4 の FHttpModule の OnProcessRequestComplete / FHttpRequestCompleteDelegate には若干、罠どころがある // UE4/C++ でフレームワークに用意された方法で HTTP リクエストを発行し、 // HTTP レスポンスを得て何かしたい場合のコード例 auto http = &FH…

UE4/C++: TArray 夏の怪談💀 AllocatorInstance が nullptr の巻

怪異 ↑キャッチーな画像という事ではなくて、実際にこういう事が「うっかり」で起こるので気をつけたい、という怪談です 冒頭のスクリーンショットは UE4 の Array.h ( TArray )の ResizeTo メンバー関数が呼ばれた際に AllocatorInstance メンバーが null…

UE4/C++ で lambda-expression なタスクをお手軽に非同期処理に投げる方法

// 最小限のコード例 // グラフの意味はさておき、単発のタスクを // とりあえずなんでもよいのでUE4のタスクプールに投げたい場合はこれだけでも動作する FFunctionGraphTask::CreateAndDispatchWhenReady( []{}, TStatId(), nullptr ); // 解説用に関連し…

UE4/C++: UMaterialInstanceDynamic を生成したり UPrimitive 的な何かにセットしたりするコードスニペット的なメモ

// ぱたーん1: マテリアルインスタンスダイナミックを複数の何かのマテリアルとして使いまわしたい場合 // 1.1. AActor 系のどこかなどで、とりあえずマテリアルインスタンスダイナミックをマテリアルアセットから作る: auto m = UMaterialInstanceDynamic::…

UE4/C++: 4.18 以降発生するクリップボードのAPI仕様変更に伴う警告と必要な修正

状況 FGenericPlatformMisc::ClipboardCopy または FGenericPlatformMisc::ClipboardPaste を使用している場合、UE4-4.18 以降で API の仕様変更に伴う警告が翻訳時に発生する。 warning C4996: 'FGenericPlatformMisc::ClipboardCopy': FPlatformMisc::Clip…

UE4/C++: 4.18 -> 4.19 エンジンアップデートトラブル; `UMaterialInstance::GetVectorParameterValue` の仕様変更と "Material Layers"

現行プロジェクトに必要なプラグインの 4.19 対応も進んできたので、手元のプロジェクトを 4.18 から 4.19 へエンジンアップデートしてみました。エンジンの仕様変更によるトラブルがあったので対処方法と併せて紹介します。 4.18 -> 4.19 における UMateria…

UE4/C++: JSON/XML/portable-binary 等の汎用シリアライズライブラリー cereal に UE4 の各種型を非侵入型アダプターで対応させるライブラリー cereal-UE4 を公開しました

cereal-UE4 GitHub - usagi/cereal-UE4: cereal ( C++ serialization library ) adapter for UE4 ( Unreal Engine ) types cereal について https://uscilab.github.io/cereal/ 近年モダンな C++er にしばしば使われていると思われる JSON / XML / Binary ( …

UE4: std::unordered_map だと少し面倒だけど TMap なら簡単にできる Key の書き換え

// てきとーな TMap TMap< FString, int32 > m; m.Add( "hoge", 123 ); m.Add( "fuga", 234 ); m.Add( "piyo", 345 ); // マップの対を逐次参照で列挙しつつ Key を書き換える for ( auto& p : m ) p.Key = p.Key .Replace( TEXT( "g" ), TEXT( "G" ) ) .Rep…

UE4: バイナリー配布や実行時リンク向けのライブラリーを UE4 プロジェクトへ組み入れる方法を mecab で解説

概要 UE4 のプロジェクトの C++ コードへ UE4 とは特に関係の無い一般のライブラリーをリンクするのは少々面倒な事がある。ヘッダーオンリーなライブラリー、例えば Eigen や stb あるいは Boost の一部をリンクするような場合は困らない。しかし、バイナリ…

UE4: Blueprint 向けに WorldContextObject が必要な機能を提供する際に暗黙的に WorldContextObject を扱わせられるように C++ コードで対応する方法

概要 状況の例として、 Blueprint へ特定のアクターを引っ張り出させる次のような実装を提供したいとする。 設計上必ず1つ AMySpecialActor が配置されていて、 // 定義はどうあれ、どこかに定義され1つだけは常に配置される AMySpecialSomething アクター U…