Почему моя фигурка кажется анимированной (хотя этого не должно быть)?

Рассмотрим следующий код, рисующий фигуру:

figure('Renderer', 'opengl');
N = 50;
tL = linspace(0.5, 6, N).';
tB = sort(randi(100,N,20),1);
yyaxis right; plot(tL, tB);
xlim([2 6]);

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

введите описание изображения здесь

Несколько дополнительных наблюдений:

  • Я заметил, что без строки xlim ничего не происходит (т.е. фигура статична, как и ожидалось).
  • Я не мог заставить его работать на другом компьютере с той же версией MATLAB.
  • Строка «анимация», кажется, совпадает с появлением и исчезновением панели инструментов осей (та, что справа вверху с масштабированием и т. Д.).
  • Когда я создаю фигуру с помощью figure('Renderer', 'painters'), этого не происходит.

Может кто-нибудь объяснить, почему это происходит? Это задокументированное поведение? Есть идеи, как это контролировать?

Я работаю с R2018b на Windows 10 v1803. Мои экраны подключены к встроенному графическому процессору Intel HD Graphics 530 (версия драйвера 22.20.16.4749).

Обновление за сентябрь 2019 г.: это также происходит со мной на R2019b в Windows 10 v1903. Как было предложено в комментариях, ниже приведен вывод opengl info:

                          Version: '4.5.0 - Build 25.20.100.6373'
                           Vendor: 'Intel'
                         Renderer: 'Intel(R) HD Graphics 530'
            RendererDriverVersion: '25.20.100.6373'
        RendererDriverReleaseDate: '18-Nov-2018'
                   MaxTextureSize: 16384
                           Visual: 'Visual 0x07, (RGBA 32 bits (8 8 8 8), Z depth 16 bits, Hardware acceleration, Double buffer, Antialias 8 samples)'
                         Software: 'false'
             HardwareSupportLevel: 'full'
        SupportsGraphicsSmoothing: 1
    SupportsDepthPeelTransparency: 1
       SupportsAlignVertexCenters: 1
                       Extensions: {223×1 cell}
               MaxFrameBufferSize: 16384

