게임엔진

    [Unity] 그래픽스 최적화 - 드로우콜과 배칭

    01. Draw Call 드로우콜은 수많은 병목 중 하나의 원인일 뿐,, 반드시 병목이 드로우콜에서 일어난다고 단정지어서는 안됨. 드로우콜이 강조되는 이유는 대부분 병목의 원인이 드로우콜에 있기 때문. 드로우 콜이란? CPU가 GPU에게 이거 그려! 하고 명령을 호출하는 것. 더 자세하게 ? 한 프레임의 렌더링은 매 오브젝트를 순차적으로 그려주면서 오브젝트를 다 그리면 화면에 보여지게 되는 것. 오브젝트를 화면에 렌더링하기 전에 우선 해당 오브젝트가 렌더링 대상에 포함되는지 체크한다. 현재 프레임 상에서 해당 오브젝트가 카메라의 시야 밖에 있다면 안 그려도 되는 것이므로 렌더링 대상에서 제외한다. 이런 검사 과정을 Culling이라고 한다. 컬링을 거친 오브젝트가 렌더링되려면 CPU로부터 GPU에게 정보..

    [Unity] 그래픽스 최적화 - 병목

    01. 병목의 이해 성능 최적화란? 적은 자원을 사용하더라도 연산 효율이 높아지도록 최적의 성능을 이끌어 내는 것. 최적화를 위해 할 수 있는 노력들은... Mesh의 Vertex 줄이기 텍스처 크기 줄이기 가벼운 Shader 사용 Draw Call 줄이기 게임 로직 최적화 물리 연산 줄이기 등등이 있는데 그 전에 선행되어야 할 것이 병목을 탐지하는 것. Bottleneck, 병목 전체 프로세스가 갑자기 느려지거나 막혀서 정지하는 원인이나 그 장소. 병목현상이 발생했다 ! == 전체 성능이나 용량이 어떤 하나의 구성요소 때문에 제한 받는 일이 생겼다 ! 특정 로직 수행이 오래걸리면 그 친구 때문에 전체 성능이 떨어지게 되는 것. 따라서 최적화를 하려면 병목 현상이 누구 때문에 일어나는지 찾아야 함. 프로..

    [Unity] 그래픽스 최적화 - 렌더링 파이프라인

    01. GPU의 의미 그래픽 처리를 위한 시스템은 GPU를 중심으로 구성된 칩셋에서 이뤄짐. CPU가 렌더링 명령을 내리면 GPU가 수행. GPU 메모리, VRAM Video Random Access Memory. CPU가 메모리에서 데이터를 읽어오듯 GPU도 그래픽 카드에 GPU 메모리가 있다! 그것이 VRAM. 텍스처, 메시 데이터 등 렌더링에 필요한 데이터들, 렌더링 결과를 저장하는 버퍼들이 포함됨. 렌더링할 때 여기에 저장된 데이터를 참고해서 그래픽 처리. 02. 게임 루프 유저가 게임을 실행하면 로딩(초기화, 리소스 생성) -> 게임 중(매 프레임 렌더링) -> 게임 종료(리소스 해제) 위와 같은 일련의 과정이 게임 루프. 만약 10프레임이라면, 1초동안 10개의 장면, 한 장면당 0.1초를 쓰..

    [Unreal] 스레드와 단일 스레드로 실행시키기 (-norenderthread)

    언리얼은 두 개의 메인 스레드로 돌고 있는데, 하나는 우리가 아는 게임 스레드이고 나머지 하나는 한 틱 뒤에서 이 게임스레드를 뒤쫓고 있는 렌더 스레드이다. 게임 스레드가 월드의 변경점을 렌더 스레드에 반영시키기 위해서는 ENQUEUE_RENDER_THREAD라는 매크로를 통해 람다 함수로 이를 렌더 큐에 쌓아두는 방식으로 접근한다. void BeginInitResource(FRenderResource* Resource) { ENQUEUE_RENDER_COMMAND(InitCommand)( [Resource](FRHICommandListImmediate& RHICmdList) { Resource->InitResource(); }); } RenderResource.cpp에 정의되어있는 BeginInitRe..

    [Unity] 내 주변을 원 모양으로 퍼지는 탄환 생성

    특정 오브젝트를 기준으로 원 모양으로 퍼지는 탄환을 생성하는 방법이다. int n = 10; int speed = 150; for (int i = 0; i < n; i++) { GameObject boltObj = Instantiate(boltPrefebs, player.transform.position + new Vector3(0, 0.3f), Quaternion.Euler(0, 0, (360 * i / (n - 1)) + 180)); //투사체의 각도가 자연스럽게 회전값을 넣었다. Vector2 dirVec = new Vector2(Mathf.Cos((Mathf.PI) * 2 * i / (n - 1)), Mathf.Sin((Mathf.PI) * i * 2 / (n - 1))); //원을 기준으로 각각..

    [Unity] 내 주변을 원 운동하는 오브젝트 만들기

    float circleR; //반지름 float deg; //각도 float objSpeed; //원운동 속도 void Update() { deg+= Time.deltaTime*objSpeed; if (deg < 360) { var rad = Mathf.Deg2Rad * (deg); var x = circleR * Mathf.Sin(rad); var y = circleR * Mathf.Cos(rad); YS[0].transform.position = transform.position + new Vector3(x, y); YS[0].transform.rotation = Quaternion.Euler(0, 0, deg * -1); //가운데를 바라보게 각도 조절 } else { deg = 0; } } 회전하..

    [Unity] Sprite Sheet (스프라이트 시트)를 사용한 2D 애니메이션

    유니티에서 스프라이트 시트(sprite sheet)를 사용한 2D 애니메이션 스프라이트 시트(sprite sheet)는 여러개의 작은 그래픽을 그리드(grid)에 정렬하여 구성한 비트맵 이미지 파일이다 게임 개발에서 캐릭터의 연속적인 키 포즈를 한장의 이미지에 구성하여 2D 애니메이션 제작에 사용된다. 1) 유니티에서 스프라이트 시트 이미지를 가져오기한다(import) 2) import settings에서 텍스처 유형(texture type)을 sprite(2D and UI), 스프라이트 모드(sprite mode)를 multiple로 설정하고 apply를 클릭한다. 3) 패키지 매니저에서 2D Sprite 패키지를 설치한다(install) 4) import settings에서 스프라이트 편집기(spri..

    [Unity] 유니티 2D RPG 강좌 #1 - 스프라이트 설정하기

    1-1. 스프라이트란 무엇일까? 3D 게임에 사용되는 플레이어, 적 등의 모델들은 모두 3D 모델로 되어있다. 2D 게임에서 사용되는 플레이어와 적 그림들은 "스프라이트"라고 한다. 게임에서 제일 기초가 되는게 바로 스프라이트다. 지금 만들 2D RPG 게임에 사용될 스프라이트는 "도트" 형식의 스프라이트다. 우리가 흔히 아는 고해상도 고퀄리티의 그림들이 아닌 "점"들을 사용해서 그린 픽셀 아트를 도트라고 한다. 유니티를 실행하고 새 프로젝트를 만들어 줍시다. 상단에 있는 "New" 버튼을 클릭. 먼저 프로젝트 이름과 프로젝트를 저장할 위치를 정한 다음에 우리는 2D 게임을 만들것이기 때문에 Template를 2D로 설정해주자. 설정을 완료했다면 "Create Project" 버튼을 클릭해서 프로젝트를 ..

    [Unity] Sprite (스프라이트) 개념

    1. 스프라이트 ( Sprite ) 스프라이트는 텍스쳐이며, 2D 그래픽 오브젝트이다. 스프라이트는 2D 그래픽에 사용된다. 스프라이트는 PNG, JPG와 같은 이미지 파일이 아니다. UI에 그림파일을 등록하고, Scene 화면에 드래그해보자. 이미지 파일은 단일 게임 오브젝트로 등록할 수 없다. 이미지 파일을 사용하기 위해서는, 스프라이트로 변환해야 한다. 유니티는 그림파일을 스프라이트로 변환하는 API를 제공하고 있다. 아래는 변환하는 방법이다. 그림파일 선택 → Texture Type → Sprite (2D and UI ) → Apply 스프라이트로 변환한 파일을 Scene View에 드래그하면, Scene View에 나타나는 것을 볼 수 있을 것이다. 1.1 스프라이트 모드 (Sprite mode..

    [Unity] 2D 카메라 범위 제한하기

    2D 게임을 만들 때 카메라가 비추는 영역보다 맵 크기가 크면 맵을 돌아다니면서 서서히 맵이 모습을 드러낸다. 이때 맵의 가장자리로 플레이어가 이동하면 카메라가 구현되어 있는 맵을 넘어서 비추게 될 수도 있는데, 문제가 없는 경우도 있지만 이것을 제한해야 하는 경우도 있다. 왼쪽이 맵 외부까지 비추는 경우이고, 오른쪽은 맵 외부는 비추지 않도록 카메라의 영역을 제한한 경우이다. 이번 포스팅에선 카메라가 캐릭터를 추적하는 기능부터 맵 외부 영역을 비추지 않는 기능까지 2D 카메라 무빙에 대한 전반적인 내용을 다뤄보겠다. 카메라가 플레이어를 추적 우선 카메라가 플레이어를 추적하는 기능을 먼저 구현해보자. 유니티에서 사용하는 카메라는 유니티 내의 오브젝트이므로 카메라 오브젝트 자체의 위치는 World coor..