Main Content

효과적으로 객체 변환

회전과 같이 객체를 이동하려면 객체를 정의하는 데이터를 변환해야 합니다. 그래픽스 하드웨어가 변환을 데이터에 적용할 수 있다는 사실을 활용하여 성능을 향상시킬 수 있습니다. 그러면 변환된 데이터를 렌더러로 전송하는 것을 방지할 수 있습니다. 그 대신, 4×4 변환 행렬만 전송합니다.

이 접근 방식의 성능 이점을 얻으려면 hgtransform 함수를 사용하여 이동할 객체를 그룹화합니다.

다음 예제에서는 성능을 비교하기 위해 두 가지 기법을 사용하여 구를 정의하고 회전합니다.

  • rotate 함수는 매번 drawnow를 호출할 때마다 구의 데이터를 변환하고 데이터를 렌더러 스레드로 전송합니다.

  • hgtransform 함수는 동일한 회전에 대한 변환 행렬을 렌더러 스레드로 전송합니다.

성능이 낮은 코드성능이 높은 코드

객체 데이터가 크면 업데이트 병목 현상이 제한 요소가 됩니다.

% Using rotate
figure
[x,y,z] = sphere(270);

s = surf(x,y,z,z,'EdgeColor','none');
axis vis3d
for ang = 1:360
   rotate(s,[1,1,1],1)
   drawnow
end

hgtransform을 사용하면 병목 현상의 렌더러 측에서 변환이 적용됩니다.

% Using hgtransform
figure
ax = axes;
[x,y,z] = sphere(270);

% Transform object contains the surface
grp = hgtransform('Parent',ax);
s = surf(ax,x,y,z,z,'Parent',grp,...
   'EdgeColor','none');

view(3)
grid on
axis vis3d

% Apply the transform
tic
for ang = linspace(0,2*pi,360)
   tm = makehgtform('axisrotate',[1,1,1],ang);
   grp.Matrix = tm;
   drawnow
end
toc