이름이 참으로도 눈길이 가는 패턴이다.
여기서 말하는 플래그는 비트를 의미한다. (참 또는 거짓)
더티 플래그라는 말의 어원은 확실하지 않다고 한다.
의미 상으로는 ‘더이상 맞지 않음’을 나타내는 플래그라고 한다.
더티 플래그가 필요한 상황
유니티에서 다음과 같은 오브젝트의 트랜스폼을 계산한다고 해보자.
각 오브젝트들의 Transform
은 상위 오브젝트 Transform
으로부터 상대적인 위치값을 가진다.
하지만 이걸 화면에 렌더링 해주려면 절대적인 위치값, 즉 월드 좌표값이 필요하다.
그러면 Object4의 월드 좌표값을 얻기 위해서는 Object3 기준의 위치 변환을 해주고, Object2 기준의 위치 변환을 해주고, Object1 기준의 위치 변환을 해줘야 한다!
벌써부터 마음에 안들지 않은가?
심지어 골때리는 상황은 그거다.
Object1이 이동하면 Object2의 월드 좌표계를 다시 얻어와야 하고, Object3의 월드 좌표계를 다시 얻어와야 하고, Object4의 월드 좌표계를 다시 얻어와야 한다!
그 뒤 Object2가 이동하면 Object3의 월드 좌표계를 다시 얻어와야 하고, Object4의 월드 좌표계를 다시 얻어와야 한다!
또 Object3가 이동하면 Object4의 월드 좌표계를 다시 얻어와야 한다.
Object1, Object2, Object3이 한 번씩 이동했더니 무려 Object4의 월드 좌표계가 세 번이나 업데이트했다.
렌더링 과정에서, 한 프레임동안 Object1, Object2, Object3이 이동했다 하더라도 Object4의 월드 좌표계는 단 한 번만 갱신해주면 되는데, 세 번이나 월드 좌표계 계산이 이루어졌으니 얼마나 비효율적인가?
따라서 우리는 불필요한 작업을 피하기 위해 실제로 필요할 때까지 그 일을 미룬다.
이것을 더티 플래그라고 한다.
더티 플래그는 주로 계산이나 동기화를 해야하는 상황에서 사용된다.
파생 값이 사용되는 횟수보다 기본 값이 변경되는 상황이 더 자주 있을 경우, 값이 점진적(규칙적)으로 업데이트 되는 상황이 아닌 경우에 유용하다.
주의사항
너무 오래 지연하려면 비용이 든다.
작업을 지연하다가 값이 파생될 때 계산을 시작한다고 했을 때, 계산이 늦어져 버린다면? 그대로 멈춤 현상이 발생하는 것이다.
즉, 적당히 지연되다가 파생이 이루어지기 직전에는 계산이 끝나있어야 한다는 것이다.
작업을 지연하다가 작업이 날아가버릴 수도 있다는 점은 덤이다.
상태가 변할 때마다 플래그를 켜야 한다.
파생 값은 기본 값으로부터 계산되기 때문에 기본 값을 변경하는 모든 코드가 더티 플래그를 같이 설정하는 것이 보장되어 있어야 한다.
더티 플래그를 설정하지 않는 외부 코드가 기본 값을 변경한다면?
파생값에 의미가 완전히 없어지는 것이다.
이전 파생 값을 메모리에 저장해둬야 한다.
파생 값을 가져올 때, 더티 플래그가 꺼져 있다면 미리 계산해둔 파생 값을 그대로 쓰면 된다.
근데 이러려면 이전 파생 값을 당연히 메모리에 저장해놔야 한다.
Uploaded by N2T
'개발 > 게임 디자인 패턴' 카테고리의 다른 글
게임 디자인 패턴 15. 공간 분할 패턴 (Spatial Partition Pattern) (0) | 2023.11.12 |
---|---|
게임 디자인 패턴 14. 객체 풀 패턴 (Object Pool Pattern) (0) | 2023.11.09 |
게임 디자인 패턴 12. 서비스 중개자 패턴 (Service Mediator Pattern) (0) | 2023.11.07 |
게임 디자인 패턴 11. 이벤트 큐 (Event Queue) 패턴 (1) | 2023.11.06 |
게임 디자인 패턴 10. 컴포넌트 패턴 (Component Pattern) (0) | 2023.11.03 |