반응형

분류 전체보기 220

C++ 전역 객체 혹은 정적 객체 간의 생성 및 소멸 순서 문제

C++에서 전역 객체 혹은 정적 객체들의 생성과 소멸 순서는 따로 규칙이 정해져 있지 않습니다. C++ 전역 혹은 정적 객체 생성에 관해서 정해져 있는 것은 초기화 이전에 0으로 초기화 된다는 것 뿐입니다. 그 외에 메인의 첫 문장 실행 전에 지역 변수가 아닌 정적 변수가 초기화될 것인지 여부는 컴파일 구현에 따라 틀립니다. 이런 세세한 것을 알아야 하는 이유는 전역 혹은 정적 객체간에 직접적 혹은 간접적으로 참조를 하는 경우에 문제가 생길 수 있기 때문입니다. 한 예로 전역 변수 A가 정적 변수 B를 호출하는데 생성 및 초기화 순서에 따라 전역 변수 A는 초기화 되지 않는 정적 변수 B를 호출할 수 있습니다. 이런 경우 프로그램이 멈추거나 잘못된 값을 가지는 알 수 없는 상황이 발생하게 됩니다. 또 다..

C++ 프로그래밍 2021.12.09

[링크] 무료 효과용 사운드 파일 다운 받는 곳

개인적으로 만들고 있는 게임에 사용할 효과음을 찾아보았습니다. 무료라고 광고하지만 상업적인 사이트가 많았고 무료라도 라이센스가 비상업적 이용 같이 제한적인 사이트가 많았습니다. 그 중에서 다운로드가 무료이고 대부분이 CCA 3.0 이나 Public Domain 라이센스와 같이 상업적으로 사용할 수 있고 수정이 가능한 효과음을 제공하는 사이트를 소개할까 합니다. 저는 게임에서 사용하려고 하지만 동영상 편집하는 유튜버 분들도 이용할 수 있을거 같습니다. 해당 사이트의 일부 효과음은 비상업적 이용만 가능하니 이건 가려서 다운 받으시면 됩니다. SoundBible 무료 효과음 사이트인데 자료도 많고 인터페이스가 깔끔합니다. 효과음은 CCA 3.0이나 Public Domain 라이센스가 대부분입니다. 일부 효과음..

링크 2021.12.06

Unity 여러 개의 카메라를 이용하여 여러 개의 포스트 이펙트 적용하기

이 글에서는 여러 개의 카메라를 이용하여 여러 개의 포스트 이펙트를 적용하는 방법에 대해서 살펴보겠습니다. 위 이미지를 보면 배경은 흑백으로 되어 있고 글자는 컬러로 되어 있는 것을 볼 수 있습니다. 이 화면은 2개의 카메라를 이용하여 메인 카메라는 포스트 이펙트로 흑백 쉐이더를 적용하였고 보조 카메라는 포스트 이펙트 없이 컬러 색상 그대로 보여줍니다. 이 예제는 한 화면에 포스트 이펙트를 적용한 내용과 적용하지 않는 내용을 같이 보여줍니다. 하지만 포스트 이펙트를 적용하지 않는 카메라에 포스트 이펙트를 적용하게 되면 제목처럼 한 화면에 여러 개의 포스트 이펙트를 적용한 것이 됩니다. 여러 개의 카메라를 설정하는 방법은 아래와 같습니다. 이 예제에서는 2개의 카메라를 이용합니다. 고로 이 예제를 따라 하..

쓰레드 풀에서 CPU 사용량 줄이기

쓰레드풀에서 흔하게 사용되는 방법이 워커 쓰레드를 N개 생성하여 놓고 공유하는 작업 큐에서 데이터를 받아와 워커 쓰레드에서 실행하는 방법입니다. 이 때 작업 큐가 비었을 때 워커 쓰레드를 재워주는 처리를 해주지 않으면 CPU 사용량이 올라가게 됩니다. sleep을 해주는 것도 재운 시간에 작업 큐에 데이터가 들어왔다면 그 만큼 워커 쓰레드에서 늦게 실행하게 되어 재우는 시간도 민감하게 설정하여야 합니다. 이 때 사용할 수 있는 방법이 작업 큐에 조건 락(conditional lock)을 사용하는 것입니다. 이 방법을 바탕으로 작업 큐가 비어 있을 때만 워커 쓰레드를 재우고 작업 큐에 데이터가 들어왔을 때는 깨울 수 있습니다. 이 방법은 워커 쓰레드의 사용성은 높이면서 CPU 사용량을 줄이는 방법입니다. ..

