Преобразование объектов эффективно

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

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