포스트

게임 프로그래밍 패턴 | Chapter 1. 구조, 성능, 게임

게임 프로그래밍 패턴 Chapter 1 정리

게임 프로그래밍 패턴 | Chapter 1. 구조, 성능, 게임

책 정보 📖

  • 책 제목: 게임 프로그래밍 패턴
  • 글쓴이: 로버트 나이스트롬
  • 옮긴이: 박일
  • 출판사: 한빛미디어
  • 발행일: 2016년 06월 01일
  • 챕터: Chapter 1. 구조, 성능, 게임

책소개

비슷한 기능을 매번 새롭게 코딩하는 개발자들에게 바치는 트리플 A 게임을 지탱하는 설계 방법론

이 책은 20년 경력의 개발자가 게임을 만들며 발견한 13가지 패턴을 정리한 책이다. 저자는 GoF의 디자인 패턴을 승계하고 가다듬어 게임에 특화된 프로그래밍 디자인 패턴을 정립했고, 이를 통해 성능을 높이면서도 구조적으로 훌륭한 소프트웨어를 설계하는 법을 알려준다. 이 패턴들은 당신의 게임 코드를 더 깨끗하고, 더 이해하기 쉽고, 무엇보다 더 빠르게 만들어줄 것이다.

대상 독자

  • 대상 독자: 디자인 패턴에 관심있는 개발자, 깔끔한 구조와 코드에 관심있는 개발자자

학습 목표 🎯

  • 다양한 디자인 패턴에 대해 알아보고 직접 적용할 수 있는 것은 적용하기
  • 좋은 구조와 코드를 짜기 위한 밑거름을 만들기

핵심 개념 🧩

  • 구조와 디커플링: 구조는 변경과 관련 있으며, 코드 변경 시 연관된 지식의 양을 줄이는 것을 디커플링이라 한다.
  • 생산성과 구조의 균형: 좋은 구조는 생산성을 높이지만, 복잡성도 함께 증가시키므로 균형이 중요하다.
  • 성능과 유연성의 트레이드오프: 추상화와 인터페이스는 유연성을 제공하나, 성능 저하를 초래할 수 있다.

주요 내용 📚

1. 소프트웨어 구조란?

  • 요점: ‘어떻게 코딩할 것인가?’ 보다는 ‘어떻게 구조를 잡을 것인가?’
    • 코드를 거의 건드리지 않고 적당한 함수 몇 개만 호출하면 원하는 작업을 할 수 있어야 좋은 소프트웨어 구조라고 생각한다.
    • 구조는 변경과 관련이 있다.
    • 코드를 고치려면 최소한 고치려는 코드와 관련된 부분은 머릿속에 집어 넣어야 한다. → 가장 오래 걸리는 부분이다.
    • 양쪽 코드 중에서 한쪽이 없으면 코드를 이해 할 수 없을 때 “커플링”되어 있다고 본다.
    • “디커플링”은 작업에 들어가기 전에 알아야 하는 지식의 양을 줄이는 것이며 이는 곧 변경이 나머지 게임 코드에 미치는 영향이 작다는 것이다.
  • 이해를 돕는 그림 또는 코드

    game design pattern 1-1.jpg

2. 비용은?

  • 요점: 좋은 구조는 생산성을 크게 높여준다.
    • 말처럼 쉽지 않으며 원칙과 끊임없는 노력이 필요하다.
    • 추상화, 모듈화, 디자인 패턴 등을 고려하다 보면 코드를 추가하고 복잡성이 증가하며 유지 보수, 개발 ,디버깅에 시간이 더 걸리게 된다.
    • 게임 출시라는 사실을 잊고 코드에 둘러싸이다 보니 소프트웨어 구조, 디자인 패턴으로부터 사람들이 등을 돌리게 만들기도 했다. → 게임 개발이 아닌 엔진 그 자체에 시간을 낭비하게 만든다.

3. 성능과 속도

  • 요점: 게임을 유연하게 만드는 코드들은 성능을 저하 시킨다는 비판도 있지만 각자의 사용에는 이유가 있다.
    • 소프트웨어 구조와 추상화가 게임 성능을 저하 시킨다는 비판이 있다.
    • 코드를 유연하게 만드는 많은 패턴이 가상 함수, 인터페이스, 포인터, 메시지 같은 메커니즘에 의존한다.
    • 인터페이스를 쓰는 이유는 지금의 클래스뿐만 아닌 같은 인터페이스를 구현하는데 어떤 클래스가 와도 코드가 문제 없이 동작하게 만들기 위함이다.
    • 유연성이 좋아야 게임을 쉽게 변경할 수 있는 만큼 유연성이 나쁜 것은 결코 아니다.
    • 개발 속도는 게임 재미를 찾는데 꼭 필요하다. → 빠른 프로토타이핑을 위해 프로그램을 유연하게 만든다.
    • 반대로 코드를 최적화 하면 유연성이 떨어진다.
    • 재미있는 게임을 최적화하는 것이 최적화된 게임을 재미있는 게임으로 만드는 것보다 훨씬 쉽다!

