Ваш первоначальный код занял 15,5 с на моей машине. Первым шагом оптимизации является сохранение графика и обновление данных xdata и y:
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = sprintf ("img%03i.png", k);
print ("-dpng", "-r100", fname);
endfor
Это займет 13,1 с на моем компьютере. Далее мы можем использовать getframe:
out_dir = "temp_img";
mkdir (out_dir);
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = fullfile (out_dir, sprintf ("img%03i.png", k));
imwrite (getframe (gcf).cdata, fname);
endfor
cmd = sprintf ("ffmpeg -framerate 20 -i ./%s/img%%03i.png -vf scale=1080:-1 Example1.mp4", out_dir)
system (cmd)
Это займет 3,7 с даже при запуске ffmpeg.
Имейте в виду, что если вы создаете изображения (я думаю, как ваши вихревые видео), у вас есть Пройдите сюжет
Да, вы можете игнорировать эту ошибку. Объект, объявленный как тип id
, может не унаследовать от NSObject
(у вас нет для использования библиотек Какао для программирования на Objective-C и там являются другими корневыми классами даже в Какао, например NSProxy
). Поскольку сохранить
(и выпуск
, автозапуск
) объявлены в NSObject
, компилятор не может знать, что экземпляр, объявленный как тип id
, отвечает на эти сообщения. Чтобы обойти это, Какао также определяет протокол NSObject
, который отражает API NSObject
. Если вы объявите свой протокол как
@protocol MyProtocol <NSObject>
@end
, указывая, что MyProtocol
расширяет протокол NSObject
, вы будете настроены.
Обычно, когда вы объявляете объект как id
, он считается "любой" объект (это означает, что Objective-C позволит вам вызвать любой метод из любого класса или протокола на id
без предупреждения).
Однако, когда вы объявляете объект как id
, значение меняется. В этом случае вы вместо этого говорите: я буду вызывать только методы SomeProtocol
для этого объекта.
Метод:
- (void)release;
объявлен в протоколе NSObject
, но вы явно заявлено: я буду вызывать только методы MyProtocol
. Таким образом, компилятор выдает предупреждение о том, что вы нарушили собственное обещание.
Следовательно, вместо:
id<MyProtocol> reference;
вы должны фактически объявить:
id<MyProtocol, NSObject> reference;
или:
NSObject<MyProtocol> reference;
поскольку NSObject
(класс) реализует NSObject
(протокол).
или:
id reference;
, что является самым широким из множества: позвольте мне вызвать что-нибудь в этом возражать и никогда не жаловаться.
Вы также можете (как предложил Барри Уорк) включить MyProtocol
в протокол NSObject
- хотя с точки зрения дизайна вы обычно делаете это только при реализации MyProtocol
обязательно означает использование NSObject
. Обычно мы делаем это, только если NSObject
и MyProtocol
связаны наследственно или семантически.
Немного информации о протоколе NSObject
:
Все, что вы вызвать сохранение / освобождение / автоматическое освобождение при необходимости реализации этого протокола. Как вы можете сделать вывод из этого: в основном все реализует протокол NSObject
(хотя некоторые вещи не являются наследниками базового класса NSObject
).
Еще одно быстрое пояснение: NSObject
( класс) и NSObject
(протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:
NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).
NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
t происходят от базового класса NSObject
).
Еще одно быстрое пояснение: NSObject
(класс) и NSObject
(протокол) не являются повторными реализациями тот же API. Они разделены следующим образом:
NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).
NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
t происходят от базового класса NSObject
).
Еще одно быстрое пояснение: NSObject
(класс) и NSObject
(протокол) не являются повторными реализациями тот же API. Они разделены следующим образом:
NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).
NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
NSObject
(класс) и NSObject
(протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:
NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).
NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
NSObject
(класс) и NSObject
(протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:
NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).
NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
NSObject (класс) реализует менее общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве случаев протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.
NSObject (класс) реализует менее общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.
Таким образом, в большинстве случаев протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.