忍者ブログ

背伸びした視点のブログ→のーみそじっぷ


のーみそじっぷ  2011 / 04 / 29 ( Fri )

こんばんは。Minecraftすごく面白そうでやってみたいけどやったら最後、全ての時間が消し飛ぶ気がしてまだ手を出していないぽりです。サバイバルってオトコのコだよなあ


3.ウディタ小ネタ 圧縮テクニック


今回の内容は、前回言っていたとおり、処理速度と戦うための節約術の話です。つまりこの話は必死に学習したところでFPSがちょっと上がるだけの話。何か新しい事ができるわけでもありません。この話がよく分からなかったとしても何も心配する必要はないのです。

ということで大きく予防線を張ってから小ネタの話。



例えば、こんなコモンイベントを作るとします。

1:cself[0]に入力したフレーム数だけウエイトをする
2:ただし、ウエイト中に決定キーを押したらそこで中断



この処理自体はすごく簡単なものですね。


■回数付きループ [ このコモンEvセルフ0 ]回
|■ウェイト:1 フレーム
|■キー入力:このコモンEvセルフ変数10 / 決定(10)
|■条件分岐(変数): 【1】このコモンEvセルフ10が10と同じ
|-◇分岐: 【1】 [ このコモンEvセルフ10が10と同じ ]の場合↓
||■ループ中断
||■
|◇分岐終了◇
|■
◇ループここまで◇◇






さて、それじゃあこれを発展したこんな処理はどうやって作ればいいでしょうか。


3:どうせだからキャンセルキー・サブキーでも中断できるようにしよう
4:どうせだから[決定] [キャンセル] [サブ] [決定/キャンセル] [決定/サブ] [キャンセル/サブ] [決定/キャンセル/サブ]で中断方法は7択できるようにしよう




いきなり難易度が上がりましたね。まず何も考えずにこの処理を組むとこんな感じかな?

※cself[1]に中断させるキー選択肢[決定(1)][キャンセル(2)][サブ(4)][決定/キャンセル(3)][決定/サブ(5)][キャンセル/サブ(6)][決定/キャンセル/サブ(7)]です。なぜこんな謎の順番なのかは後々。


