컬렉션에 들어 있는 객체별로 한 프레임 단위의 작업을 진행하라고 알려줘 전체를 시뮬레이션한다.
모든 개체가 자신의 동작을 캡슐화(update 함수로 만들기)해야 게임 루프에 개체를 쉽게 추가, 삭제할 수 있다.
10.4 업데이트 메서드는 언제 쓰는 것이 좋은가?
1. 동시에 동작해야 하는 객체나 시스템이 게임에 많은 경우
2. 각 객체의 동작은 다른 객체와 독립적이어야 한다.
3. 객체는 시간의 흐름에 따라 시뮬레이션되어야 한다.
10.5 주의사항
1. 코드를 한 프레임 단위로 끊어서 실행해야 하기 떄문에, 코드가 복잡해질 수 있다.
2. 다음 프레임에서 다시 시작할 수 있도록 현재 상태를 저장해야 한다. (상태 패턴(7장) 을 사용하면 좋다.)
3. 모든 객체는 매 프레임마다 시뮬레이션되지만 진짜로 동시에 되는 건 아니다.
ㄴ 객체 업데이트 순서를 신경 써야 한다. 한 위치에 하나의 객체만 존재할 수 있다고 가정할 때, 서로 다른 두 객체 A와 B가 같은 위치로 움직이려 한다면 업데이트 순서에 따라 결과가 다를 것이다.
순차적으로 업데이트를 진행하지 않고 병렬적으로 객체를 업데이트 하고 싶다면 (이중 버퍼 패턴(8장) 같은 게 필요하다.)
4. 업데이트 도중에 객체 목록을 바꾸는 건 조심해야 한다.
ㄴ 업데이트 도중 객체를 추가하거나 제거할 때 순차적으로 update하다 보면 아직 렌더링 되지 않은 객체의 update문이 실행될 수도 있고, 업데이트하려는 객체 이전에 있는 객체를 삭제할 경우, 객체를 하나 건너뛸 수 있다.
ㄴ 객체 추가 문제는 업데이트 가능 객체 개수를 프레임 시작시에 미리 저장하여 해결할 수 있고, 객체 삭제 문제는 순회 변수를 조정하거나 객체에 '죽었음' 표시를 하고, 전체 루프가 끝날 때 객체 컬렉션에서 제거하여 해결할 수 있다.
10.7 디자인 결정
업데이트 메서드를 어느 클래스에 둘 것인가?
1. 개체 클래스
개체마다 update() 함수를 정의 (
2. 컴포넌트 클래스
컴포넌트 패턴은 한 개체의 일부를 개체의 다른 부분들과 디커플링 한다.
컴포넌트는 알아서 자기 자신을 업데이트 한다.
3. 위임 클래스
개체의 update() 내부에서 다른 클래스의 update() 를 호출
여러 개체가 동작을 공유할 수 있게 해준다.
휴면 객체 처리
update가 필요 없는 객체가 생기는 경우 순회 객체 대상에서 제거 해야 한다.
살아 있는 객체만 컬렉션에 모아두면 된다.
1. 비활성 객체가 포함된 컬렉션 하나만 사용할 경우
ㄴ 활성 상태인지 확인하여 아니면 넘어간다. (CPU 클럭 낭비 & 데이터 캐시 낭비)
2. 활성 객체만 모여 있는 컬렉션을 하나 더 둘 경우
ㄴ 두 번째 컬렉션을 위해 메모리를 추가로 사용해야 한다.
ㄴ 컬렉션 두 개의 동기화를 유지해야 한다. (객체가 생성되거나 소멸되는 경우 두 컬렉션을 모두 변경해야 한다.)
ㄴ 비활성 객체가 많을수록 컬렉션을 따로 두는 게 좋다.
'읽은 책 > 게임 프로그래밍 패턴' 카테고리의 다른 글
12. 행동 패턴 - 하위 클래스 샌드박스 (0) | 2022.07.16 |
---|---|
11. 행동 패턴 - 바이트코드 (0) | 2022.07.16 |
9. 순서 패턴 - 게임 루프 (0) | 2022.07.15 |
8. 순서 패턴 - 이중 버퍼 (0) | 2022.07.15 |
7. 디자인 패턴 - 상태(state) (0) | 2022.07.15 |