はじめに
前回の性能調査の結果、以下のようなことがわかりました。
- 前進・後進・上昇・下降・回転など、一つの行動をするのに0.365秒かかる。
- turtle.dig()で1個のブロックを破壊するのに0.35秒かかる。
- turtle.detect()など、Turtle APIのイベント処理を内包する関数は一律0.05秒の時間がかかる。
そこで気になるのが、「More Turtles Mod」のシルクタッチタートル(SilkTouch Turtle)です。 SilkTouch TurtleのdigSilkTouch()関数は、周辺機器から提供されています。
つまり、標準のturtle.dig()はイベント処理を内包していますが、digSilkTouch()はイベント処理を介していないのです。
ということは、実行に一律0.05秒なんて(無粋な)制限はかかっていないかも! これは期待が高まりますね。
前回と同じような方法で調査してみました。
具体的には、前回のプログラムからdig()をdigSilkTouch()に変えた以下の条件5、6を調べました。
(ここでクイズ。どちらがシルクタッチタートルでしょうか? 答えは最後のまとめにて)
調査方法
テンプレート
自動実行のため「startup」というファイル名で保存。
silkP = peripheral.wrap("right") print(os.clock()) for i=1, 10 do --(ここに条件ごとに異なるコードを入れる) turtle.forward() end print(os.clock())
追加の条件
- 条件5: detect+digSilkTouch(+forward)
if turtle.detect() then silkP.digSilkTouch() end
- 条件6: digSilkTouch(+forward)
silkP.digSilkTouch()
結果
以下の表は、条件1,2,3,4が前回と同じ表となります。 条件5と6が今回付け加えた部分です。
表に示した値は、各計測値を条件4(forwardのみ)の時間4.15秒との差をとることで正規化し、 その後に10で割ったものになります。
すなわち、関数1回実行あたりに必要な時間(単位は秒)です。
条件1 (detect+dig) | 条件2 (detect) | 条件3 (dig) | 条件4 (なし) | 条件5 (detect+silk) | 条件6 (silk) | |
---|---|---|---|---|---|---|
ブロックなし | 0.05 | 0.05 | 0.05 | 0 | 0.05 | 0 |
ブロックあり | 0.45 | - | 0.4 | - | 0.05 | 0 |
特に注意してほしいのは、条件4、5、6です。 ……とても面白い結果ですね。
結果考察
まずはブロックなし条件において条件6(digSilkTouch()使用)を見ると値は0(秒)となっています。
つまり、digSilkTouch()の実行に時間はかかっていません。
少なくともos.clock()関数による計測限界よりも短い時間しかかかっていません。すばらしい!
しかも驚くべきことに、ブロックあり条件における条件6も0(秒)です。
ということは、ブロック無しでスルーした場合のみならず、ブロック破壊にも時間がかからないということに!!!
ブロックを破壊しようがしまいが、digSilkTouch()実行の処理時間は極小なのですね。
これはとても強力です。(シルクタッチ採掘が地味に早い気がしていたのは気のせいじゃなかった)
SilkTouch TurtleのdigSilkTouch()関数の利点がもう一つ増えましたね。
今回のまとめ
クイズの答え
情熱の赤でアイテムを増やす幸運効果、
冷静な青で慎重にシルクタッチと覚えるのはどうでしょう(提案)
シルクタッチタートルの特徴
- シルクタッチ(digSilkTouch())でブロックを掘ることができる
- 1回掘るのに燃料を1消費する
- (New!!) ブロックを掘るのに時間がかからない
- 通常のturtle.dig()は掘るのに0.35秒、空振りしても0.05秒かかる。
つまり最速でシルクタッチ! これって最強じゃね?
これはとてもうれしい利点なので、作者
様、修正しないでくださいな。
伏してお願い申し上げます。そのためなら、なんでもしますから!