flow-vector
[오브젝트] - 설계 품질과 트레이드오프

💡 조영호님의 오브젝트를 읽고 생각을 정리하였습니다. 객체지향 설계를 하는 이유는 궁극적으로 앞으로의 설계 변경에 쉽게 대응하기 위함인 것 같다. 책에서는 왜 객체지향설계를 하면 설계변경에 대응하기 쉬운지 데이터지향 설계를 했을 때의 단점을 보여주면서 설명해 주고 있다. 또한 좋은 설계를 판단하는 기준으로 캡슐화, 응집도, 결합도에 대해서 설명하고 있다. 캡슐화 목적 객체의 내부 구현을 외부로 부터 감추는 것 구현이란? 변경 가능성이 높은 부분 인터페이스? 상대적으로 안정적인 부분 불안정한(변경가능성 높은) 구현 세부사항을 안정적인 인터페이스 뒤로 캡슐화하자 궁극적으로 이뤄내려는 것 높은 응집도와 낮은 결합도는 캡슐화로 부터 나온다 응집도 변경이 발생할 때 모듈 내부에서 발생하는 변경의 정도 하나의 변경..

[오브젝트] - 역할, 책임, 협력

💡 조영호님의 오브젝트를 읽고 생각을 정리하였습니다. 이번 장에서는 시스템을 객체지향 패러다임을 통해 만들기 위해 “객체들의 협력하는 공동체”를 만들어야한다는 전제하에 어떤 사고의 흐름을 통해 만들어 낼 수 있을 것인가를 설명하고 있다. 객체 한 개를 만들기 위해 어떤 사고 과정을 거쳐 나가야할까? 어떤 애플리케이션에 객체가 존재하는 이유는 해당 객체가 “협력”에 참여 하고 있기 때문이다. 즉, 객체는 협력에 필요한 특정 행동을 하고 있을 것이다. 따라서 아래의 사고 과정을 거쳐서 하나의 객체를 만들 수 있을 것이다. 기능 제공을 위해 어떤 협력이 필요할까? (베이스 깔고 가는생각) 협력은 설계를 위한 문맥을 제공하기 때문에 가장 우선시 되어 생각되어야한다. 협력 안에서 어떤 책임(행동)이 필요할까? 시..

[오브젝트] - 객체, 설계

💡 조영호님의 오브젝트를 읽고 생각을 정리하였습니다. 조영호님의 “객체지향의 사실과 오해”라는 책을 읽고 어느 정도 객체지향이란 무엇 인가에 대해 느낌을 얻을 수 있었습니다. 하지만 해당 책에서는 코드보다는 이상한 나라의 엘리스에서의 예시를 가지고 설명을 해주어서 모호한 느낌을 받은 부분이 있었습니다. 현재 프로그램을 개발하면서, 객체의 책임과 역할에 대해서 생각해보고 어떤 메세지를 통해 서로 소통할 수 있게 할 것인가 고민하던 찰나 좋은 코드를 보고 싶다는 생각이 들었습니다. 마침 “ 오브젝트” 라는 책에서는 실제 코드를 기준으로 이야기를 해준다고 해서 읽게 되었고 읽은 내용을 정리하고자 합니다. 첫번째 챕터는 마치 “객체지향의 사실과 오해” 요약본 같았습니다. 중요 키워드로는 의존성, 캡슐화, 설계 ..

article thumbnail
프로젝트 셋팅 - 진행 시 규칙
Project/GameEngine 2024. 1. 25. 15:09

Coding Convention & format 포프의 c++ 코딩 표준을 따른다 https://docs.popekim.com/ko/coding-standards/cpp .clang-format을 사용하여 동일 포멧을 유지 한다 규칙 예시 들여쓰기 2 space .clang-format 적용하는 방법 https://www.youtube.com/watch?v=Mn4Yc7-kvT0 폴더 구조 및 규칙 명명 규칙 폴더명은 소문자를 사용 파일명은 파스칼케이스 사용 역할 binary 프로젝트 타겟 파일 저장 ex) 동적라이브러리, 실행파일 build build_util 빌드에 필요한 유틸 파일 intermediate cmake 빌드를 통해 만들어지는 파일들 external 외부 라이브러리 저장소 glfw, gla..