4. 나쁜 코드의 장점

  • 요약: 코드를 유지 가능하고 깔끔하게 만드는 내용을 다루지만 엉성한 코드도 나름의 가치가 있다.
    • 구조화가 잘된 코드를 작성하려면 많은 고민이 필요하다. 즉, 시간이 필요하다.
    • 좋은 구조를 개발 기간 내내 유지하려면 엄청난 노력을 들여야 한다.
    • 기획 확인에 필요한 기능만 간신히 돌아가도록 만드는 프로토타이핑 기법은 아주 적법한 프로그래밍 실천 법이다.
    • 버릴 코드는 나중에 확실히 버릴 수 있게 해야 한다.
    • 버릴 코드가 유지되어야 할 가능성이 있다면 방어적으로 만들어야 할 필요가 있을지도 모른다.

5. 균형 잡기

  • 요약: 다음과 같은 목표가 있지만 장단점이 각각 다르므로 트레이드오프 외에는 명쾌한 정답이 없다.

    1
    2
    3
    
      1. 프로젝트 개발 기간 동안 코드를 쉽게 이해할 수 있도록 구조를 깔끔하게 만들고 싶다.
      2. 실행 성능을 최적화하고 싶다.
      3. 지금 개발 중인 기능을 최대한 빠르게 구현하고 싶다.
    

6. 단순함

  • 요약: 이러한 제약을 완화할 방법이 혹시라도 하나 있다면 단순함일 것이다.
    • 코드를 최대한 간결하게, 문제를 직접 해결하는 방향으로 짜려고 노력하면 이런 코드는 의도를 바로 알 수 있고, 그 외의 다른 해결 방법이 떠오르지 않는다.
    • 코드를 자료구조, 알고리즘부터 시작해 방법을 찾아가며 단순하게 유지하면 전체 코드가 줄고 이러면 수정 시에 머리에 담아야 할 코드 양이 줄어든다.
    • 코드를 덧붙이는 게 아니라 필요 없는 코드를 최대한 빼는 것이 중요하다.
    • 문제들은 대부분 우아하지 않고 수많은 유스케이스로 뒤덮여 있으며 수많은 상황을 지원해야 한다.
    • 우아한 해결책은 일반적인, 그러니까 적은 로직으로도 수많은 유스케이스를 정확하게 처리 할 수 있는 코드를 뜻한다.

7. 마치며

  • 요약: 서문을 읽는데 고생했으며 다음과 같은 조언을 해주었다.
    • 추상화와 디커플링을 잘 활용하면 코드를 점차 쉽고 빠르게 만들 수 있지만 지금 고민 중인 코드에 유연함이 필요하다는 확신이 없다면 추상화와 디커플링에 시간 낭비하지 말자.
    • 개발 내내 성능을 고민하고, 최적화에 맞게 설계 해야 한다. 하지만 가정을 코드에 박아 넣어야 하는 저수준의 핵심 최적화는 가능하면 늦게 하라.
    • 게임 기획 내용을 확인해볼 수 있도록 빠르게 개발하되, 너무 서두르느라 코드를 엉망으로 만들지 말자. 결국 그 코드로 작업해야 하는 것은 우리다.
    • 나중에 버릴 코드를 잘 만들겠다고 시간 낭비하지 말자. 록 스타들이 호텔 방을 어지르는 이유는 다음날 계산하고 나가면 그만이라는 것을 알기 때문이다.
    • 무엇보다, 뭔가 재미있는 걸 만들고 싶다면 먼저 만드는 데에서 재미를 느껴보라.

기억할 점 🔖

  • 중요 키워드 및 정의
    • 디커플링: 양쪽 코드 중에서 한쪽이 없으면 코드를 이해 할 수 없을 때 “커플링”, 반대로 디커플링은 작업에 들어가기 전에 알아야 하는 지식의 양을 줄이는 것
    • 좋은 구조: 코드를 거의 건드리지 않고 적당한 함수 몇 개만 호출하면 원하는 작업을 할 수 있어야 좋은 소프트웨어 구조이다.
    • 프로토타이핑 기법: 기획 확인에 필요한 기능만 간신히 돌아가도록 만드는 프로그래밍 기법

질문 및 의문점 ❓


요약 및 개인적 생각 ✏️

  • 전체 내용을 간략히 요약
    • 전체적으로 구조의 중요성과 디커플링을 통해 유지 보수의 효율성을 높일 수 있지만, 복잡성과 성능 저하를 관리하는 것이 중요하다. 빠른 프로토타이핑과 코드의 단순함을 유지하여 실용적인 균형을 찾는 것이 권장된다.
    • 특히, 최적화를 우선시하는 것보다 게임의 재미를 우선 고려하여 개발한 뒤 최적화하는 방식이 더 효과적이라는 점을 명심할 필요가 있다.
  • 개인적인 의견이나 학습 소감

    재미있는 게임을 최적화하는 것이 최적화된 게임을 재미있는 게임으로 만드는 것보다 훨씬 쉽다!” 이 한 줄이 가장 기억에 남는 것 같다. 최적화에 너무 매몰되지 않는 것도 중요하다는 것을 깨닫게 해주는 한 줄이었다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.