반응형

분류 전체보기 220

Unity 최적화 작업 후에... #2

이 글에서는 Unity 모바일 게임에 대한 프로그래밍적 최적화 경험 중 인상적인 것들에 대해서 이야기할까 합니다. 프레임 레이트 (FPS) 게임 최적화의 핵심적 결과물은 몇 프레임이 나오는가 하는 것인가 입니다. 프레임이 잘 나온다는 것은 그 만큼 원활히 게임을 플레이할 수 있다는 말이기도 합니다. 모든 최적화의 결과는 기존 FPS를 최적화 후 얼마나 올렸는가로 표현될 수 있기도 합니다. FPS 최적화를 하기 위해서 우선 유니티 프로파일러에 나오는 FPS를 참고하는 것이 좋습니다. 전체적인 흐름에서 대략적인 FPS를 알 수 있습니다. 이외 별개로 개별적인 항목만을 본 FPS도 중요합니다. 한 예로 저사양의 기기에서는 Rendering 항목의 FPS 자체가 적게 나옵니다. 이를 바탕으로 어느 정도의 FPS..

Unity 최적화 작업 후에... #1

뭐 제목은 거창하지만 어떻게 보면 1인 개발로 만들고 있는 하이퍼 캐주얼 류의 2D 모바일 게임을 최적화하고 느낀 점을 적을까 합니다. 용량이 크거나 복잡한 3D 게임이 아닌지라 상대적으로 어려운 내용보다는 기본적인 개념에 중점을 두고 이야기 할까합니다. 전에는 최적화라면 프로그램 최적화 만을 생각했는데 1인으로 리소스 제작, 기획, 프로그래밍을 하다보니 프로그램 최적화 만이 게임이라는 관점에서의 최적화는 아니라는 생각이 들었습니다. 여기서는 최적화한 내용 중 인상 깊었던거 중 비프로그래밍 적인 것을 #1에, 프로그래밍 적인 것을 #2에, 설정 관련된 것을 #3에서 이야기 할까 합니다. 입력에 따른 게임 난이도 최적화 제가 만든 게임은 터치로 적과 폭탄을 부시는 게임입니다. PC 마우스 기반으로 빠르게 ..

C++ 람다 사용시 변수 캡처 주의점과 shared_ptr의 활용

C++의 람다는 근래에 많이 쓰이는 기술 중에 하나 입니다. 람다는 흔희 변수를 캡처하여 내부에서 많이 사용합니다. 이럴 때 생각해야 할 점이 변수를 참조로 캡처할 것인가 복사로 캡처할 것인가 하는 점입니다. 기본적으로 내부에서 캡처한 외부 변수의 값을 변경하고자 하거나 복사에 따른 오버헤드가 크다고 생각한다면 혹은 객체 내부에서 객체 함수 등을 참조해야 한다면 참조로 캡처를 사용하게 됩니다. 반대로 내부에서만 값을 변경 또는 사용하거나 복사에 따른 오버헤드가 크지 않으면 복사로 캡처하여 사용합니다. 람다는 참조로 캡처하여 사용할 때 주의점은 캡처한 변수가 람다를 다 사용할 때까지 메모리에 남아 있어야 한다는 것입니다. 간단한 아래와 같은 예를 하나 살펴보겠습니다. 참고로 이 예제는 실제로 일어날 수 있..

C++ 프로그래밍 2022.01.21

C++ string_view의 이해와 활용

string_view는 C++ 17에 추가된 클래스로 문자열에 대한 참조라고 볼 수 있습니다. 사용법은 string과 유사하며 장점은 string에 비하여 적은 메모리 사용량과 연산 성능에 대한 이점을 가지고 있습니다. 단점은 잘못된 사용시 임시 객체 사용에 따라 참조가 없어져 예상치 못한 에러가 발생할 가능성이 있으며 내부구조가 널로 종료하는 문자열을 참조하지 않는 관계로 널로 종료하는 문자열을 필요로하는 C API와 같은 함수에 사용할 수 없다는 점 등이 있습니다. 참고로 string_view는 가볍다는 장점을 바탕으로 몽고DB C++ 드라이버에서는 벌써 적절하게 사용하고 있습니다. 이 글에서는 string_view의 특성, 사용법, 장점 및 단점을 살펴보도록 하겠습니다. string_view 특성 ..

C++ 프로그래밍 2022.01.15

Unity iOS 크래시 그리고 Exception

iOS 빌드와 같은 경우 설정에 따라서 Unity 코드 상에서 Exception을 잡지 않는 경우 설정에 따라 크래시가 발생하여 프로그램이 종료하게 됩니다. 코드에서 잡지 않은 Exception으로 크래시가 일어나서 프로그램이 종료하게되는 옵션은 Player Settings -> iOS -> Other Settings -> Optimization -> Script Call Optimization입니다. 이 세팅이 유니티에서 기본으로 "Fast but no Exceptions"으로 설정되어 있습니다. 이 옵션 설정으로 인하여 유니티로 만든 게임에서 Exception이 발생할 때 iOS에서 크래시가 발생하게 됩니다. 이 옵션을 "Slow and Safe"로 설정하게 되면 다른 플랫폼처럼 Exception이 ..

Unity FPS 체크 소스

유니티에서 초당 프레임 관련 정보를 보여주는 소스입니다. 위의 이미지와 같이 표시합니다. 기본적으로 한 프레임 실행시간과 한 프레임 실행시간을 기반으로 초당 가능 프레임 수를 표시합니다. 이미지에서 {msec} ms가 한 프레임 실행시간, {frame count} fps가 초당 가능 프레임 수입니다. 여기까지는 보통 인터넷에 존재하는 소스와 비슷합니다. 그런데 이렇게만 표시하면 수치가 너무 빨리 변하여 실제적으로 화면을 보면서 이용하기가 불가능합니다. 그래서 1초 동안 계산된 프레임 중에 최소와 최대 프레임을 같이 표시하도록 만들어 놓았습니다. 이미지에서 {frame count} min fps가 초당 최소 프레임 수이고 {frame count} max fps가 초당 최대 프레임 수입니다. 실제적으로 여기..

Unity 최적화: 모바일 파티클 매터리얼

유니티로 만든 게임을 테스트하는데 특정 파티클을 사용하면 개발 PC나 삼성 S7에서는 이상이 없는데 LG V10에서 프레임 드랍이 일어나는 현상이 있었습니다. 프로파일링시 스크립트에서의 실행 시간은 별문제가 없었고 랜더링 시간이 늘어나는 것만을 확인할 수 있었습니다. 처음에는 파티클 사용에 따른 랜더링 부하라고 생각했다가 파티클을 살피던 중 매터리얼에서 사용하는 쉐이더가 스탠다드 인 것을 확인하고 모바일로 수정하였습니다. 그리고 추가적으로 매터리얼에 사용되는 이미지 크기를 표시에 필요한 수준 만큼 줄여주었습니다. 이 두 가지 작업을 하니 랜더링 시간이 줄었고 LG V10에서의 프라임 드랍은 없어졌습니다. 모바일용 게임을 개발할 때 파티클 사용시 파티클이 이용하는 매터리얼 쉐이더에 주의를 하여야 하겠습니다..

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