๋ชฉ๋ก์ ์ฒด ๊ธ (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b77e86/btrAbLB4huT/coceP8wUJlhWjH9xUUKTtk/img.jpg)
UPoseableMeshComponent ์ธ๋ฆฌ์ผ์์ GhostTrail ๋ฑ์ ๊ตฌํํ ๋, UPoseableMeshComponent ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. UPosebleMeshComponent ๋ ๋ฌด์์ผ๊น? ๋จผ์ ์ ์๋ก ๋์ด๊ฐ๋ณด๋ฉด, /** *UPoseableMeshComponent that allows bone transforms to be driven by blueprint. */ UCLASS(ClassGroup=Rendering, hidecategories=(Object,Physics), config=Engine, editinlinenew, meta=(BlueprintSpawnableComponent)) class ENGINE_API UPoseableMeshComponent : public ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bWVThp/btrzZ3vON3z/S4V60H79Whzhsk3lypaK5K/img.png)
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ThreadPool ๊ฐ๋จ ์์ฝ ThreadPool ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์ ์ ์ถ๊ฐํ๋ฉด, ์ฐ๋ ๋ํ์ ์๋ ์ฐ๋ ๋๊ฐ ์ด๋ฅผ ๋งก์ ์์ ํ๊ฒ ๋๋ค. ์ด ๊ธ์์๋ ์ฐ๋ ๋์ ์๋ก์ด ์์ ์ ์ถ๊ฐํ๋ ์ผ์ queue ๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ค. ์ด๊ณณ์ ๊ตฌํ์ ๊ธฐ์ด๋ก ํ์ฌ ์์ฑํ๋ค. ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์์ ์ค์ด์ด๋ ์๋ก์ด ์์ ์ ์ถ๊ฐํด๋ ์๊ด์๋ค! ํด๋์ค ์ค๊ณํ๊ธฐ ๋จผ์ ์ฐ๋ ๋๋ค์ ๋ณด๊ดํ ์ปจํ ์ด๋๊ฐ ํ์ํ๋ค. // ์ด Worker ์ฐ๋ ๋์ ๊ฐ์. size_t num_threads_; // Worker ์ฐ๋ ๋๋ฅผ ๋ณด๊ดํ๋ ๋ฒกํฐ. std::vector worker_threads_; ํธ์์, ์ฐ๋ ๋ํ์์ ๋์๊ฐ๋ ์ฐ๋ ๋๋ค์ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pxWqp/btrzRnn4Bx7/5V4QAFXYcalGCHeLjhY620/img.png)
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ๋๊ธฐ์ ๋น๋๊ธฐ C++ ์ฝ๋๋ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ์ ์ฝ๊ณ , ์ฝ์ ํ์ผ๋ก ์ด๋ค ์์ ์ ํ๊ณ , ๋ง์ง๋ง์ผ๋ก ํ์ผ๊ณผ ๊ด๊ณ์๋ ์์ ์ ์ํํ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ด ๊ฒฝ์ฐ, ํ์ผ๊ณผ ๊ด๊ณ์๋ ์์ ์ ํ๊ธฐ ์ํด ํ์ผ์ ์ฝ๊ธฐ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ง์ฐ ์๊ฐ์ด ์กด์ฌํ๋ค. ์ด์ ์ ๋ฐฐ์ด ์ฐ๋ ๋๋ฅผ ์ด์ฉํ๋ฉด ์ด ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ๊พธ์ด ์ค ์๋ ์๋ค. void file_read(string* result) { string txt = read("a.txt"); *result = do_something_with_txt(txt); } int main() { string result; t..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ck5l7g/btrzPfCsFk6/HjtfpK4tGkVOq1ngbju1ek/img.png)
AttachedActors vs ChildActors ๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ชจ ์กํฐ์ ๋ถ์ฐฉ๋ ์กํฐ๋ค์ ์ญ์ ํ๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๋ง์ฝ ํ์ฌ ์กํฐ์ ์์์ผ๋ก ์ค์ ๋ ActorComponent ๋ค์ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ์กฐํํ ์ ์๋ค. TArray tempChildActors; AActor* owner = GetOwner(); // SomeChildActor->SetOwner(this); ๊ฐ ์ด๋์ ๊ฐ ์คํ๋์๋ค๊ณ ๊ฐ์ owner->GetAllChildActors( tempChildActors, true ); uint32 count = tempChildActors.Num(); ํ์ง๋ง ์์ ๊ฐ์ ๊ฒฝ์ฐ๋, ๋ฌด๊ธฐ๋ฅผ ์บ๋ฆญํฐ์ ์์ผ์ ๋ถ์ฐฉ (AttachToComponent) ํ๋ ๊ฒฝ์ฐ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bz3jhl/btrzLwyy9E2/JlSKvLcnYXrBeszpIqMFZk/img.png)
์ค๋ธ์ ํธ ์์ฑ ๋ฐ ์ ์ ๋ถ๋ฌ์ค๊ธฐ ์ธ๋ฆฌ์ผ์์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ ์ ์ ์ ๋ถ๋ฌ์ฌ ๋๋ ๋ณดํต CreateDefaultSubobject ๋ก CDO ๋ฅผ ๋ง๋ค์ด ์ค ๋ค์, ConstructorHelpers::FObjectFinder ๋ก ์ ์ ์ ์ฐ๊ฒฐ์์ผ ์ค๋ค. ์ด ๊ณผ์ ์ ๋จ์ถ์์ผ์ฃผ๋ Helper Function ์ ๋ง๋ค์ด ์ฌ์ฉํด ๋ณด์. CHelpers.h #pragma once #include "CoreMinimal.h" #include "Components/SkeletalMeshComponent.h" #include "Kismet/GameplayStatics.h" #include "Particles/ParticleSystem.h" #include "NiagaraSystem.h" #include "NiagaraFun..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QvG6e/btrzPgOCELk/CThkS2AhxeDp59KxRUzOFK/img.png)
ํ๋ฉด์ ์ถ๋ ฅํ๋ ๋ก๊น ์์คํ ์ฝ์์ ์ถ๋ ฅํ๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ, ์ด๋ฒ์๋ UE_LOG ๊ฐ ์๋ AddOnScreenDebugMessage ํจ์๋ฅผ ํ์ฉํด ํ๋ฉด์ ๊ฐ์ ์ถ๋ ฅํด๋ณด์. ์ถ์ฒ๋ ์ฌ๊ธฐ! CLog.h class UE_PROJECT_NAME_API CLog { public: static void Print(int32 InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(float InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FString& I..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTV5ok/btrzMvL285M/WchF8cOoNOgneXGhrLQkk0/img.png)
์ธ๋ฆฌ์ผ ๋ก๊ทธ ์ธ๋ฆฌ์ผ์ UE_LOG ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค. ๋จผ์ , .h ํ์ผ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ , ๊ทธ์ ๋ง๋ ์ ์๋ฅผ .cpp ํ์ผ์์ Define ํด์ฃผ๋ฉด ๋๋ค. MyGame.h //General Log DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All); //Logging during game startup DECLARE_LOG_CATEGORY_EXTERN(LogMyGameInit, Log, All); MyGame.cpp #include "MyGame.h" //General Log DEFINE_LOG_CATEGORY(LogMyGame); //Logging during game startup DEFINE_LOG_CATEGORY(LogMyGameInit); ํค๋..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dxZNKo/btrukfHF2uu/dKZxUhyQ1Kn9gojkPzDKH0/img.png)
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ํ์ดํ๋ผ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํ์. int a = 0; int b = a + 1; a = 1; ์ง๊ด์ ์ผ๋ก๋ b = a + 1 ์ด a = 1 ๋ณด๋ค ๋จผ์ ์คํ๋ ๊ฒ ๊ฐ์ง๋ง, ์ปดํ์ผ๋ฌ๊ฐ ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ก ๋ฒ์ญํ ๊ฒ์ ๋ณด๋ฉด a = 1 ์ด ๋ ๋จผ์ ์คํ๋๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก b ์ a ์๋ ๊ฐ๊ฐ 1์ด๋ผ๋ ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ์ง๋ง, ์ปดํ์ผ๋ฌ๋ ์์ ์ ํจ์จ์ฑ์ ์ํด ์ฝ๋์ ์คํ์์๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ด๋ฅผ ํ์ดํ๋ผ์ด๋์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ ์ต์ ํ๋ฅผ ์ํด ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐฐ์นํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. ์์ ์์(Modification Order) ๋ช ๋ น์ด๋ฅผ ๋ค์ฃฝ๋ฐ์ฃฝ์ผ๋ก ์คํํ๋๋ฐ๋ ์ด๋ป๊ฒ ์ ๋๋ก..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bSCXaa/btrul29e0yU/ZXD1S1gIMTfkFNUkKEPOb1/img.png)
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! Race Condition ์๋ก ๋ค๋ฅธ ์ฐ๋ ๋์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ฒฝ์ ์ํ(race condition) ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด์. #include #include #include void worker(int& counter) { for (int i = 0; i < 10000; i++) { counter += 1; } } int main() { int counter = 0; std::vector workers; for (int i = 0; i < 4; i++) { // ๋ ํผ๋ฐ์ค๋ก ์ ๋ฌํ๋ ค๋ฉด ref ํจ์๋ก ๊ฐ์ธ์ผ ํ๋ค (์ง๋ ๊ฐ์ข bind ํจ์ ์ฐธ์กฐ) ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bxmAIr/btrrLM2BGVw/VvlZmyCAlOkDtBsfEvnkQK/img.png)
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ํ๋ก์ธ์ค์ ์ฐ๋ ๋ CPU ์ฝ์ด์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ ๋จ์๋ฅผ ์ฐ๋ ๋(Thread) ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฆ, CPU ์ ์ฝ์ด ํ๋์์๋ ํ ๋ฒ์ ํ ๊ฐ์ ์ฐ๋ ๋์ ๋ช ๋ น์ ์คํ์ํค๊ฒ ๋๋ค. ํ๋ก์ธ์ค๋ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ก ์ด๋ฃจ์ด์ง๋๋ฐ, ํ๋ก์ธ์ค์ ์ฐ๋ ๋์ ์ฐจ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋๋ ํ์ง ์๋๋์ ์ฐจ์ด์ด๋ค. ๊ฐ ์ฝ์ด์์๋ ์ฝ์ด๊ฐ ๋์๊ฐ๋๋ฐ, ์ปจํ ์คํธ ์ค์์นญ (Context Switching) ์ ํตํด ์ฐ๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํ๋๋ค. ๋ณ๋ ฌํ(Parallelizable) ๊ฐ๋ฅํ ์์ ์ฐ๋ ๋๋ฅผ ์ด์ฉํด ๋ณ๋ ฌํ๋ฅผ ์ ์ฉํ๋ฉด ๋์ฑ ๋น ๋ฅธ ์์ ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ํผ๋ณด๋์น ์์ด์ ๊ตฌํ๋..