■条件分岐(変数): 【1】このコモンEvセルフ1<対応キー>が1と同じ 【2】このコモンEvセルフ1<対応キー>が2と同じ 【3】このコモンEvセルフ1<対応キー>が3と同じ
-◇分岐: 【1】 [ このコモンEvセルフ1<対応キー>が1と同じ ]の場合↓
|■変数操作: このコモンEvセルフ11<決定キー> = 1 + 0
|■
-◇分岐: 【2】 [ このコモンEvセルフ1<対応キー>が2と同じ ]の場合↓
|■変数操作: このコモンEvセルフ12<キャンセルキー> = 1 + 0
|■
-◇分岐: 【3】 [ このコモンEvセルフ1<対応キー>が3と同じ ]の場合↓
|■変数操作: このコモンEvセルフ11<決定キー> = 1 + 0
|■変数操作: このコモンEvセルフ12<キャンセルキー> = 1 + 0
|■
◇分岐終了◇
■条件分岐(変数): 【1】このコモンEvセルフ1<対応キー>が4と同じ 【2】このコモンEvセルフ1<対応キー>が5と同じ 【3】このコモンEvセルフ1<対応キー>が6と同じ
-◇分岐: 【1】 [ このコモンEvセルフ1<対応キー>が4と同じ ]の場合↓
|■変数操作: このコモンEvセルフ13<サブキー> = 1 + 0
|■
-◇分岐: 【2】 [ このコモンEvセルフ1<対応キー>が5と同じ ]の場合↓
|■変数操作: このコモンEvセルフ11<決定キー> = 1 + 0
|■変数操作: このコモンEvセルフ13<サブキー> = 1 + 0
|■
-◇分岐: 【3】 [ このコモンEvセルフ1<対応キー>が6と同じ ]の場合↓
|■変数操作: このコモンEvセルフ12<キャンセルキー> = 1 + 0
|■変数操作: このコモンEvセルフ13<サブキー> = 1 + 0
|■
◇分岐終了◇
■条件分岐(変数): 【1】このコモンEvセルフ1<対応キー>が7と同じ
-◇分岐: 【1】 [ このコモンEvセルフ1<対応キー>が7と同じ ]の場合↓
|■変数操作: このコモンEvセルフ11<決定キー> = 1 + 0
|■変数操作: このコモンEvセルフ12<キャンセルキー> = 1 + 0
|■変数操作: このコモンEvセルフ13<サブキー> = 1 + 0
|■
◇分岐終了◇
■回数付きループ [ このコモンEvセルフ0<WaitTime> ]回
|■ウェイト:1 フレーム
|■キー入力:このコモンEvセルフ変数10 / 決定(10) キャンセル(11) サブキー(12)
|■条件分岐(変数): 【1】このコモンEvセルフ10が10と同じ 【2】このコモンEvセルフ10が11と同じ 【3】このコモンEvセルフ10が12と同じ
|-◇分岐: 【1】 [ このコモンEvセルフ10が10と同じ ]の場合↓
||■条件分岐(変数): 【1】このコモンEvセルフ11<決定キー>が1と同じ
||-◇分岐: 【1】 [ このコモンEvセルフ11<決定キー>が1と同じ ]の場合↓
|||■ループ中断
|||■
||◇分岐終了◇
||■
|-◇分岐: 【2】 [ このコモンEvセルフ10が11と同じ ]の場合↓
||■条件分岐(変数): 【1】このコモンEvセルフ12<キャンセルキー>が1と同じ
||-◇分岐: 【1】 [ このコモンEvセルフ12<キャンセルキー>が1と同じ ]の場合↓
|||■ループ中断
|||■
||◇分岐終了◇
||■
|-◇分岐: 【3】 [ このコモンEvセルフ10が12と同じ ]の場合↓
||■条件分岐(変数): 【1】このコモンEvセルフ13<サブキー>が1と同じ
||-◇分岐: 【1】 [ このコモンEvセルフ13<サブキー>が1と同じ ]の場合↓
|||■ループ中断
|||■
||◇分岐終了◇
||■
|◇分岐終了◇
|■
◇ループここまで◇◇



わーこれはなげー

これでちゃんと動くので、これを完成としちゃっても別に問題はありません。特にウエイト処理を1フレームに複数入れる状況は理論上ありえませんので、別にここが長くても何ら影響はありません。ですが勉強のためにこの処理をとにかく短く書いてみましょう。



処理をとにかく短くするときに考えるべき部分は以下のとおり。

1.できるだけ条件分岐を作らない
2.できるだけ1つの計算・分岐に収まらないか考える
3.変数領域を節約しようとはあまり考えない(ちょっとしたことでも保存しておくと後々計算せずに呼び出すことがあるかもしれない)
4.処理を減らすアルゴリズムを考えるときに「ビット積」は地味に有用な場面が多い



さてこんな事を考えながら今のぽりが思いつく理論最短のキーウエイト処理を書いてみました。↑と全く同じ動きをするはずです。



※cself[1]に中断させるキー選択肢[決定(1)][キャンセル(2)][サブ(4)][決定/キャンセル(3)][決定/サブ(5)][キャンセル/サブ(6)][決定/キャンセル/サブ(7)]です。なぜこんな謎の順番なのかはビット積の処理のため。


■変数操作: このコモンEvセルフ12 = このコモンEvセルフ1<対応キー> 論理積 1
■変数操作: このコモンEvセルフ13 = このコモンEvセルフ1<対応キー> 論理積 2
■変数操作: このコモンEvセルフ14 = このコモンEvセルフ1<対応キー> 論理積 4
■回数付きループ [ このコモンEvセルフ0<WaitTime> ]回
|■ウェイト:1 フレーム
|■キー入力:このコモンEvセルフ変数10 / 決定(10) キャンセル(11) サブキー(12)
|■変数操作: このコモンEvセルフ10 += 1600002 + 0
|■変数操作: このコモンEvセルフ10 = V[このコモンEvセルフ10] + 0
|■条件分岐(変数): 【1】このコモンEvセルフ10が1以上
|-◇分岐: 【1】 [ このコモンEvセルフ10が1以上 ]の場合↓
||■ループ中断
||■
|◇分岐終了◇
|■
◇ループここまで◇◇




