1. 개요
이전글에서 VTK Pipeline의 동작에 대해서 알아봤었다.
VTK Pipeline 동작방식을 간단히 정리해보면 Chain 방식과 Demand-driven 방식이다.
각 Filter 들은 SetInpuConnection 을 통해서 서로 연결을 하며, Update 요청에 따라 Upstream request 가 발생하여 각 filter마다 변경사항이 있는지를 확인하고 변경사항이 있을 경우에만 Updated 된 데이터를 반영하여 결과 값을 다음 filter에게 전달하도록 한다.
하지만, 우리는 VTK에는 Pipeline 방식 뿐만 아니라 Data 입력방식 또한 알아야 한다.
간단히 말해서 Chain 으로 연결되지 않고 일회성으로 데이터가 연결되어 Upstream request 가 전달되지 않는 상황이다.
몇몇 시나리오를 통해서 Pipeline과 Data 입력에 따라 Update 가 어떻게 동작하는지 알아보고자 한다.
2. Update() & Modified()
Update는 기본적으로 연결되어 있는 Pipeline의 최상단까지 변경된 것이 있는지를 확인한다.
이떄 사용하는 값이 Modification time(MTime) 인데, 기본적으로 filter의 속성 값을 변경할 경우에 자동으로 업데이트 된다.
만약 SetInputData의 입력인 경우에 MTime 이 업데이트 되지 않는 경우가 있으면 직접 Modified() 함수를 호출하면 된다.
Update 는 Pipeline 연결에 따라 입력 필터의 MTime 이 변경되었는지 확인하고 변경되었다면 출력 값을 업데이트한다.
3. Pipeline (Dynamic Connection)
Pipeline으로 연결되어 있을 경우에는 Filter의 변경이 가장 마지막에 있는 곳에서 Update를 수행하는 것이 최적화에 좋다.
만약 중간 filter에서 update를 요청하고 마지막에 또 Update를 하면 중복 요청이 되므로 부하만 더 발생한다.
아래는 여러개의 Filter 가 연결되어 있고 중간마다 변경이 있더라도 Update를 필요한 시점에서 호출하도록 한다.
그리고 만약에 Interaction event 와 연결된 경우에는 Update를 하지 않아도 Renderwindow 에서 update 가 발생하기 때문에 filter 에서는 update 요청을 생략할 수 있다.
4. InputData (Static Connection)
SetInputData로의 연결은 Pipeline 연결이 끊어져 있다고 생각하면 된다.
아래의 경우 Filter 3이 SetInputData로 Filter 4의 vtkDataObject로 연결되어 있을 경우 Filter 5의 Update는 Filter 4까지만 Upstream request가 도달한다. 따라서 Filter 2의 변경 사항을 확인할 수 없다.
만약에 Filter 2와 같이 SetInputData 이전의 Filter에서 변경이 있을 경우에는 직접 Update를 수행한 후 Filter4에서 SetInputData를 다시 수행해서 업데이트를 해야한다. 그리고 SetInputData으로 데이터를 변경한 경우에는 MTime 이 업데이터 되지 않는 경우가 있다. 이럴 경우에는 Modified를 직접 호출해야 한다.