분류 전체보기
-
[Effective Modern C++] std::atomic VS volatileC++/Effective Modern C++ 2023. 5. 12. 18:32
volatile과 std::atomic은 서로 다른 기능을 하는 도구입니다. 그러나 두 도구 모두 변수에 특정 속성을 부여하고, 최적화, 동기화와 관련된 도구이다보니 그 사용처가 혼동되고는 합니다. 이번 글에서는 두 도구의 차이를 중점적으로 살펴보도록 하겠습니다. 1. RMW(Read-Modify-Write) operation 더보기 다음 예제를 보도록 하겠습니다. std::atomic ai(0); // ai = 0 ai = 10; // ai = 10 ++ai; // ai = 11 --ai; // ai = 10 위 코드의 std::atomic객체 ai에 대한 연산에 대하여, 관측 가능한 ai의 값은 주석과 동일한 0, 10, 11입니다. std::atmoic객체는 객체에 대한 연산을 원자적으로 (더 이상..
-
[Effective Modern C++] 스레드 간 단발성 이벤트 통신C++/Effective Modern C++ 2023. 5. 4. 15:59
프로그램의 이벤트를 분류하는 방법으로, 이벤트의 반복성을 들 수 있습니다. 프로그램 전반에 걸쳐서 주기적으로 발생하는 이벤트가 있는가 하면, 한 번 발생 이후 소멸하는 이벤트가 있습니다. 단발성 이벤트 경우, 대부분 이벤트의 발생 조건이 되는 트리거가 있습니다. 프로그램의 구조 상, 이벤트는 발생 조건이 되는 트리거의 감지와, 이후 실행하는 작업을 분리하는 것이 유용한 경우가 있습니다. 예를 들면 자료구조의 초기화, 계산 과정 중 특정 단계의 완료, 센서 임계값 감지 등이 있을 수 있습니다. 이번 글에서는 위와 같은 단발성 이벤트가 이벤트의 감지와 실행이라는 두 이벤트로 분리되어 있다고 할 때, 해당 이벤트들의 통신 방법에 대하여 살펴보도록 하겠습니다. 이번 글에서는, 이벤트의 트리거를 감지하는 과제를 ..
-
[Unreal Engine] Line traceUnreal Engine 5._ 2023. 4. 28. 18:19
이번 글에서는 언리얼 엔진에서 직선적인 트레이싱을 수행하는 함수에 대해 알아보도록 하겠습니다. 이번 글의 예제는 다음과 같은, 언리얼 엔진의 1인칭 기본 템플릿이 사용됩니다. 1. 결과 미리보기 더보기 이번 글은 위와 같이, 간단한 레드 닷 효과를 구현합니다. 2. Blueprint : Line Trace By Channel 더보기 블루프린트에서의 구현은 다음과 같습니다. Line Trace By Channel 노드를 통해, 시작점과 끝점을 지정하여 직선 트레이싱을 수행할 수 있습니다. 3. C++ : UKismetSystemLibrary::LineTraceSingle 더보기 Blueprint를 C++로 구현하면 다음과 같습니다. FirstPersonCharacter.h ... class AFirstPe..
-
[Effective Modern C++] std::future의 소멸자C++/Effective Modern C++ 2023. 4. 19. 15:24
std::thread인스턴스는 소멸자 호출 시, 인스턴스의 join여부에 따라 행동이 갈라집니다. 이에 대한 자세한 내용은 이전 글 (std::thread를 unjoinable하게 만들어야 하는 이유)에 서술되어 있습니다. joinable한 std::thread인스턴스의 소멸자가 호출되면 프로그램이 종료되며, 이는 이것이 가장 최선의 대응이기 때문이라는 내용이었습니다. 이번 글은 std::thread외에 동시성 프로그래밍에 사용되는 std::future객체의 소멸자에 대하여 살펴보도록 하겠습니다. 1. std::future의 결과 저장 더보기 std::future객체는 피호출자 (std::future객체)가 호출자(std::async등의 함수를 지정하는 코드)에게 결과를 전송하는 통신 채널이라고 볼 수 ..
-
[Effective Modern C++] std::thread를 unjoinable하게 만들어야 하는 이유C++/Effective Modern C++ 2023. 4. 14. 15:25
std::thread객체는 현재 상태에 따라 두 종류로 구분이 가능합니다. Joinable : 실행 중(Running)이거나, 실행 중 상태로 전이할 수 있는 스레드입니다. Unjoinable : Joinable하지 않은 스레드입니다. Unjoinable상태는 다음과 같은 경우가 있습니다. 기본 생성된 std::thread는 실행할 함수가 없기 때문에 joinable하지 않습니다. std::thread는 복사할 수 없는 객체이기 때문에, 이동 후 원본 std::thread는 joinable하지 않습니다. join 및 detach된 std::thread는 joinable하지 않습니다. std::thread의 joinable 상태를 면밀히 점검하는 것은 매우 중요합니다. 이번 글에서는 std::thread의..
-
[Unreal Engine] Control game speed (Time Dilation)Unreal Engine 5._ 2023. 4. 6. 07:48
게임의 속도를 조절하는 방법을 알아보도록 하겠습니다. 1. AWorldSettings 더보기 첫 번째 방법은 AWorldSettings에 구현된 함수를 이용하는 것 입니다. 간단하게, 다음과 같은 구현을 사용할 수 있습니다. GetWorld()->GetWorldSettings()->SetTimeDilation({float variable}); 위 코드는 UWorld에서 AWorldSetting을 가져와서 SetTimeDilation을 호출하는 코드입니다. 위와 같은 코드의 결과로, 레벨의 속도가 인자로 전달한 variable배속이 됩니다. 1.0일 경우 1배속 (정상 속도), 2.0일 경우 2배속이 되는 방식입니다. 현재 게임의 속도를 확인하는 방법은 아래와 같습니다. GetWorld()->GetWorl..
-
[Effective Modern C++] std::async의 launch policy (std::launch)C++/Effective Modern C++ 2023. 3. 28. 14:33
지난 글 (std::thread와 std::async)에서 동시성 프로그래밍을 위해 사용되는 두 기능을 살펴보았습니다. 몇몇 예외 상황을 제외하고, 여러 편의성을 이유로 std::async가 더 좋다는 내용이었습니다. 지난 글의 예제에서는 std::async를 다음과 같이 호출했습니다. auto fut = std::async(function); 하지만 이런 호출에 대하여, function함수가 비동기적으로 바로 실행된다는 보장이 없습니다. 이번 글에서는 std::async의 작동 방식에 대하여 살펴보도록 하겠습니다. 1. std::launch 더보기 std::async는 의미론적으로는 지정 객체를 비동기적으로 호출하는 의미이지만, 실제로는 그렇지 않습니다. std::async는 특정한 실행 방침 (lau..