16
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Processing3の仕組みを覗いてみる

Posted at

はじめに

この記事では、Processing3.3.5(7/2現在最新)の settings()setup()draw() がどうやって動いているのかの説明していきます。IDEに関する説明ではありません。
間違いやさらなる面白い情報があるという方は是非、コメントにてご指摘ください!

どうやって解明するのか

https://github.com/processing/processing

This is the official source code for the Processing Development Environment (PDE), the “core” and the libraries that are included with the download.

ということでProcessingの公式のソースコードを読んでいきます。

core/src/processingの中にProcessingがどうやって動いているのかが詳しく書かれています。

settings()setup()draw() の定義

これら3つの関数は全て PApplet.java の中で定義されています。1つずつ見ていきましょう。

settings()

  public void settings() {
    // is this necessary? (doesn't appear to be, so removing)
    //size(DEFAULT_WIDTH, DEFAULT_HEIGHT, JAVA2D);
  }

code link

setup()

  public void setup() {
  }

code link

draw()

  public void draw() {
    // if no draw method, then shut things down
    //System.out.println("no draw method, goodbye");
    finished = true;
  }

code link

ほとんど何も書いてない...

Processingでみなさんが書いているコードは実は PApplet を継承したclassです。以下のコードを実行すると、ちゃんと true が返ってきます。

println(this instanceof PApplet);

Processingでは PAppletsettings()setup()draw() をオーバーライドすることを前提として書かれています。コードの前に @Override と書いてもエラーは出ません。

各関数は何処で使われているの?

settings()handleSettings() という関数で呼び出されています。
また setup()draw()handleDraw() という関数で呼び出されています。
両方とも、 PApplet の中に存在します。

handleSettings()

この後 PApplet 内で、 runSketch()main() という順番に呼び出されていきます。
余談ですが、この関数内では insideSettings というboolean型の変数が使われています。Processingの smooth()noSmooth()insideSettings という変数がtrueのときだけのみ動きます。trueの状態で処理を行えるのは settings() の中だけなので注意しましょう。実際に 困っている人 もいました。

code link

handleDraw()

frameCount == 0 のときは setup() 、それ以外のときは draw() が呼び出されるようになっています。これまた小ネタですが、 frameCount はpublicな変数なので、 自由に数値をいじれます。 frameCount = -1draw() 内で行うと setup() が呼び出されます。使う機会はないでしょうが、Processingの脆弱性の一つでしょう。

code link

AnimationThread

PSurfaceNone というクラスの中に AnimationThread というThreadが定義されています。 handleDraw() はその中の callDraw() で呼ばれ、さらに run() の中でwhile文によって終了条件を満たすまでループされ続けます。

まとめ

以上、いつも私達がProcessingで書いていた settings()setup()draw() がどのように動いているかの解説をさせていただきました。この記事を見て納得して頂けたら幸いです。

最後にまたまた小ネタ

handleDraw() はpublicなので、オーバーライドすることができます。以下のコードを他人のコードに入れるだけで setup()draw() は呼び出されなくなります。

void handleDraw() {
}

これもまたProcessingの脆弱性と言えるでしょう。大丈夫なのかProcessing...

16
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?