スーパープロセッサ
〜 Tonyu System 改良プログラム 〜

オブジェクトの処理量を増やす方法3

← メインページ
← 点滅現象について

目次
  1. オブジェクトの処理量を増やす方法
  2. オブジェクトの処理量を増やす方法2
  3. オブジェクトの処理量を増やす方法3
  4. オブジェクトの処理量を増やす方法4


プロセスを使って分散処理

いよいよ、実際に分散処理をしてみましょう!
ここでは、1つのオブジェクトで大量の描画を行います。

分散処理によって、どのような効果がもたらされるのか?
それを理解するために、まずは下のプログラムを実行してこの緑の箱スピードを覚えてください。
/* MainChar.tonyu */
extends SpriteChar;

while (1) {
  x+=3; // 左へ移動
  update();
}

次に、オブジェクトの処理量を超える処理をしてみます。
/* MainChar.tonyu */
extends SpriteChar;

while (1) {
  for (i=0; i<4000; i++) {
    drawSprite(i%100, trunc(i/100), 0); // 描画
  }
  x+=3; // 左へ移動
  update();
}
4000個分の 小さい四角 を表示しています。
(2重 for文でもできますが、わかりやすくするために for文を1つにしています)
1フレームで処理しきれていないので、緑の箱のスピードも遅くなっています。
あと、点滅現象も起きています。
分散処理なし

前ページで「プログラマ自作のオブジェクトの処理量までは、関与できていない」
という問題点があると述べましたが、上のプログラムがまさにその状態です。
つまり、このライブラリを導入したとしても、点滅現象が起きてしまいます。

そこで、分散処理の登場です!!
/* MainChar.tonyu */
extends SpriteChar;

// オブジェクトとプロセスを生成
proc = new classes.lang.Process(new SubChar(), "", 1);

while (1) {
  $MainChar_i = 0; // カウントリセット
  for (i=0; i<40; i++) {
    proc.exec(); // 100回ずつ実行
  }
  x+=3; // 左へ移動
  update();
}
/* SubChar.tonyu */
extends SpriteChar;

while (1) {
  for (j=0; j<100; j++) {
    drawSprite($MainChar_i%100, trunc($MainChar_i/100), 0); // 描画
    $MainChar_i ++;
  }
  update();
}
今回は、SubChar自体の描画は必要ないので、drawメソッドは必要ありません。
x,y,p変数も必要ないので、オブジェクト生成の引数も「new SubChar()」と省略しています。

先程と同じく、4000個分の 小さい四角 を表示しています。
SubChar が1回実行されると 小さい四角 を100回表示します。
MainChar が SubChar を 40回実行させています。
100個×40セット=4000個 ということになります。

この処理量の配分は、上手く行ってください。
例えば、1個×4000セット=4000個 と配分しても、点滅現象が起きてしまいます。

グローバル変数の $MainChar_i で、どこまで処理したかを把握しています。
一応グローバル変数を使っていますが、多分オブジェクト変数でもできると思います。

分散処理によって、点滅現象が無くなりました。
緑の箱のスピードもPCが重くない場合限り、通常どおりです

分散処理あり

→ オブジェクトの処理量を増やす方法4


← オブジェクトの処理量を増やす方法2
← 点滅現象について
← メインページ