Разумное создание объектов

Накладные расходы по объекту

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

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

Вы часто можете улучшить эффективность, следуя этим рекомендациям:

  • Не создавать ненужные объекты

  • Избегайте поиска иерархии объектов

Не создавать ненужные объекты

Ищите случаи, когда можно создать меньше объектов и достичь тех же результатов. Например, предположим, что вы хотите построить график массива точек 10 на 1000, показывающий только маркеры.

Этот код создает 1000 линии:

x = rand(10,1000);
y = rand(10,1000);
plot(x,y,'LineStyle','none','Marker','.','Color','b');

Преобразуйте данные из 10 на 1000 в 10000 на 1. Этот код создаёт график, который выглядит одинаково, но создает только один объект:

plot(x(:),y(:),'LineStyle','none','Marker','.','Color','b')

Использование NaNs для моделирования нескольких линий

Если координатные данные содержат NaNs, MATLAB® не отображает эти точки. Можно добавить NaNs к данным вершин, чтобы создать сегменты линий, которые выглядят как отдельные линии. Поместите NaNs в одинаковые положения элемента в каждом векторе данных. Для примера этот код, по-видимому, создает трёх отдельных линий:

x = [0:10,NaN,20:30,NaN,40:50];
y = [0:10,NaN,0:10,NaN,0:10];
line(x,y)

Изменение данных вместо создания новых объектов

Чтобы просмотреть различные данные о том, что в основном является одним и тем же графом, более эффективно обновлять данные существующих объектов (линии, текст и т.д.), чем воссоздавать весь график.

Например, предположим, что вы хотите визуализировать эффект на ваши данные меняющихся определенных параметров.

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

  2. Пересчитайте данные с помощью новых параметров.

  3. Используйте новые данные для обновления свойств данных линий, текста и т.д., используемых в графике.

  4. Звонить drawnow для обновления рисунка (и всех дочерних объектов на рисунке).

Например, предположим, что вы хотите обновить график по мере изменения данных:

figure
z = peaks;
h = surf(z);
drawnow 
zlim([min(z(:)), max(z(:))]);
for k = 1:50
   h.ZData = (0.01+sin(2*pi*k/20)*z);
   drawnow
end