Как ускорить функцию «печати» в Matlab - PullRequest
2 голосов
/ 25 июля 2011

Я написал довольно большую программу сбора данных в Matlab, которая получает входные данные в довольно сжатые сроки и отображает их в реальном времени на графическом интерфейсе. Моя проблема в том, что мне нужен способ, позволяющий пользователям программы просматривать графический интерфейс через Интернет для удаленного мониторинга своих данных. Мое решение состояло в том, чтобы делать снимок графического интерфейса пользователя каждые 5 секунд и размещать это изображение на веб-сервере.

Однако это приводит к двум недопустимым проблемам:

  1. Функция печати просто слишком медленная - она ​​занимает ~ 3-4 секунды для каждого сохранения, и программа впоследствии отстает в своих других подпрограммах после каждого вызова 'print'.

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

Есть ли способ решить любую из этих проблем?

РЕДАКТИРОВАТЬ: *** Для всех, кто заинтересовался, лучшее решение, которое я нашел, было использовать внешний набор инструментов под названием Minicap .

Ответы [ 5 ]

7 голосов
/ 25 июля 2011

Формат файла имеет большое значение.Вот примерная диаграмма рассеяния

n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');

... и некоторые моменты времени для сохранения в разных форматах.

tic; print(hfig, 'test.bmp', '-dbmp'); toc      %4.1s
tic; print(hfig, 'test.bmp', '-dbmp256'); toc   %2.0s
tic; print(hfig, 'test.png', '-dpng'); toc      %1.9s
tic; print(hfig, 'test.tiff', '-dtiff'); toc    %0.45s
tic; print(hfig, 'test.jpg', '-djpeg'); toc     %0.44s
tic; print(hfig, 'test.wmf', '-dmeta'); toc     %0.42s

tiff, jpeg и wmf были объединены первыми, хотяTIFF-файлы огромны, качество JPEG очень плохое, и у wmf возникают проблемы, если вы не работаете на платформе Windows.


Для растровых форматов разрешение также влияет на время.1015 *

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

3 голосов
/ 22 ноября 2012

Для тех, кто борется с этим в будущем, решение, которое я нашел для платформ Windows, представляет собой небольшую программу под названием Minicap , которая позволяет легко снимать и сохранять снимки экрана с помощью системных команд.

Нужно иметь базовый дескриптор Windows рисунка, к которому можно обратиться с помощью общедоступной функции matlab gethwnd(), написанной суперпользователем Yair M. Altman.

Затем вы можете сделать очень быстрый снимок экрана с высоким разрешением и сохранить его на диск, выполнив что-то вроде следующего:

winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
    ' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);
2 голосов
/ 25 июля 2011

Должно ли ваше решение быть чистым Matlab?Используйте инструментарий платформы, чтобы сделать снимок окна с графическим интерфейсом и записать его на диск.Это очень быстро, и, поскольку он будет в отдельном потоке, он должен решить ваши проблемы с потоками.

1 голос
/ 25 июля 2011

Вы можете saveas() свою фигуру в виде файла .fig (что должно быть довольно быстро), когда экземпляр MATLAB выполняет вычисления, а затем использовать другой экземпляр MATLAB (возможно, на другом компьютере) для print ее нужный формат. Таким образом вы избежите задержек для других ваших подпрограмм, и искажения, вызванные печатью, не произойдут в вашем «главном» экземпляре MATLAB.

Обратите внимание, что print - это файл .m, в который вы можете посмотреть, есть ли что-то, что вы можете выбросить для вашего конкретного случая. Например, он вызывает private/prepare.m, что, я думаю, вызывает искажения / изменения положения, о которых вы говорите ... может быть, вы могли бы поиграть с этим?

Обновление : есть ли у данных для доступа через веб-интерфейс? Если база пользователей была достаточно маленькой, возможно, вы могли бы попытаться научить их использовать программное обеспечение для удаленного рабочего стола, такое как VNC, Teamviewer или терминальный сервер, встроенный в Windows, для удаленного просмотра их данных?

1 голос
/ 25 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...