スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回は
クローンを使って別プレイヤーを自画面に表示させて、さらに動きの同期も成功したぞ!でもちょっと
待って。
同時に3つ4つのタブを
開いて
動きをチェックすると、なんかカクカクしちゃうみたい!あっちゃー、これじゃあオンラインゲームエンジンとしては
未完成だね。
僕らが
目指すトップクラスのオンラインゲームはMMOと
称しても
過言ではないクオリティじゃないとね!
ok-scratch
u003cpu003eMMOは、u003cstrongu003eMassively Multiplayer Onlineu003c/strongu003eのことで、多人数同時参加型のオンラインゲームのことだよ。軽いゲームなら数十人は同時接続しても大丈夫なオンラインゲームエンジンじゃないとね。u003c/pu003e
今回の目標「クラウド変数を増やしてスケールアップさせる」
そこで
今回はスケールアップ、つまり
性能向上をしていきたいと
思う。スクラッチの
性能向上は
色々あるけど、スケールアップという
手法を
試すよ。これは
最近のIT
現場では
当然のように
使われる
言葉だから、プロのエンジニアが
見たら「え?スクラッチってそんな
本格的なプログラミングなの?」って
戸惑うと
思う。
作戦としては
単純で、
今は1つしか使ってないクラウド変数を合計8個使って行こうぜ、っていうこと。クラウド
変数を
使っている
箇所を8
回繰り
返すだけだから、スケールアップという
高度な
手法に
挑戦するけど
作業自体は
単純だよ。そこは
安心してほしい。っていうか
今クラウド
変数1つで
同期処理が
実現できてるってことがワンダフルだよね!つまり、みんなワンダフルなスクラッチャーってことだよ!ナイスぅ!
スケールアップを実装する
さっそくいこう!
メッセージ「クラウド - セットアップ」を受け取ったとき
ここでクラウド
変数を
明示的に
文字化して、リスト「★クラウドデータ」に
追加していたね。
このブロックを
複製して8
回繰り
返すよ。
こんな
感じ↓
クラウド変数を合計8つ用意しよう
新しいクラウド
変数を
用意しよう。
今ってクラウド
変数1と2があるから、3から8も
作る。
ふぅ!
地道!
変数を置き換える
クラウド
変数が8つ
用意できたら、それぞれブロックにセットしていこう。ハマってる
変数を
右クリックすると、
変数を
変更できる。ブロックを
入れ
替えるより
楽だよ。
これも
全部やってこうする↓
よし。
メッセージ「クラウド - ティック」を受け取ったら
ティック
処理も
同じことをやるよ。
クラウド
変数以外にも
引数「☁
番号」も
変える
点に
注意だね。
ブロック定義「クラウド変数を送信する」
ここはちょっとトリッキーだよ。エンコード
文字列をクラウド
変数にセットするところだね。
今まではクラウド
変数1だけだったからシンプルだったけど、
今後は8つあるクラウド
変数のどれにセットすればいいだろうか。うん、
答えはシンプル。ランダムにセットしよう。
変数「★クラウド変数のチャンネル」を用意する
新しくランダムな
数字を
入れておく
変数を
作ろう。
乱数を入れる
これに
乱数を
入れる。
最小値は1でいいとして、
最大値は
何にしようか。まぁクラウド
変数の
数と
同じにするから8だね。でも8って
書いてしまうよりは、
動的に
算出できるようにしておこう。さっき「クラウド - セットアップ」のところをスケールアップ
作業したときに、クラウド
変数の
数と
同じだけリスト「★クラウドデータ」の
長さは
増えるようにしたよね。だからこのリストの
長さを
使うのが
良さそうだね。
後日動きの
同期に
使うクラウド
変数の
数は
変わるかもしれないけど、こうしておけば
安心だ。
チャンネルによって使うクラウド変数を変える
条件分岐だ!ここは
実に
地道なんだ……。スケールアップは
地道な
作業が
多いね。いや、
地道な
作業が
多いということはそれだけコーディングが
洗練されている
証拠でもある。
二分探索木アルゴリズム
ここさ、シンプルに
条件分岐を8つ
作るんじゃなくて、二
分探索木《にぶんたんさくき》という
有名なアルゴリズムを
実装するよ。チャンネルが1から8のどれなのかを
調べるんだけど、まず5よりも
小さいかどうかを
調べる。5よりも
小さかったら1,2,3,4のどれかだから、
今度は3より
小さいかどうか
調べる。3よりも
小さかったら2よりも
小さいか
調べる。2よりも
小さいなら1だし、そうじゃないなら2ってことになる。こういうアルゴリズムを二
分探索木というんだ。うん、
何が
嬉しいの?って
思ったよねwちょっと↓
見てみて。
もしも二
分探索木を
使わずに、チャンネルが1ならクラウド
変数1を
使う、っていう
条件分岐を8
個作るとしたらどうなるかな。チャンネルが1なら
判定1
回目でOKだけど、チャンネルが8だった
場合は
判定を8
回行うことになるよね。
一方で、二
分探索木っていうアルゴリズムを
使うと、
必ず
階層の
深さ
以内の
数で
見つかるっていう
法則がある。つまりチャンネルが8でも
判定は2
回だけで
済むんだ。でもチャンネルが1でも
判定は3
回になるんだけどね。
チャンネルが1だった場合
- 5より小さいですか? → YES
- 3より小さいですか? → YES
- 2より小さいですか? → YES = 1
チャンネルが8だった場合
- 5より小さいですか? → NO
- 7より小さいですか? → NO = 8
チャンネルが5だった場合
- 5より小さいですか? → NO
- 7より小さいですか? → YES
- 6より小さいですか? → YES = 5
こんな
感じ!
今回はマックスが8だけど、マックスが
大きければ
大きいほど
効果を
発揮するよ。こういうアルゴリズムがプログラミングにはいっぱいあるんだ。
ok-scratch
u003cpu003e僕は文系だったから数式とかは苦手だったけど、アルゴリズムは便利だなぁって思えた。理解するまで人より時間かかったけどwu003c/pu003eu003cpu003eたぶん二分探索木はITパスポートとか基本情報技術者試験とか、ガチな資格試験でも出題されるようなガチでガチガチな知識。u003c/pu003e
二分探索木を実装する
じゃあスクラッチで
作ってみよう。
5よりも小さいかどうか
3よりも小さいかどうか
複製すると
楽だね。
2よりも小さいかどうか
チャンネルが1のとき
チャンネルが1だったらクラウド
変数1をエンコード
文字列にする。
チャンネルが2のとき
チャンネルが2だったらクラウド
変数2をエンコード
文字列にする。
4よりも小さいかどうか
ここも
複製すると
楽だね。
3と4の
結果はこう↓
5,6,7,8も作ろう
がっつり
複製しよう。
「5よりも
小さいかどうか」の「でなければ」にペーストして
各値を
変えよう。
二分探索木ではない場合と比べる
みんなは
作らなくていいけど、
試しにシンプルに
全部チェックする
条件分岐を
右隣に
作ってみた↓
左が二
分探索木で、
右がシンプルな
条件分岐の
連続。
長さはだいたい
同じだね。まぁだけど
本当ならシンプルの
方はいちいち「このスクリプトを
止める」ブロックも
置いたほうがいいから、
結果はかなり
長くなりそうだね。ってなると
長さは二
分探索木のほうが
短くなるか。ただ二
分探索木のほうがパッと
見が
分かりにくっていうデメリットあるね。ここでは
見た
目よりも
判定回数が
少なくなるっていうメリットを
優先してるからいいけどね。
テストする
クラウド
変数1から8まで
値がちゃんと
入るか、
変数を
表示して
調べてみよう。
少し
猫をグリグリ
動かしてみて、
全変数に
値が
入ればOKだ!
入らない
変数があったら、さっきの二
分探索木とか、
今回修正した
箇所を
再確認してみてね。
ラグのテストをする
さぁ、スケールアップはこれで
完成だ。いままではタブを3つ4つ
並べるとカクカクするときがあったけど
解消しているはずだ。テストしてみよう!
4つでもしっかりスムーズに
動いてるぞ!きたぁ!
次回へ
今回はスケールアップさせてスムーズな
同期が
確立したぞ。これで
理論上は100
人同時接続のオンラインゲームにも
耐えられるエンジンができたことになる!すごくね?さぁさぁ、もう
完成と
言いたいところだけど、このままじゃあ
詰めが
甘い。しっかり
作り
込んでこそのトップクラス・オンラインゲームエンジンだ。
次は
退場処理を
作っていこう。どうゆうことかって?たとえば
今の
状態で、4つのタブのうち1つを
閉じても、
他の
画面から
猫は
消えないんだ。でも
他の
人からしたら、
止まってる
人がタブを
閉じたのか、ただ
止まってるだけなのか
分からないよね。そこで、ある
程度ずっと
止まってる
人がいたら
閉じたと
判定して
表示を
消すっていう
処理をしたいと
思う!
次回ね。よぉし、じゃあ
待っててくれ。なんならキミのオンラインゲームのアイデアを
温めながら
待っててね。どんなゲームを
作りたい?