person Dev-iL    schedule 09.01.2019    source источник
comment
Это явление, заключающееся в медленном рендеринге, является наиболее вероятной причиной.   -  person OmG    schedule 09.01.2019
comment
Я могу воспроизвести это в MATLAB 2018b, win 10x64, NVIDIA GTX 1050   -  person Ander Biguri    schedule 09.01.2019
comment
Я не могу воспроизвести это в MATLAB 2018b, Ubuntu 17, NVIDIA GTX 1080 Ti.   -  person Ander Biguri    schedule 09.01.2019
comment
Я не могу воспроизвести это в MATLAB 2017a, win 10x64, NVIDIA GTX 1050   -  person Ander Biguri    schedule 09.01.2019
comment
Вы отправили отчет об ошибке в MathWorks? Я не уверен, какой ответ вы ожидаете... Классный эффект, однако! :)   -  person Cris Luengo    schedule 09.01.2019
comment
Я хотел бы знать, как это контролировать. Было бы неплохо иметь возможность добавить этот эффект движения к пунктирным/пунктирным линиям на других графиках.   -  person Dev-iL    schedule 14.01.2019
comment
Код кажется несовместимым с вашей фигурой. На рисунке у вас есть значения величины 10^9, но код tB = sort(randi(100,N,20),1); генерирует случайные значения меньше 100?   -  person uPhone    schedule 27.03.2019
comment
@uPhone Я упомянул в вопросе, что: эта {анимация} использует мои реальные данные, которые выглядят немного лучше, чем примеры {один. Значения не имеют значения для целей этого вопроса, и та же проблема возникла в моей системе и со случайными значениями. Кроме того, я должен упомянуть, что этого не происходит на более новой R2019a.   -  person Dev-iL    schedule 27.03.2019
comment
@Dev-iL Хорошо, понятно. У меня нет таких проблем с MATLAB 2018a на моем Macbook Air 2013.   -  person uPhone    schedule 27.03.2019
comment
@Dev-iL, каков результат >> opengl info?   -  person Enlico    schedule 22.09.2019
comment
Однако я могу воспроизвести его в MATLAB R2019a на Arch Linux.   -  person Enlico    schedule 22.09.2019
comment
Вы можете создать запрос на обслуживание здесь: mathworks.com/support/contact_us.html   -  person Enlico    schedule 22.09.2019
comment
Я не могу воспроизвести это на R2018b или на R2019b в Windows 10. Что происходит, когда вы открываете рисунок с настройками ... «Панель инструментов», «Нет», «Панель меню», «Нет»); ?   -  person Lucademicus    schedule 02.01.2020
comment
@Lucademicus К сожалению, на данный момент я не могу сказать, потому что это больше не происходит на моем R2019b (моя версия теперь немного новее - 9.7.0.1261785 (R2019b) Update 3; хотя я не видел в примечаниях к выпуску ничего, указывающего, что это было изменено). Если мне удастся воспроизвести его снова, я обязательно обновлю. Спасибо за предложение!   -  person Dev-iL    schedule 02.01.2020
comment
@Dev-iL расстраивает, что мы не можем воспроизвести этот сбой. Должен сказать, что эффект выглядит знакомым, но я не уверен, когда/как я его видел. Я думаю, что видел это при изменении размера фигур, так что, вероятно, замечание OmG о медленном построении графика имеет смысл? Я заметил, что панель инструментов видна 3 раза (в конце гифки), это артефакт гифки?   -  person Lucademicus    schedule 02.01.2020
comment
@Lucademicus Действительно (относительно: разочарования, артефакта GIF). Насчет скорости прорисовки - я к этому отношусь скептически, и даже если это так - остается вопрос - можно ли что-то сделать {ускорить или замедлить}, чтобы получить/убрать этот эффект?   -  person Dev-iL    schedule 02.01.2020
comment
@Dev-iL Я имел в виду, что скорость построения графика как причина имеет смысл только в том случае, если график действительно медленный. Но вы правы в том, что до этого момента мы могли классифицировать это как «беспорядочное поведение». Возможно, запрос на обслуживание поможет?   -  person Lucademicus    schedule 02.01.2020
comment
@Lucademicus Увы, мне не нужны никакие услуги от TMW; исправят или оставят, мне все равно - я в основном хочу понять, что происходит, и если здесь скрывается какая-то недокументированная фича, я бы хотел знать об этом :)   -  person Dev-iL    schedule 02.01.2020
comment
у вас должен быть какой-то другой код или настройка, которые влияют на ваши графики, потому что вызов графика отображает фигуру с серыми областями вокруг нее, если вы не укажете (set (gcf, 'color', 'white'). Я ненавижу это, когда я просматриваю документы.. , в моем системном случае (Win10, R2016b, AMD Radeon (TM) R7 M370 с драйвером 4.5.13559 Контекст профиля совместимости 26.20.12028.2) tB не отображается светло-голубым цветом (от цвета левой оси). Наконец, визуализированные данные не иметь круглой формы, которую вы получаете ... интересно посмотреть   -  person bhamadicharef    schedule 20.07.2020
comment
@bhamadicharef из комментариев видно, что другим удалось воспроизвести проблему только с предоставленным кодом. Тем не менее, этого не происходит в более старых версиях MATLAB, в которых нет анимированной панели инструментов осей (я полагаю, что версия, которую вы используете, попадает в эту категорию).   -  person Dev-iL    schedule 20.07.2020


Ответы (1)


  • Во-первых, вы должны понимать, что фигура — это вовсе не статичная картинка. Он часто обновляется. Если изменить размер/переместить контейнер (рисунок), рисунок будет перерисован сразу после взаимодействия.
  • Во-вторых, все объекты, включая линии, аннотации, легенду... перерисовываются одновременно. Прерывистые типы линий будут легко захвачены. Вот почему вы могли видеть анимированную пунктирную линию.
  • Наконец, для Matlab существуют некоторые различия во взаимодействии в Linux/Mac и Windows. В Windows при перемещении мыши по рисунку не будет запускаться событие отслеживания данных. Но в Linux Data Tracker будет активирован при движении мыши. События для отслеживания данных, выбора объекта и т. д. будут обновлять график.

В общем, анимация, которую вы видите, разработана автором, и так и должно быть.

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

figure('Renderer', 'opengl');
N = 50;
tL = linspace(0.5, 6, N).';
tB = sort(randi(100,N,20),1);
yyaxis right; h = plot(tL, tB,'ButtonDownFcn',@lineCallback); 
set(gca,'HitTest','off')
xlim([2 6]);

function lineCallback(Figure1,Structure1)
    disp('Button Down: redraw...'); 
end

Этот фрагмент кода был протестирован с использованием MATLAB R2018B на Mac, Windows10 и Ubuntu 18.04. Все работает отлично.

person Shannon    schedule 31.07.2020
comment
Однако спасибо за ответ: пункты 1-2 не объясняют, почему для данного компьютера анимация происходит для некоторых версий MATLAB (например, 2018b, 2019b), а не для других (например, 2019a), как указано в комментариях; пуля 3, по-видимому, игнорирует тот факт, что этот эффект наблюдался как в системах Windows, так и в Linux, несмотря на то, что они имеют различную обработку взаимодействия/события (не говоря уже о том, что для наблюдения эффекта не требуется щелкать или даже наводить курсор на строку). Наконец, не могли бы вы объяснить, что должен делать этот код (т. е. отключать анимацию)? Это работало в вашей системе? - person Dev-iL; 04.08.2020
comment
@Dev-iL Событие перерисовки вызывает анимацию. Чтобы отключить это поведение, вы можете просто отключить HitTest gca/gcf. - person Shannon; 04.08.2020
comment
HitTest используется для захвата щелчков мыши, насколько я могу судить, однако эффект анимации не требует щелчков мышью. Если да, то какое отношение HitTest имеет к перекраске? Есть ли у вас доступ к установке (ОС+MATLAB), которая демонстрирует этот эффект анимации? Если да - не могли бы вы указать вашу конфигурацию? - person Dev-iL; 04.08.2020
comment
Включить HitTest Visibility означает разрешить выбор объекта щелчком мыши. В Linux и Mac существует событие выбора по умолчанию, когда вы перемещаете фигуру. Множество событий вызовет событие перерисовки. Вы можете получить все функции обратного вызова (заканчивающиеся на Fcn), используя: get(gcf). Вы можете взять на себя управление, переопределив эти функции, чтобы предотвратить перерисовку. - person Shannon; 05.08.2020
comment
Это не имеет ничего общего с обратным вызовом ButtonDownFcn, но установка HitTest на off останавливает анимацию. - person Cris Luengo; 15.09.2020