PP vs. OOP vs. DOP
Procedural Programing (절차적 프로그래밍)
- 데이터를 중심으로 함수를 만들어 사용
- 프로그램이 함수화 되어 순차적으로 처리
- 프로그램 전체가 유기적으로 연결
- 장점
- 컴퓨터의 처리구조와 유사해 실행속도가 빠름
- 단점
- 유지보수가 어려움
- 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일 결과 보장하지 않음
- 디버깅이 어려움
Object Oriented Programming (객체 지향 프로그래밍)
- 객체 지향 언어의 등장 계기
- 하드웨어가 소프트웨어의 발달에 따라가지 못함
- 기능별로 묶어 모듈화
- 데이터와 기능을 묶어 객체로 활용
- 실제 세계를 모델링하여 소프트웨어를 개발하는 방법
- 데이터와 절차(기능)를 하나의 덩어리로 묶음
- 객체안에 데이터와 기능을 묶어 지역성(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와는 독립된 개념으로서, 어떤 방식의 프로그래밍과도 함께 쓰일 수 있다