목록개발/공부 (26)
메피카타츠의 블로그
게임 개발을 하다보면 게임 내에 각종 데이터들이 들어가게 된다. 이 데이터들을 csv, json, binary 각각 어떤 방식으로 사용하는 게 효율적일지 궁금하여 테스트해보았고, 이 결과를 정리해보고자 한다. 예를 들면 스토리 대사 같은 데이터들이 필요할 수 있다. 보통 이런 건 구글 스프레드 시트에서 데이터를 작성, 관리하여 파일로 변환해 유니티로 가져와 사용한다. 위 내용을 csv로 저장하면 이런 식으로 저장된다. 쉼표로 데이터들이 구분되며 줄줄이 나열되는 방식이다. 위 데이터들을 코드로 나타내면 이런 식으로 나타낼 수 있을 것이다. (밑의 Synchronize 부분은 신경쓰지 않아도 괜찮다) 이 데이터를 json으로 Serialize하면 이런 느낌으로 저장된다. 각 변수들의 이름과 값을 저장..
유니티로 모바일 게임을 개발하다보면 메모리 용량을 확보해야 하는 상황이 온다. (여기서 말하는 메모리는 RAM이다) 이뿐만 아니라, 디스크 용량 확보도 중요한 요소이다. 게임의 용량이 작은 것을 유저들이 더 선호하기도 하며, 다운로드 용량이 클수록 부담해야 하는 비용도 늘어나기 때문이다. 일례로, AssetBundle 다운로드에 AWS를 많이 사용하게 될 텐데, AWS의 S3 요금제를 살펴보면 위와 같다. 많이 사용할수록 가격이 감소하지만, 최저 요금을 기준으로 봐도 1GB당 $0.108로 2024년 10월 27일 현재 환율로 150원 정도의 비용이 들어가는 셈이다. 10만명의 유저가 다운로드를 받는다고 가정했을 때 다운로드 용량을 1GB 줄이는 경우, 최저 요금을 기준으로 봐도 $10,800, 현재 ..
최근에 Android SDK 버전 지원 문제로 프로젝트의 Unity 버전을 업그레이드 하였다.(예로 2020.1 버전은 API level 30까지만 지원, 2022.3 버전은 현재 API level 35까지 지원 중) 그러면서 C# 버전 관련해서도 테스트를 하며 잠시 변경이 있었는데, nullable을 활용해서 조금 더 효율적이고 안전하게 개발할 수 있는 방법이 있는 듯 하여 정리해보기로 했다. 개발을 하다보면 필연적으로, 자주 만나게 되는 오류가 있는데 바로 NullReferenceException이다. line 14와 line 27을 확인해보면, Test2함수를 실행할 때 null을 넘겨줬는데 내부에서 null 체크를 하지 않고 classA라는 객체에 접근했기 때문에 NullReferenceEx..
Unity로 모바일 게임을 개발하다보면 메모리가 부족해지는 경우가 생긴다. 메모리 관리에 대한 탐구 (5) - 메모리 프로파일러를 통한 메모리 사용량 분석 :: 메피카타츠의 블로그 (tistory.com) 메모리 관리에 대한 탐구 (5) - 메모리 프로파일러를 통한 메모리 사용량 분석오늘은 유니티에서 Package Manager를 통해서 제공하는 Memory Profiler에 대해서 소개할 예정이다. 유니티 2021에서 제공하는 0.7.1 버전을 기준으로 소개를 할 것인데, 현재는 1.0도 나와있다. UI나 세부적mepkatatsu.tistory.com 이전에 언급했던 메모리 프로파일러를 사용하면 메모리에서 오브젝트들이 차지하고 있는 용량을 확인할 수 있다. 이전에 올렸던 사진 중에서도 최상위에 있는 ..
public long SomeMethod(int id){ long newId = id 위 식에서 id가 10000이라면 무슨 값이 나올까? long newId = 10000 일테니, 10000을 왼쪽으로 32번 시프트하고, 10000을 더한 값이 들어갈 것이라고 생각할 수 있다. 하지만, 실제로는 비트 연산자의 우선 순위가 더하기 연산자보다 우선순위가 낮기 때문에 long newId = 10000 결과적으로는 위 식과 같은 식이며, 좌측으로 10032번 시프트를 한 결과가 나오게 된다. 이 녀석의 무서운 점은 에러 따위를 띄우지 않는다는 점이다. -_-;; 코드만 보고 id를 32비트만큼 왼쪽으로 옮긴 후 더해서 Unique한 새로운 id를 만드는 역할인가보다 ..
한 줄 요약: Time.realtimeSinceStartup은 정확도가 떨어지니 Time.unscaledTime을 사용합시다. Time~ 으로 시작하는 Debug 로그는 while(true) 문 안에서 10초를 대기하며 반복적으로 찍은 사진이다. yield return new WaitForSeconds(10); 을 사용해서 코루틴이 못미더웠는데, 실제로는 Time.realtimeSinceStartup이 문제였다. 프로젝트에서 시간을 누적할 때 Time.realtimeSinceStartup를 사용했는데, 대략적인 시간은 맞지만 간혹 오차가 발생하는 경우가 있었다. Time: { Time.realtimeSinceStartup }, Double: { Time.realtimeSinceStartupAsDoubl..
JetBrains Rider는 JetBrains사에서 개발한 IDE이다. Visual Studio와 비슷하다고 생각하면 된다. 이전부터 관심은 있었는데 얼마 전에 직장 동료가 할인 소식을 알려줘서 다행히도 저렴한 가격에 구입할 수 있었고, 약 1주+@간 이용해본 소감은... 돈이 아깝지 않을 정도로 굉장히 만족스럽게 사용하고 있다. 그래서 이번 주 스터디는 Rider를 잘 써보자는 차원에서 Rider의 장점이나 활용법 등을 준비해갔고, 지금 쓰는 글도 약간 이 내용을 다듬어서 Rider의 장점을 정리하고, 효율적인 개발을 할 수 있도록 권장해보고자 한다. IDE(통합 개발 환경) : 코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프..
이전 글에서 Addressables에 대한 내용을 다루었었는데, 메모리 관리와 관련해서 추가로 찾은 내용이 있어서 올리고자 한다. Addressables은 자체적으로 Reference Count를 관리하여 AssetBundle 내의 모든 Asset이 Release되면 AssetBundle을 통째로 자동으로 메모리에서 해제해준다는 내용을 찾아볼 수 있었다. 또, 마찬가지로 AssetBundle끼리도 Reference Count를 가지고 있는 것으로 보였다. 하지만, 각 Asset에 대한 Reference Count는 어떻게 관리를 하는지에 대해서는 찾아보기가 조금 어려웠다. 만약 각각 Asset을 직접 해제해줘야 한다면 작업이 상당히 번거로워질 것이기 때문에, 이점이 크지 않을 것 같았다. Instanti..