분류 전체보기

    타이머 간략화

    이전 구현 https://jartlife.tistory.com/64 게임 타이머 구현 가변 프레임 이전의 게임 타이머 구현은 아래 글에서 볼 수 있다. https://jartlife.tistory.com/52 게임 프레임 관리 게임의 동작 게임은 일정 시간 간격마다 사용자 입력을 처리하고 객체들을 업데이트 jartlife.tistory.com 이전 구현은 위 글에서 볼 수 있다. 중첩 클래스가 가독성을 좀 심하게 나쁘게 했다. 그리고 타이머 클래스가 지고 있는 책임이 너무 무거운 것 같다. 게임의 기능을 추가하려고 그 복잡한 클래스 중첩 구조를 추적해서 update()와 render() 함수를 건드리기란.. 별도의 클래스를 추가하는데 timer.h 파일을 매번 건드려야 한다는 것도 심각한 설계 미스다. ..

    게임 타이머 구현

    가변 프레임 이전의 게임 타이머 구현은 아래 글에서 볼 수 있다. https://jartlife.tistory.com/52 게임 프레임 관리 게임의 동작 게임은 일정 시간 간격마다 사용자 입력을 처리하고 객체들을 업데이트한 뒤 객체들을 렌더링한다. 따라서 게임에서 타이머의 역할은 매우 중요하다. 게임의 거의 모든 기반이 타 jartlife.tistory.com 유저는 30프레임, 60프레임 등등 FPS(시간 당 프레임)를 조절할 수 있다. 가변 프레임 환경에선, 프레임 기반의 이벤트 처리 요청이 정확한 시간 조건을 보장하지 못한다. 현재 FPS가 20 FPS라면 60 프레임 뒤에 발생할 사건은 3초 뒤에 발생하는 것이 되고, 현재 FPS가 60 FPS라면 60 프레임 뒤에 발생할 사건은 1초 뒤에 발생하..

    git repository 생성

    pool을 만들면서 슬슬 git 관리가 필요해지는 시기라 생각했다. 귀찮아도 익숙해지면 오히려 안 쓰는 게 불안하게 느껴지겠지 https://github.com/MyeongWoonJang/WinDungreed

    현재 적용할 메모리 풀

    기존 오브젝트 풀 개선 https://jartlife.tistory.com/59 메모리 풀, 오브젝트 풀 개념 힙 메모리 단편화 힙 단편화( heap fragmentation ), 메모리 단편화( memory fragmentation )이라 부르는 이 현상은 객체를 자주 동적할당할 때 발생한다. 메모리들이 직렬화되어 전부 붙어있으면 좋겠지만, jartlife.tistory.com 이전 게시글의 오브젝트 풀을 개선하여 이번 프로젝트에 쓸 메모리 풀을 만들었다. 커스텀 삭제자를 지정한 유니크 포인터를 통해 자동 반납을 구현했다. 객체 생성자의 호출 시점을 할당 시점으로 옮기고, 소멸자의 호출 시점을 반납 시점으로 옮겼다. alloc은 생성자로 인자를 전달하므로 기본 생성자가 없거나 생성자 종류가 여러 개인 ..

    메모리 풀, 오브젝트 풀 개념

    힙 메모리 단편화 힙 단편화( heap fragmentation ), 메모리 단편화( memory fragmentation )이라 부르는 이 현상은 객체를 자주 동적할당할 때 발생한다. 메모리들이 직렬화되어 전부 붙어있으면 좋겠지만, 힙 메모리에서는 메모리들이 붙어있다고 장담할 수 없다. 할당되는 메모리 조각들은 서로 거리가 있는 편이다. 어쩌다가 연속된 메모리들이 있어도 중간에 메모리를 삭제해버리면 그 사이에 원래 있던 메모리 만큼의 틈이 발생하게 된다. 힙 메모리 단편화로 인해 빈 메모리가 자주 발생해버리면, 실제 메모리 크기에는 여유가 있지만 특정한 크기의 객체를 할당할 수 없는 일이 발생한다. 빈 메모리 총합은 10000 byte 지만 모든 빈 메모리가 1000 byte 이하일 경우, 2000 b..

    게임 저장 구현 - 구조체를 파일로 저장하기

    배경 게임은 게임 내용을 저장하고 불러오는 기능이 필요하다. 저장과 불러오기는 유저의 하드디스크에 게임 파일을 저장하고 불러오는 일로서, 파일 입출력에 해당한다. 문자열로 패턴화하여 .txt 나 .csv 와 같은 문서를 작성해 게임의 내용을 저장할 수도 있으나 훨씬 더 코드를 작성하기 편하면서 유저가 함부로 세이브파일을 뜯어볼 수 없고 파일 확장자명도 내 마음대로 지정 가능하도록 하기 위해 바이너리 파일로 저장한다. 아이디어 저장할 정보들을 담는 구조체를 정의한다. 파일 경로과 저장할 정보들을 담는 구조체를 참조해 저장/불러오기 를 구현한다. 파일 경로에 해당하는 파일을 바이너리 모드로 연다. 구조체의 내용을 구조체의 크기만큼 메모리에 저장/불러오기 한다. SaveFile 구조체 // saveload.h..