나만의 게임 엔진 개발 하기 - 시작
Project/GameEngine 2023. 12. 31. 22:46

지금 까지 공부한 내용을 바탕으로 간단한 나만의 게임엔진을 만들어 보기로 하였다. 목적은 어느정도 규모 있는 프로그램을 만들어 보면서 공부한 내용 복습 및 개발 과정에서 발생하는 문제를 해결하면서 새로운 걸 배울 수 있을 것 같기 때문이다. 앞으로 만들 프로그램이 어떤 것인지에 대한 정의를 해보고 어떤 기능을 만들어 볼지 적어보려고 한다. 내가 생각하는 게임 엔진의 기본 기능 특정 파일의 데이터를 불러와 프로그램 내부에서 정의한 자료구조에 저장한다. 파일 i/o 저장된 데이터 형식에 알맞은 처리를 한여 모니터에 그린다. 렌더러 기능 실시간으로 사용자와 소통하여 화면에 그려진 물체가 변환 되어야함 event 처리 기능 구현 목표 수학 라이브러리와 obj, png파일 로더 구현 이미 훌륭한 라이브러리는 존재..

article thumbnail
상용 엔진 구조 분석 - Godot Engine
Project/GameEngine 2023. 12. 31. 21:43

Architecture Diagram 채택한 방식들 커스텀 자료구조 사용 이유 stl 사용시 디버깅 바이너리가 너무 커짐 (템플릿 인스턴스화로 인해) 큰 배열을 사용하려고 할때, 미리 할당된 버퍼와 연결됨 손쉬운 메로리 트래킹 방법이 내장 되어 있음 다국어 문자열 처리 문제를 해결하는 별도의 string 타입을 사용 예외 사용 안함 어떤 경우에도 crash를 허용하지 않음 예외 상황이 발생 했을 때는, error를 출력하고 계속 프로그램이 진행 되도록 함 예외를 사용할 경우 실행파일 크기가 커지고 컴파일시간이 증가하는 단점이 있 ECS 사용 안함 오픈 소스이기 때문에 여러 사용자들이 이해하기 편한 엔진 구조는 명시적인 상속 구조가 드러나는 구조라고 생각했기 때문 Why isn't Godot an ECS-..

article thumbnail
그래픽스 파이프라인

들어가기 컴퓨터 그래픽스를 공부하면서 Blender와 같은 간단한 렌더러를 우선 만들어 보는 것을 목표로 하였습니다. OpenGL, DirectX 사용해 보면서 처음 GPU를 활용한 렌더링을 해보았는데 이때 중요한 개념인 그래픽 파이프라인에 대해 정리해 보려고 합니다. [틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다!] 파이프라인이란? 먼저 파이프라인이란 간단하게 데이터 처리 단계를 말합니다. 따라서 그래픽 파이프 라인이란 화면에 어떤 물체를 그리기 위해 행해지는 일련의 데이터 처리 단계입니다. 데이터 처리는 어디서 이루어 질까? [CPU VS GPU] 물체를 화면에 그리기위해서 처리 되어야 하는 데이터의 종류는 다양합니다. 데이터의 종류에 따라 CPU 혹은 GPU에서 처리됩니다. CPU에서 처리되..

article thumbnail
게임 수학 - 노멀 벡터의 회전
Math/Game Math 2023. 12. 20. 14:29

문제 어떤 벡터 A에 수직한 노멀 벡터 N을 변환할 때, 단순히 변환행렬을 곱해 주면왜곡이 생기는 경우가 있음을 알게 되었습니다. 원인 해당 경우는 벡터 A가 non-uniform scale이 될 경우 였는데 이유는 아래 그림을 보면 쉽게 알 수 있습니다. 해결 결론적으로 해결방법은 변환 행렬의 Inverse-transepose를 곱해주면 해결이 됩니다. 증명은 luna의 introduction to 3d game programming with directx12에서 참고 하였습니다.