컬렉션에 들어 있는 객체별로 한 프레임 단위의 작업을 진행하라고 알려줘 전체를 시뮬레이션한다.

 

모든 개체가 자신의 동작을 캡슐화(update 함수로 만들기)해야 게임 루프에 개체를 쉽게 추가, 삭제할 수 있다.

큰 update 안에 각 객체마다의 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. 활성 객체만 모여 있는 컬렉션을 하나 더 둘 경우

ㄴ 두 번째 컬렉션을 위해 메모리를 추가로 사용해야 한다.

ㄴ 컬렉션 두 개의 동기화를 유지해야 한다. (객체가 생성되거나 소멸되는 경우 두 컬렉션을 모두 변경해야 한다.)

ㄴ 비활성 객체가 많을수록 컬렉션을 따로 두는 게 좋다.

 

+ Recent posts