C++ using namespace를 헤더 파일에 사용하지 말자

using namespace는 특정 네임스페이스의 클래스들을 네임스페이스 참조 없이 사용하기 위하여 흔히 사용하는 문법입니다. 흔한 예로는 STL을 사용하기 위하여 사용하는 using namespace std;와 같은 것이 있습니다. 네임스페이스를 생략하는 편의성 때문에 헤더에 using namespace를 사용하니 아래와 같은 문제가 발생하였습니다. 현재 개발 중인 프로젝트에서 사용하는 라이브러리들이 STL, Boost, MongoCXX, Cybos API등인데 같은 클래스이름 때문에 충돌이 발생하였습니다. 헤더 파일에서야 원인을 파악하고 클래스 앞에 네임스페이스를 넣어줘서 충돌을 막아줄 수 있었습니다. 그런데 cpp파일에서는 using namespace 구문이 있는 헤더가 포함되니 포함 순서에 따라서..

C++ 프로그래밍 2021.12.01

비주얼스튜디오(Visual Studio) 솔루션(*.sln) 커맨드라인 빌드 응용

개발을 하다보면 디버그 빌드와 릴리즈 빌드를, 32비트 빌드와 64비트 빌드를, 라이브러리 빌드부터 실행 파일 빌드 등 여러 개의 빌드를 순차적으로 할 때가 있습니다. 이럴 때 마다 비주얼 스튜디오에서 빌드 세팅을 바꾸거나 프로젝트를 바꿔가면서 빌드를 하는 것은 빌드 변경시마다 시간이 걸리는 귀찮은 작업입니다. 이런 경우에 Jenkins와 같은 CI서비스에서 많이 이용되는 커맨드라인 빌드를 응용하여 빌드를 배치로 만들고 실행하면 상대적으로 빌드 시간도 줄이고 편하게 작업을 할 수 있습니다. 비주얼스튜디오 솔루션 커맨드라인 빌드 명령은 MSBuild와 Devenv가 있습니다. Devenv도 내부적으로 MSBuild를 사용한다고 하니 둘 명령은 비슷하다고 할 수 있습니다. 여기서는 MSBuild를 이용한 배..

C++ 람다에서 참조 값과 복사 값 동시에 사용하기

C++ 람다는 C++ 특성상 복사와 참조 그리고 객체의 생명주기 등을 고려해야 메모리 관련 버그가 없습니다. 람다에서 참조만 사용할 경우 프로그램에 따라서 참조하는 값이 메모리에서 해제되면 메모리 관련 버그가 발생하게 됩니다. 이럴 경우 복사를 같이 사용해야 합니다. 해당 설명에 대한 아래 예를 살펴보겠습니다. 아래 코드는 해당 상황을 보여주기 위한 예제인 관계로 현실적인 사용과는 조금 다를 수 있으니 참고 바랍니다. #include #include #include using namespace std; struct std_15_sub { public: int value = 1; }; class std_15A { private: void print_value(int value) { cout value]의 ..

C++ 프로그래밍 2021.11.29

Unity 개발시 편집 중인 텍스트나 csv파일 데이터를 게임에서 읽기

