ProcessingのベースがJavaというプログラミング言語だということは多くの方がご存知でしょうが、その具体的な関係についてはよく知らない方も多いのではないでしょうか。
Javaの機能の多くはProcessingでも利用可能で、有効に活用すればクリエイティブ・コーディングを強力にサポートします。一方残念ながらProcessingでは使えないJavaの機能もあります。そのあたりの事情について触れている記事はあまりないようなので、今回から何回かに分けて関連するトピックを取りあげてみます。
なお対象環境はPDEとします。Eclipse等で利用されている方はJavaの機能に精通されているでしょうし、制約にまつわるあれこれはPDEにかぎられた話になります。
配列よりもコレクション
まずはコレクションの紹介から。同じ型のたくさんのデータの取りあつかいには配列が持ちだされるのが定番ですが、コレクションのほうがはるかに柔軟で便利です。ちょっとだけめんどうですが、その手間に見あうだけの価値があります。
コレクションの機能は多岐にわたりますが、配列の替わりとして使うのであればList<E>とArrayList<E>を覚えれば充分です(E
は任意の型です)。
// import
import java.util.ArrayList;
import java.util.List;
// 宣言
List collection = new ArrayList();
// 末尾に追加
collection.add(100);
// 先頭に挿入
collection.add(0, 99);
// 2番目に挿入
collection.add(1, 50);
// 要素数を取得(値は3)
int count = collection.size();
// 先頭要素を取得(値は99)
int firstValue = collection.get(0);
// 最後の要素を更新
collection.set(collection.size() - 1, -1);
ご覧のとおり、配列ではめんどうな要素の追加や削除がList<E>では簡単にできます。位置は先頭や末尾にかぎりません。
途中への要素追加や削除が多いならArrayList<E>ではなくLinkedList<E>を使ってみましょう。宣言をちょっと書き換えるだけです。
List<Integer> collection = new LinkedList<Integer>();
これだけでパフォーマンスの劣化を防げるかもしれません(パフォーマンスはさまざまな条件に影響されるので、劣化をかならず防げるとは残念ながら言い切れませんが)。
コレクションには他にも並べ替えたり指定した値の要素を一度に削除したりといった便利な機能がたくさんあります。集合やキューなど配列に限らない取りあつかいも可能です。パーティクルなどオブジェクトを多数取りあつかう場合に役にたつので、覚えておくとよいでしょう。
拡張for文
コレクションを使っても使わなくても便利なのが拡張for文。くりかえしによる要素ひとつひとつの操作という定番の処理を配列・コレクションの区別なく簡潔に記述できます。
for (int v : collection) {
// 処理
}
ただし拡張for分の中ではコレクションは操作できません。要素の追加や削除はもちろん上書き更新も不可。この点は注意が必要です。
列挙型
セル・オートマトンなどで欠かせない状態の管理。ピアソン『ジェネラティブ・アート』では整数での管理の例が挙げられていますが、Javaの列挙型の機能を使えば状態に名前を与えられます。
// 状態を示す列挙型の宣言
enum LifeState {
Born,
Alive,
Dead
};
// 宣言した列挙型の利用
LifeState state = LifeState.Born;
// if文やswitch文にも利用可能
if (state != LifeState.Dead) {
// ...
}
数字よりもわかりやすくなりますし、定義した値しかつかえなくなるのでまちがいも減ります。積極的に使いましょう。
非同期処理
現代的なプログラミングでは非同期処理はパフォーマンス向上に欠かせません。しかしProcessingの非同期処理サポートは非常に貧弱で、関連する機能としてはわずかにthread関数が存在するだけ。もっともこれは故なきことではありません。非同期処理プログラミングは考慮しなければならないことがとても多く、中途半端なサポートはかえって初心者のプログラミングを困難にするからです。
幸いスレッドプログラミングを仕様レベルで本格的に導入した初期のプログラミング言語であるJavaには初期の経験を元に整備されたJava Concurrency Utilitiesというクラスライブラリが存在します。こちらを利用すれば比較的安全に非同期処理を実現できます。
Java Concurrency Utilitiesは巨大で複雑なクラスライブラリで簡単には紹介できません。習得も容易ではないでしょうが、Java Executor FrameworkあたりをキーワードにWebの解説などをたどっていけば感じがつかめるのではないかと思います。大量のオブジェクトを取りあつかうときには挑戦する価値はあります。
ただし結果的に非同期処理を使うまでもなかったというのもよくある話です。時間計測による評価は忘れずに。
その2(使えないJavaの機能を知る)に続きます。