★簡単な解説★
6行目の「キー入力」処理によって、cself[10]には「決定キーが押されていたら10、キャンセルキーなら11、サブキーなら12、どれも押していなかったら0」が入ります。
その後2行の計算によって、cself[10]には「決定キーが押されていたらcself[12]の中身が、キャンセルキーならcself[13]の中身、サブキーならcself[14]の中身、どれも押していなかったらcself[2]の中身」が入ってます。
cself[2]は初めから何も処理してませんから必ず0。それ以外の3つには、1~3行目のビット積処理で「0または1,2,4」のどちらかが入っているので「指定した変数の中身が1以上か」を調べることによって分岐できます。
ビット積に関しては詳しい話を過去にしたのでこちらを参照。


わーめちゃくちゃ減ったー


基本的に条件分岐1個にかかる処理は、変数操作2~5個分とされています。この例の処理だと、最初のウエイトに入るまでの7つの条件分岐が3つのビット積に収まったのが大きく処理時間削減に役立ってます。





処理時間を減らすアルゴリズムの考え方はいろいろありますが、ぽりがよく使う考え方を紹介。


1.できるだけ条件分岐を作らない

「変数Xが0のとき変数YにAを代入、変数Xが1のとき変数YにBを代入」という処理、フラグ関連処理でよく使いますね。この処理に条件分岐は全くいりません。
Y=A+(B-A)*XでOK。


2.できるだけ1つの計算に収まらないか考える


例えば「変数Xが10以上15以下の時に分岐する」という処理、まあよくあるでしょう。これを実装するためには分岐を2つ使うのがベターですが、ドモルガンの法則により、この分岐は「変数Xが9以下でも16以上でもない時に分岐する」と書き換えることができます。これなら

■条件分岐(変数): 【1】このコモンEvセルフ10が9以下 【2】このコモンEvセルフ10が16以上
-◇分岐: 【1】 [ このコモンEvセルフ10が9以下 ]の場合↓
|■
-◇分岐: 【2】 [ このコモンEvセルフ10が16以上 ]の場合↓
|■
-◇上記以外
|▼ ここに処理を書く
|■
◇分岐終了◇


で条件分岐1つでOK。ウディタの条件分岐は1分岐が2つよりも2分岐が1つのほうがわずかに早くなるようです(ネタ元:だめだめはきだめ




主にこんな感じ。改めて言いますが、覚えたからって何か見た目が変わるわけじゃありません。完全な自己満足の世界です。でもある程度の製作ができるようになったら、自己満足に挑戦してみるのも趣味製作の醍醐味じゃあないかなー、って思うわけです。

拍手

PR

Comment

お名前
タイトル
文字色
URL
コメント
パスワード

プラグイン

カウンター

サイト移動

メインページへ行く
背伸びした視点の日々
旧ブログへ行く
この視点の日々

執筆者として参加していたようです
ウディタ新聞

ついったー

カレンダー

06 2017/07 08
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 25 26 27 28 29
30 31

プロフィール

HN:
ぽり0655
年齢:
28
性別:
男性
誕生日:
1989/04/16
自己紹介:
主に日記を書きながら、たまにゲームを作ったり作らなかったり。

最新記事

最新コメント

※ぽりが返信したコメントには、タイトル横にマークが付いています
[07/28 MK]
[03/10 拍手したものです]
[12/25 NONAME]
[12/13 拍手したものです]
[09/15 拍手したものです]

カテゴリー

ブログ内検索

アーカイブ

RSS

管理者専用