Эффективное преобразование объектов

Перемещение объектов, например, поворотом, требует преобразования данных, определяющих объекты. Можно улучшить эффективность, используя тот факт, что графическое оборудование может применить преобразования к данным. Затем можно избежать отправки преобразованных данных в средство отображения. Вместо этого вы отправляете только матрицу преобразования четыре на четыре.

Чтобы реализовать преимущества этого подхода для эффективности, используйте 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