Оптимизируйте код для получения и установки графических свойств

Автоматически вычисляемые свойства

Определенные свойства имеют зависимости от значения других свойств. MATLAB® автоматически вычисляет значения этих свойств и обновляет их значения на основе текущей графической модели. Например, пределы по осям влияют на значения, используемые для меток деления на оси, которые, в свою очередь, влияют на метки метки деления на оси.

Когда вы запрашиваете расчетное свойство, MATLAB выполняет неявное drawnow чтобы гарантировать все значения свойств актуальны прежде, чем возвратить значение свойства. Запрос вызывает полное обновление всех зависимых свойств и обновление экрана.

MATLAB вычисляет значения определенных свойств на основе других значений, от которых зависит то свойство. Например, функции построения графика автоматически создают оси с пределами по осям, метками в виде галочки и размером, подходящим для отображенных на графике данных и размера фигуры.

Графика MATLAB выполняет полное обновление, при необходимости, прежде, чем возвратить значение из расчетного свойства гарантировать, что возвращенное значение актуально.

Эта таблица приводит некоторые чаще всего расчетные свойства.

ОбъектСвойстваКогда MATLAB Вычисляет эти Свойства

Оси

CameraPositionCameraTarget , CameraUpVectorCameraViewAngle

Всегда

 

PositionOuterPosition , TightInset

Всегда

 

XLimylimzlim

Всегда

 

XTick, YTick, ZTick, XMinorTick, YMinorTick, ZMinorTick

Всегда

 

XTickLabel, YTickLabel, ZTickLabel, TickDir

Всегда

 

SortMethod

Всегда

Текст

Extent

Всегда

 

Position

Только, когда текстовый объект используется в качестве заголовка осей или подписи по осям

 

FontSizeFontWeight

Только, когда текстовый объект используется в качестве заголовка осей или подписи по осям

Неэффективные циклы получения и установки свойств

Когда вы устанавливаете значения свойств, вы изменяете состояние графической модели и отмечаете его как бывший должный быть обновленными. Когда вы запрашиваете автоматически вычисленное свойство, MATLAB должен выполнить обновление, если графическая модель и аппаратное обеспечение машинной графики не находятся в синхронизации.

Когда вы получаете и устанавливаете свойства в том же цикле, можно создать ситуацию, где обновления выполняются с каждой передачей через цикл.

  • get вызывает обновление.

  • set отмечает графическую модель как необходимость в обновлении.

Цикл повторяется с каждым, проходят через цикл. Лучше выполнить все запросы свойства в одном цикле, затем выполнить все наборы свойств в другом цикле, как показано в следующем примере.

Этот пример получает и устанавливает текст Extent свойство.

Код с низкой производительностьюКод с лучшей эффективностью
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Gets and sets in the same loop,
% prompting a full update at each pass
for ix = 1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
   set(h(ix),'Position',p(ix,:))
end
drawnow
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Get and save property values
for ix=1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
end

% Set the property values and 
% call a drawnow after the loop
for ix=1:500
   set(h(ix),'Position',p(ix,:));
end
drawnow

Этот код выполняет плохо потому что:

  • Extent свойство зависит от других значений, таких как разрешение экрана, размер фигуры и пределы по осям, так запрос этого свойства может вызвать полное обновление.

  • Каждый набор Position свойство делает полное обновление необходимым, когда следующие добираются Extent свойство происходит.

Эффективность лучше потому что этот код:

  • Запросы все значения свойств в одном цикле и хранилищах эти значения в массиве.

  • Наборы все значения свойств в отдельном цикле.

  • Вызовы drawnow после того, как второй цикл заканчивается.

Изменение текста Extent вращать метки

В случаях, где вы изменяете текст Extent свойство вращать метки осей, более эффективно использовать свойства XTickLabelRotation осей, YTickLabelRotation, и ZTickLabelRotation.

Для просмотра документации необходимо авторизоваться на сайте