효과적으로 객체 변환
회전과 같이 객체를 이동하려면 객체를 정의하는 데이터를 변환해야 합니다. 그래픽스 하드웨어가 변환을 데이터에 적용할 수 있다는 사실을 활용하여 성능을 향상시킬 수 있습니다. 그러면 변환된 데이터를 렌더러로 전송하는 것을 방지할 수 있습니다. 그 대신, 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 |
% 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 |