Dirty Flag 패턴 - 캐시를 언제 버릴 것인가게임 오브젝트 작업을 하다보면 이런 함수를 자주 만들게 된다.현재 상태를 어딘가에서 수집해서 넘겨줘야 하는 함수. 여러 레이어나 컬렉션을 순회해서 결과를 조립하는 함수.작동은 잘 된다. 근데 이 함수가 매 프레임 호출되고 있다면 얘기가 달라진다.실제로 프로파일러를 켜서 GC Alloc 항목을 보다가 이런 함수를 발견했다. 호출될 때마다 new List()가 만들어지고, 함수가 끝나면 아무도 참조하지 않으니 GC 대상이 된다. 그게 초당 수십 번이다.결과는 항상 비슷한데, 계산은 매번 다시 하고 있었다.문제의 핵심이런 함수는 대부분 결과가 자주 바뀌지 않는다.캐릭터의 애니메이션 레이어 목록을 수집하는 함수라면, 레이어가 추가되거나 제거될 때만 결과가 달라..
프로파일러를 열기 전까지는 절대 몰랐을 것들이다.게임이 어느 정도 완성되고 나면 한 번쯤 프로파일러를 켜는 시간이 온다. 처음엔 그냥 가볍게 확인해보려고 열었는데, GC Alloc 항목에 숫자가 계속 찍히고 있는 걸 보게 된다. 딱히 뭔가를 크게 만든 것도 아닌데, 프레임마다 메모리 할당이 발생하고 있다.원인을 추적하다 보면 결국 코드 어딘가에서 반복적으로 객체를 만들고 버리고 있다는 걸 알게 된다. 로직이 틀린 건 아니다. 그냥 작동은 한다. 하지만 GC 입장에서는 매우 바쁜 코드다.이 글은 실제 프로젝트 코드를 들여다보면서 발견한 패턴 세 가지를 정리한 것이다. 나쁜 코드라기보다는 "아, 이게 이런 문제를 만드는구나" 하고 깨닫게 되는 케이스들이다.매 호출마다 새 List를 반환하는 함수이건 처음 보..
최근 개인 프로젝트를 진행하면서어떤 모델로 개발을 해야할까 싶은 생각에뉴비 시절 WPF를 썼던 기억이 다시금 떠올라이번에는 Winform으로 개발을 해봐야겠다는 생각이 들었다.(WPF을 수준급으로 하는것도 아니지만 Winform도 궁금했다)큰 규모의 프로젝트는 아니고연애 시뮬레이션처럼 지문과 선택지 노드들을 생성하고 노드끼리의 순서를 연결하여데이터 형태로 추출하는 프로젝트가 필요했다.(절대로 내가 미연시를 하려고 시작한 건 아니다)아직 프로젝트 개발중이지만 지금까지의 느낀점을 몇가지 적어보려고한다. 렌더링 차이- 진행하는 프로젝트가 [대화상자를 이어가는 툴] 이라고 생각했기에 굳이 렌더링에 대한 필요도는 높지 않았다.Winform : GDI+에 의존하여 렌더링을 한다.WPF : DirectX로 렌더링을 ..
게임 설정의 최적화 및 옵션 관련 부분을 개발하다보면,흔히 말하는 풀옵, 상옵, 하옵 등 성능 관련을 작업하는 날이 올 것이다.오늘은 렌더링의 주기를 관리하는 "온디맨드 렌더링" 에 대해 알아보자. 렌더링 주기를 관리하는 방법이라면Application.targetFrameRate 혹은QualitySettings.vSyncCount 해당 프로퍼티를 수정해서 렌더링 주기를 관리할 수 있었다. 하지만 이러한 접근 방식은 렌더링 뿐만 아니라 Unity가 실행하는 모든 함수 주기에도 영향을 주기 때문에OnDemandRendering 을 통해 플레이어 루프 주기와 렌더링 주기를 분리할 수 있다. 쉽게 말해 매 주기마다 체크하는 터치이벤트는 그대로 60프레임을 기준으로 체크를 하면서렌더링은 이보다 낮은 프레임으로 표..
유니티에서는 특정한 순서대로 실행되는 함수들이 있다. 이러한 함수를 통해서 게임 오브젝트의 초기화, 업데이트, 렌더링 등의 작업이 이루어지는데 이를 통틀어 함수 생명 주기 라고 한다 이벤트 함수의 실행 순서 - Unity 매뉴얼 Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다. docs.unity3d.com 유니티 엔진의 기초적인 부분이지만 그 중 Update, FixedUpdate, LateUpdate에 대해 설명을 해보려고 한다. 그림상으로 보았을 때 FixedUpdate -> Update -> LateUpdate 순으로 동작하는 것 같지만 Physics 부분에서 가장 ..
유니티 터널링 (Tunnelling) 현상이란 충돌 처리가 필요한 게임 오브젝트가 다른 충돌체를 뚫고 지나가는 현상을 말한다. 터널링이 발생하는 이유는 프레임 드랍 현상이나 물체가 너무 빨리 움직이는 이유 등으로 충돌 처리가 제대로 이루어지지 않으면 발생할 수 있다 프레임 드랍과 이벤트 함수 호출 주기 유니티의 Update의 호출 간격은 일정하지 않기때문에 void Update() { transform.position += (Direction) * moveSpeed * Time.deltaTime; } 위처럼 Update 함수에서 물체를 움직이게 되면 Time.deltaTime의 시간이 프레임에 따라 변동됨으로 의도한 일정한 moveSpeed 만큼의 이동이 이루어지지 않을 수 있다. 따라서 일정한 비율만큼..
게임에서 충돌 체크를 하는 방법은 여러가지가 있다. 물론 이 글에서 모든 충돌 방법을 설명하기는 어려울 것이고, 알고 있는 충돌 방법 이외에 다른 충돌 체크 방법도 있기에 모든 충돌 체크를 설명한다는 것은 불가능할 것이다. 가장 많이 쓰였던 혹은 많이 쓰이는 충돌 체크 방법들을 알아보자 픽셀 충돌 이미지들의 텍스쳐 픽셀 데이터를 통해 픽셀들이 동일한 위치에 존재하는지 체크 하는 방식이다. 포트리스나 웜즈 같은 게임이 픽셀 충돌을 이용하여 자연스러운 이동을 표현할 수 있다. 충돌 체크 코드는 비교적 단순하지만 단순한 for문 연산이기때문에 픽셀의 사이즈가 커질수록 연산 횟수가 증가한다. private bool CheckPixelCollision(ObjectClass objectA, ObjectClass o..
Early return(얼리 리턴)은 프로그래밍에서 조건을 미리 만족하는 경우 함수나 메서드 실행을 중간에 중단하고 값을 반환하는 프로그래밍 기법을 의미한다. 코드의 가독성을 높이고, 불필요한 연산을 방지하는 장점이 있긴한데 일단 예시 코드를 보자. public static bool CheckFunction(int value) { if(value > 0) { if(value > 5) { if(value < 10) { return false; } } else { //todo value... } } return true; } 이런 코드가 있다고 하면 CheckFunction의 함수는 return false를 리턴하기 위해선 3번의 if문을 검사해야한다. 이를 Early Return 형식의 코드로 수정하게 되..