plotの内容を更新する方法

36 次查看(过去 30 天)
koji fukumoto
koji fukumoto 2020-8-31
编辑: michio 2020-10-11
お世話になります。
plot関数でグラフ上(Axesオブジェクト上)に複数の点を描画し、
plot関数の戻り値のオブジェクトに対してset関数を用いて点の位置('XData'及び'YData')を更新するプログラムを作成しましたが、
起動後、しばらくするとタスクマネージャ上のメモリ使用量が増加していきます。
基本的な質問で申し訳ありませんが、plot関数で描画した点の位置を変える方法として、上記実装は適切でしょうか?
(適切でない為、メモリリーク?が発生しているのではないかと考えております)
※本来ならサンプルコードを提示すべきところですが、提示できる形に整形するのに時間が掛かる為、取り急ぎ上記のような質問をさせて頂きました。
よろしくお願い致します。

回答(1 个)

michio
michio 2020-9-1
> plot関数の戻り値のオブジェクトに対してset関数を用いて点の位置('XData'及び'YData')
R2014b 以降は set を使わず h.XData = [] という風に(h が戻り値のオブジェクト)プロパティを変える方法がオススメではありますが、描画後の点の位置を変える方法としてはスタンダードで適切な方法であると思います。メモリ使用量が増加する直接の原因とは考えにくいと思いますが、、他に何か要因があるのかもしれません。
  21 个评论
koji fukumoto
koji fukumoto 2020-10-9
michio様、
>R2019b にて pause(0.01) にすることでハンドル数の増加が確認できております。ありがとうございます。社内で確認を取っておりますので、ハンドル数の増加との関係について分かり次第ご連絡いたします
上記、どのような状況でしょうか?
お手数ですがご返信の程よろしくお願い致します。
MATLAB Answers ではなく、正式にサービスリクエストを作成した方がよい場合はその旨ご連絡ください。
よろしくお願い致します。
michio
michio 2020-10-11
编辑:michio 2020-10-11
お待たせしており申し訳ございません。
Task Manager 上のハンドル (MS Windows GDI Handles) 数の MATLAB 側の処理内容に対応する内容については確認ができておりませんが、開発サイドのひとまずの見解としては
pause(0.01) is attempting to queue 100 frames per second and the machine is not drawing 100 frames per second, so there is a backlog of frames that appears as a memory leak.
とのことで、PC が処理できる以上の描画命令が溜まりメモリ使用量増加に表れている。すなわち単純に pause(0.01) で指定したレートでグラフ描画ができていないという
ことになりますが、この点については現象と合致しますでしょうか?
今回フレーム抜けが発生するために pause で UDP 受信の処理に合わせているとのこと。
描画処理が間に合っていないという点について、例えばフレーム抜けを許容しながら処理を追いつかせるのであれば
drawnow limitrate
の使用がお勧めです。ただ、UDP 受信処理側の事情もあると想像します。
描画処理を高速化する・・という選択肢に関して、現時点でソフト側でできることで思いつくのは描画データ点数を減らすか、マーカー '.' の使用(最も単純で速いという話を聞いたことがあります)でしょうか・・。
いかがでしょうか?

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 グラフィックス パフォーマンス 的更多信息

产品


版本

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!