반응형

개발 라이브러리 & 툴/유니티 17

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

이 글에서는 Unity 모바일 게임에 대한 여러가지 설정 관련 최적화 경험 중 인상적인 것들에 대해서 이야기할까 합니다. 파티클과 쉐이더 우선 아래 글처럼 일부 파티클 사용시 기본 설정되는 표준쉐이더 사용으로 모바일에서 FPS이 낮아지는 현상이 있어 수정하였습니다. 참고: Unity 최적화: 모바일 파티클 매터리얼 파티클과 쉐이더 관련 문제는 상대적으로 고성능인 모바일 기기에서는 발견되지 않았었습니다. 성능별로 다양한 스펙트럼을 가진 기기들에서의 테스트가 중요한 거 같습니다. 다음으로 쉐이더는 선택할시 모바일용을 선택하는 것이 중요한 거 같습니다. 파티클의 계산은 물리 연산에 영향을 받습니다. 화면 표시는 원활한 플레이를 위하여 60 FPS로 설정하였지만 파티클의 계산과 물리 연산은 Project Set..

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

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

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

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

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 해당 옵션에 대한 부분에 대한 설명은 아래를 참고 바..

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

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

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 내용을 보면 순간 최대 사용 메모리양으로 인하여 튕긴 현상이 있어서 이것을 구현하였다고 합..

반응형