반응형

분류 전체보기 214

Unity 최적화: 안드로이드 LG V10 vs Samsung S7

유니티로 만드는 게임이 크게 복잡하지 않다보니 모바일에서도 60프레임이 가능하도록 만드는 것을 목표로 하고 있습니다. 물론 모바일에서의 게임 프레임은 게임의 쾌적한 실행 이외에도 배터리 사용, 발열 등도 고려해야 하기 때문에 유니티에서는 공식적으로 30프레임을 추천하고 있는 듯 합니다. 하지만 이것은 발매시에 최종 프레임 레이트를 결정하려고 하고 우선적으로는 프로파일링으로 병목을 찾아서 제거하여 속도는 최대로 내려고 합니다. 참고로 유니티에서 최고 프레임 레이트는 Application.targetFrameRate = 60;와 같이 한줄을 추가하면 쉽게 설정할 수 있습니다. 이 예에서는 60프레임으로 설정하였습니다. 만드는 게임이 복잡하지 않는 게임이라 나온지 몇 년된 혹은 저 사양 기기에서도 쾌적한 게임..

Unity 최적화: Update 함수

어떻게 보면 모든 게임 프로그래밍의 기본이 될 수도 있는데 한 프레임내의 연산을 최소화해야 초당 프레임 수가 보장됩니다. 유니티에서는 한 프레임 내에서 실행하는 함수가 Update입니다. Update내에서 코드를 작성할 때 아래와 같은 사항을 조심해야 합니다. 우선 항상 같은 값을 찾는 경우는 멤버 변수에 캐시하여 놓아 한번만 찾고 그 뒤로는 캐시된 값을 이용하도록 만들어야 합니다. 저와 같은 경우 설정 파일을 로딩하여 설정 사항을 가지고 있는 설정 관련 객체를 가지고 있었습니다. 그런데 업데이트시 저장된 설정 값을 가져올 때 항상 설정 관련 객체에서 검색이 일어나서 성능 저하가 있었습니다. 결국 한번 검색한 설정 관련 사항은 멤버 변수에 가지도록 하여 검색을 줄여 성능 향상을 하였습니다. new로 객체..

Unity 안드로이드 개발시 알아두면 좋은 것들

Android 파일 전송(Android File Transfer) 맥 안드로이드 간 USB 연결로 MTP을 이용하여 Finder 즉, GUI로 파일 이동을 가능하게 해주는 유틸입니다. 참고: Android File Transfer 휴대폰 IP정보 얻기 개발은 하다 보면 휴대폰의 외부IP가 아닌 내부IP 정보가 필요할 때가 있습니다. 참고: 안드로이드 스마트폰 IP주소 확인하는 법 유니티 리모트(Unity Remote) 안드로이드에 Unity Remote라는 앱을 인스톨하여야 합니다. 기능은 개발 중인 게임을 에디터 화면 외에 안드로이드 화면에서도 동시에 실행시켜 안드로이드에서의 입력 등이 제대로 동작하는지 확인하실 수 있습니다. 일종의 스트리밍 플레이어로 에디터의 화면을 캡처해서 실행시키는 관계로 화질이..

Unity 안드로이드 빌드 시 화면 멈춤(Freezing) 현상 해결

Unity를 모바일로 빌드하여 실행하게 되면 PC나 맥 개발환경에서 발생하지 않는 여러가지 문제가 생기게 됩니다. 그 중 하나가 저는 테스트 기기인 LG V10에서 만든 게임을 일정 시간 플레이를 하면 난수 적으로 화면 멈춤 현상이 생기는 것이었습니다. 저는 이 현상을 PlayerSettings>ResolutionAndPresentation>Optimized Frame Pacing을 해제해서 해결하였습니다. 저는 유니티 2020.3월 버전을 사용했는데 해당 옵션은 아직 불완전한 듯 보입니다. 참고: Android build project freezes after 5 minutes with playerloop in profiler at 60,000 ms 해당 옵션에 대한 부분에 대한 설명은 아래를 참고 바..

MS 비동기 에이전트 라이브러리 소개: #2 Hello World

비동기 에이전트 라이브러리(Asynchronous Agent Library)를 사용하여 Hello World를 출력하는 아래 예제를 살펴보겠습니다. #include #include #include #include #include using namespace concurrency; using namespace std; class agent_01_a : public agent { public: explicit agent_01_a(ISource& source, ITarget& target) : source_(source), target_(target) { } protected: void run() { send(target_, string("Hello")); string response = receive(sou..

MS 비동기 에이전트 라이브러리 소개: #1 개념

비동기 에이전트 라이브러리(Asynchronous Agent Library)는 아래와 같은 특성을 갖는 병렬처리 라이브러리입니다. MPI와 같이 메시지 기반으로 병렬 처리를 합니다. 참고: [MPP] Introduction To Message Passing Interface(MPI) 액터 기반(Actor-Based) 기반의 프로그래밍 모델을 제공합니다. 액터 기반의 프로그래밍 모델은 각각의 독립된 처리를 하는 액터들이 메세지를 주고 받으며 병렬처리를 하는 프로그래밍 방식입니다. 참고: Actor-based Concurrency 비동기 에이전트 라이브러리는 독립적인 일을 하는 에이전트 들이 존재하며 이들은 데이터 흐름에 기초한 비동기적 통신을 위한 연결을 가지고 있습니다. 위의 참고 자료를 보면 액터 기반..

C++ 클래스 함수 간접 호출 : mem_fn, bind, bind_front

C++에서 클래스 함수를 간접적으로 호출할 수 있는 방식 중 mem_fn, bind, bind_front를 아래 예제로 살펴보도록 하겠습니다. #include #include using namespace std; class test_class_fn { public: int add(int a, int b) { return a + b; } auto get_func_mem_fn() { return mem_fn(&test_class_fn::add); } function get_func_bind() { return bind(&test_class_fn::add, this, std::placeholders::_1, std::placeholders::_2); } function get_func_bind_front() ..

C++ 프로그래밍 2021.12.11

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
반응형