memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Processingでアニメーション不要のアプリを作るときには更新フラグを使うとCPU負荷が下げられます

研究用のツールとかプロトタイプを作るときに身近なのでProcessingをよく利用しています。

Processing.org

Processingは、frameRate()で指定された時間間隔(デフォルトは60FPS)で、描画内容が記述されたdrawメソッドを呼び出します。

したがって、描画内容を変更していても(していなくても)、drawメソッドがコールされるため、当然、パソコンに負荷がかかります。

最近のパソコンは速いので、気にすることは無いかも知れませんが、描画内容が複雑になるとCPUが頑張りだし、私のMBAの場合はファン音がうるさくなります。。。

私が作る研究用ツールの多くはアニメーションは不要(ユーザの入力に対して結果を描画したら次の入力まで描画内容が変化しない)ので、入力がないときはdrawを実行する必要がありません。

以下、そんな場合の対策の話です。

対策は簡単です。入力があったときだけdraw(の内容を)を実行するようにします。

知っている人にすれば「なーんだ」という感じでしょうけど、とりあえず活動メモとして書きますね。

例で説明します。例えば、以下ような画像を全画面表示するプログラムを実行します。

PImage img;

void setup() {
  fullScreen();
  img = loadImage("a.png");
}

void draw() {
  image(img, 0, 0);
}

私のPCでは、上記のプログラムのインスタンスのCPU使用率は約70%になりました。

このプログラムに、「入力があったときだけ」という条件をつけます。このフラグをつけることで、CPU使用率は10%くらいになりました。

PImage img;

boolean needToUpdate = true;   //フラグ

void setup() {
  fullScreen();
  img = loadImage("a.png");
}

void draw() {
  if (!needToUpdate) return;  //フラグがtrueのときのみ、imageを実行する
  
  image(img, 0, 0);

  needToUpdate = false;  //image実行したらフラグを落とす。
}

void keyPressed() {
  needToUpdate = true;  //キーが押されたのでフラグを立てる(ユーザ入力の例)
}

さらに、キー入力は1秒に数回くらいしか押さないと考えた場合、frameRateを下げることでCPU負荷を下げることが期待できます。以下のように、frameRate(5)と指定するとCPU使用率は4%くらいになりました。

PImage img;

boolean needToUpdate = true;

void setup() {
  fullScreen();
  img = loadImage("a.png");
  frameRate(5); //★ここね
}

void draw() {
  if (!needToUpdate) return;
  
  image(img, 0, 0);

  needToUpdate = false;
}

void keyPressed() {
  needToUpdate = true;
}

富豪的プログラムならぬ節約生活プログラム?ですが。。。パソコンにやさしい・環境にやさしいプログラムを😁