PP vs. OOP vs. DOP

Procedural Programing (절차적 프로그래밍)

post_thumbnail

  • 데이터를 중심으로 함수를 만들어 사용
  • 프로그램이 함수화 되어 순차적으로 처리
  • 프로그램 전체가 유기적으로 연결
  • 장점
    • 컴퓨터의 처리구조와 유사해 실행속도가 빠름
  • 단점
    • 유지보수가 어려움
    • 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일 결과 보장하지 않음
    • 디버깅이 어려움

Object Oriented Programming (객체 지향 프로그래밍)

post_thumbnail

  • 객체 지향 언어의 등장 계기
    • 하드웨어가 소프트웨어의 발달에 따라가지 못함
  • 기능별로 묶어 모듈화
  • 데이터와 기능을 묶어 객체로 활용
  • 실제 세계를 모델링하여 소프트웨어를 개발하는 방법
  • 데이터와 절차(기능)를 하나의 덩어리로 묶음
    • 객체안에 데이터와 기능을 묶어 지역성(principle of locality)가 있음
  • 캡슐화, 상속, 다형성의 특징
  • 장점
    • 신뢰성 있는 소프트웨어 작성
      • 개발자가 직접 삽입한 데이터이므로 신뢰성 증가
    • 코드 재사용 가능
    • 업데이트 및 디버깅에 용이
  • 단점
    • 모듈의 일부 기능만 사용한다하더라도 모듈 전체를 호출해야 하므로 프로그램의 크기 증가
    • 처리속도가 절차 지향보다 느림
    • 설계에 많은 시간 투자 필요

OOP와 PP의 기준

  객체 지향 절차 지향
캡슐화, 다형성, 상속을 지원하는가? O X
데이터 접근이 제한되어있는가? O X

Data Oriented Programming (데이터 지향 프로그래밍)

  • 캐시 미스를 줄여서 램이 데이터를 불러오는 동안 CPU idling을 최소화 하는 것
  • 데이터의 타입, 메모리에 어떻게 배치될 것인가, 게임 내에서 어떻게 읽어서 처리할 것인가를 중심에 놓는 것
  • 캐시 미스의 플로우
    • 캐시 라인이 정해진 단위(일반적으로 64bytes)로 데이터를 불러오고 저장
    • 캐시에 불러온 데이터 중 참조할 데이터의 크기는 12 bytes
    • 나머지 데이터는 사용하지 않으므로 정크
// 증가 함수
void increment(int *i)
{
  ++(*i);
}

// 전제:
// 1. i_n 뱐수들은 메모리 주소상 떨어져 있음
// 2. j 변수들(하나의 array)는 메모리 주소상 인접해있음
int i_1 = 0, i_2 = 0; 
int j[4] = {0};
int i_3 = 0, i_4 = 0;

// 캐시 히트 확률 증가
// 메모리 주소가 인접해 있기 때문에,
// j[0]이 캐시에 올라갈 때, j[1], ... 등이
// 함께 캐시라인에 포함돼 올라감
for (int idx = 0; i < 4; ++i)
{
  increment(j[i]);
}

// 캐시 미스 확률 증가
// 메모리 주소가 떨어져 있기 때문에,
// 4개 원소 모두 캐시 미스 확률이 높음
// 데이터 참조하는 데 사이클 낭비 발생
increment(i_1);
increment(i_2);
increment(i_3);
increment(i_4);
  • 데이터 주도형 디자인 (Data-driven Design)과는 관계가 없다
    • 게임의 기능을 최대한 코드 밖으로 빼내서 데이터쪽으로 옮기는 것을 의미
    • DOP와는 독립된 개념으로서, 어떤 방식의 프로그래밍과도 함께 쓰일 수 있다

출처

Categories: ,

Updated: