質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • Processing

    232questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Processing実行中のCPU使用率が異常に高い

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 242

wwuuccccii

score 4

Processing実行中にタスクマネージャーを見てみると、Java(TM) Platform SE binaryが常に30%以上ものCPUを使っています。数行程度の簡単なコードでも一度走らせるとその後ずっとCPUが働いているようです。
Windows 10 proを使用していて、Javaも新しいものをインストールしました。
解決策を教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

訂正:
回答コメントのやりとりからProcessingの動作モデルの把握云々の問題ではなくProcessing自体の問題であるように思えました(確証があるわけではないのですが自分の環境でも3.3.6では問題なく、3.3.7で再現したからです)

回答コメントにも書きましたが、3.3.7の利用を止めて3.3.6を試すことをお奨めしてみます。

なおProcessingは(少なくともデフォルトでは)PCにインストールされているJREではなくProcessing自身に同梱されたJREを使うようになっていますので、PCにインストールされているJavaバージョンには左右されないと思います。

以下は元の回答

コードがないので推測でコメントします。

質問者さんはProcessingの基本動作、すなわち「setupは最初だけ起動される」「drawはごく短い期間中に何度も呼び出される」という点をよく把握しておられないのではないでしょうか?

void setup() {
  size(100, 100);
}

void draw() {
  text("hello world", 50, 50);
}

drawは概ね10msecぐらいごとに何度も呼び出されます。

上のコードのように同じ内容の処理をdrawで毎回やってないでしょうか?例えば固定的な描画ならsetupで一度だけやればいいのですがそれを毎回drawでやるとそれなりのCPUを消費してしまうと思います。

上の例でしたら下のようにするのが妥当です。

void setup() {
  size(100, 100);
  text("hello world", 50, 50);
}

void draw() {
  // 特に何もしない
}

追記:もう少し具体例を挙げてみます。300個ぐらいの円を描画する以下のコードを自分の環境(Windows 10 64bit)実行してみるとだいたい20%ぐらいのCPU使用率でした。
drawEllipsesをsetupで呼び出すように変えると見た目はかわらず、CPU使用率はほぼ0%になりました。

どの程度の描画でどのくらいの負荷がかかるかの実例として参考になればと思います。

int N = 300;
float[] xs = new float[N];
float[] ys = new float[N];
float[] rs = new float[N];
color[] fills = new color[N];
color[] strokes = new color[N];

void setup() {
  size(500,500);
  for (int i = 0; i < N; i++) {
    xs[i] = random(width);
    ys[i] = random(height);
    rs[i] = 10 + random(10);
    fills[i] = color(random(256), random(256), random(256));
    strokes[i] = color(random(256), random(256), random(256));
  }
}

void draw() {
  drawEllipses();
}

void drawEllipses() {
  fill(0);
  noStroke();
  rect(0,0,width,height);
  for (int i = 0; i < N; i++) {
    fill(fills[i]);
    stroke(strokes[i]);
    ellipse(xs[i], ys[i], rs[i], rs[i]);
  }
}


追記:最初つづりを間違ってdrawEllipsysとしてました。drawEllipsesに訂正しました。
お恥ずかしい限りです。orz

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 17:15

    ご回答ありがとうございます。
    追記にていただいたコードでsetupとdrawにおいた場合を比較してみましたが、差がありませんでした。。
    コードの描画を停止してみてもCPU使用率は変化しなかったので、他のアプリとの関係から生じるトラブルなのかなと思います。ご丁寧にお答えいただいたのにすみません。
    まだ解決しておりませんので、もし他の原因がお分かりでしたら教えてください。

    キャンセル

  • 2018/04/21 17:20

    setupの最後を
     ...
     drawEllipsys()
    }
    としてdrawでは何もしないように
    void draw() {
    }
    と書けば0%ぐらいになるはずですがdrawのところにdrawEllipsysを残したままにしてませんか?

    キャンセル

  • 2018/04/21 17:23

    コメントありがとうございます。
    残さないで全てsetupに移してから描画させました。

    キャンセル

  • 2018/04/21 17:28 編集

    なるほど・・・ひょっとするとProcessingの問題かも知れませんね。
    Processingのバージョンは何でしょう?またOS, Javaのバージョンはわかりますか?
    ---
    失礼しました。OSはWindows 10ですね。
    (自分はWindows 10 home 64bit 1709, Processing 3.3.6で動かしてました。ブラウザーや他のIDEも動かしておりメモリーは不足気味です。8GBしか積んでないので)

    キャンセル

  • 2018/04/21 17:42

    Processingの問題だとすると厳しいですが回避策としてsetupの最後で

    frameRate(5);

    のようにdrawを呼び出す頻度を変更すると改善するかも知れません。5を指定すると1秒間に5回程度drawが呼び出されるようになります。デフォルトは60ぐらいだったと思います。

    キャンセル

  • 2018/04/21 17:50

    Processingは3.3.7を使用しております。
    Windows 10 Pro、Java 8です。
    frameRateを変更しても解決いたしませんでした。。簡単なコードと複雑なコードでもCPU使用率は変化しませんでしたので、やはり構造上の問題かもしれません。

    キャンセル

  • 2018/04/21 18:09

    3.3.7をDLしてやってみたところ再現しました。
    なるほどdrawでなにもしてなくてもCPU30%です。
    これは・・・バグのように思えますがもうちょっと探ってみます。

    キャンセル

  • 2018/04/21 18:17

    void setup() {
    println(javaVersionName);
    println(System.getProperty("java.home"));
    size(500, 500);
    frameRate(1);
    }
    void draw() {}
    これをためしたところ、
    3.3.6ではJRE 1.8.0_144
    3.3.7ではJRE 1.8.0_162
    いずれもProcessingに同梱されているJREが使われています。そのJREは
    Processing.exeがあるディレクトリーと同じところにあるjavaディレクトリーの下に入っています。ためしにjavaディレクトリーの下を
    3.3.6のもの(1.8.0_144)に入れ替えてみたところ再現しなくなりました。
    かなりインチキな方法なのでお勧めはできませんが、やはりProcessingの環境に問題があるように見えます。
    3.3.7の利用を止めて3.3.6をDLして試してみることをお奨めします。

    キャンセル

  • 2018/04/21 23:13

    3.3.6をインストールして描画してみましたところ、CPU使用率が大幅に下がりました!
    バージョンを下げるという方法はまったく思いつきませんでした。。
    ご丁寧に対応してくださり本当に助かります。
    ありがとうございます。

    キャンセル

  • 2018/04/21 23:21

    良かったですね。
    そちらでも改善が見られたということはやはり3.3.7の問題なのかも知れません。ちょっと意外でした。こちらこそ参考になりました。情報ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Processing

    232questions

    Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。