유니티에서 게임 개발시 텍스트나 csv 데이터 파일의 로딩이 실패하지 않으려면 편집 중인 데이터 파일을 닫고 로딩해야 합니다. 하지만 게임을 개발하다보면 게임 개발과 텍스트나 csv 파일의 데이터 편집을 동시에 하고 싶을 때가 있습니다. 이럴 때는 아래의 방법을 사용하면 텍스트나 csv 데이터 파일을 편집하면서 게임 로딩이 정상적으로 일어나게 할 수 있습니다. 우선 아래의 간단한 소스를 보겠습니다. using UnityEngine; using System.IO; public class Test { public static void Load(string file) { string filepath = Application.dataPath + "/Resources/Data/" + file; using (var..

Unity 2D 카메라 화면 크기 및 좌표 범위 얻기

Unity로 2D 게임을 만들다보면 카메라가 표시하는 화면 좌표에 대한 정보를 얻어야 할 때가 있습니다. 그럴 때 카메라가 표시하는 화면의 왼쪽(Left), 오른쪽(Right), 위(Top), 아래(Bottom), 전체 길이(Width), 전체 높이(Height) 등의 정보가 필요합니다. 아래 소스는 camera_ 변수에 화면을 표시하는 카메라를 설정하면 화면의 왼쪽(Left) x좌표, 오른쪽(Right) x좌표, 위(Top) y좌표, 아래(Bottom) y좌표 및 전체 길이(Width), 전체 높이(Height) 등을 얻는 간단한 소스 예제입니다. 예제 소스에서는 마우스 오른쪽 버튼을 누르면 해당 정보가 디버그로 표시하게 해놓았습니다. 참고로 해당 소스는 간단히 만든 관계로 camera_에 대한 nul..

Unity 씬 이동 간에 빈 이동 씬을 이용하여 최대 사용 메모리 줄이기

이건 전 AXE팀의 NDC 발표 내용 중 일부인데 유니티에서 씬간의 이동시 중간에 빈 씬을 삽입하여 순간적 최대 사용 메모리 양을 줄이는 기법입니다. 이론적으로 말하자면 A씬에서 B씬으로 이동한다고 하였을 때 B씬이 로딩되었을 때 A씬이 언로드되기 전까지 최대 메모리 사용량은 A씬의 메모리 사용량 + B씬의 메모리 사용량이 됩니다. 이때 중간에 메모리 사용량이 거의 없는 빈 이동 씬을 삽입하여 A씬에서 빈 이동 씬으로 이동한 후에 빈 이동 씬에서 B씬으로 이동하게 만듭니다. 이런 빈 이동 씬을 이용하면 순간적 최대 사용 메모리양은 A씬 + 빈 이동 씬과 빈 이동 씬 + B씬 중 최대 메모리 사용량이 됩니다. NDC 내용을 보면 순간 최대 사용 메모리양으로 인하여 튕긴 현상이 있어서 이것을 구현하였다고 합..

std::chrono::steady_clock 관련 종합 예제

std::chrono::steady_clock을 사용할 일이 있어서 이리 저리 조사를 하며 만들어본 예제입니다. 예제에는 지나간 시간 체크, 시간 차 duration에 시간 더하기, 현재 구한 시간에 시간 더하기, duration과 long long간의 형변환, 시간차를 나타내는 duration 시간 이쁘게 보여주기 등등이 포함되어 있습니다. 예제 소스는 아래와 같습니다. #include #include #include #include using namespace std; int main(int argc, char* argv[]) { // 예제 #1: 지나간 시간을 체크합니다. auto now1 = std::chrono::steady_clock::now(); this_thread::sleep_for(st..

C++ 프로그래밍 2021.11.22

C++ boost json 구조체와 json 문자열간 변환 예제

boost json라이브러리를 사용하면 구조체와 json문자열 간의 상호 변환이 간단합니다. 여기서는 간단한 변환 예를 살펴보며 사용법을 알아보겠습니다. 우선 아래와 같은 간단한 예로 살펴보겠습니다. #include #include #include using namespace std; struct user { int id; string name; bool login; }; void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, user const& u) { jv = { {"id", u.id}, {"name", u.name}, {"login", u.login} }; } user tag_invoke(boost::json::value_to_t..

[MongoDB] C/C++ BSON 한글 문자열 입출력

MongoDB는 BSON을 사용합니다. BSON에서 문자열은 UTF-8을 사용합니다. UTF-8과 ANSI의 관계상 영문만 사용한다면 별도의 변환은 필요 없습니다. 그러나 일반적으로 사용하는 한글과 같은 멀티 바이트 문자열이나 유니코드 문자열은 별도로 UTF-8로 인코딩하여야 합니다. 또한 MongoDB에 저장된 문자열을 사용하기 위하여 UTF-8문자열을 한글과 같은 멀티 바이트 문자열이나 유니코드로 디코딩해야 합니다. 참고로 MongoDB C/C++ Driver API에 한글과 같은 멀티 바이트 문자열을 인자로 넣으면 바이트 수가 틀리다는 류의 에러가 나면서 API가 실행되지 않습니다. C/C++에서 한글과 같은 멀티바이트 문자열을 UTF-8로 변환하는 방법은 아래와 같습니다. 우선, boost 라이브..

boost locale을 이용한 C++에서의 Multi Byte와 UTF8간의 문자열 변환

영문만 있는 경우는 문자열은 C/C++에서 UTF-8로 별도의 변환을 필요로 하지 않습니다. 하지만 한글과 같이 멀티 바이트를 사용하는 경우는 별도로 UTF-8로 인코딩 및 디코딩을 해주어야 합니다. 이런 경우 사용할 수 있는 라이브러리가 boost local입니다. 간단한 Multi Byte와 UTF8간의 문자열 변환 예제는 아래와 같습니다. #include #include #include using namespace std; int main(int argc, char* argv[]) { string str = "{\"name\": {\"first\":\"그레이스\", \"last\":\"Hopper\"}}"; cout

반응형