반응형

최적화 8

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 최적화: 모바일 파티클 매터리얼

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

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

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

Unity 최적화: Update 함수

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

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

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

성능 향상하기: IO 관련 처리 vs CPU 관련 처리

IO 관련 처리란 파일 처리, 소켓 처리와 같이 용어 그대로 IO 관련 처리를 말합니다. CPU 관련 처리란 연산 관련 처리를 말합니다. 이 둘의 처리에 대해서 말하는 이유는 이 둘을 구분하여 현재 프로그램을 보는 것이 성능을 크게 향상 시킬 수 있기 때문입니다. IO 관련 처리와 같은 경우 관련 IO API를 호출한 뒤에 API내에서 IO처리를 하는 동안 CPU가 노는 경우가 생길 수 있습니다. 이런 경우 성능을 올리기 위해서는 비동기 IO를 사용하거나 IO쓰레드를 만들어서 비동기적으로 처리하여 CPU가 노는 시간을 줄여 성능을 올릴 수 있습니다. CPU 관련 처리와 같은 경우 성능 좋은 알고리즘을 사용하여 연산을 줄이거나 멀티프로세스 프로그래밍을 활용하여 성능을 올릴 수 있습니다. 흔히 하는 실수가 ..

반응형