SSブログ

AppleScriptで1/100(100分の1)秒を計れないか?【Mac】 [Macでゲームをつくろう!]

こちらの記事は古い上に不正確な計測ですので、別記事のミリ秒計測の項目をご覧くださいい。
(管理人: 1015.10.28修正)



やってみました。

AppleScriptでは1秒以下の時間を取得できる方法が基本的に有りません。
スクリプト自体の動作の遅さから作らなかったのか、それ以上求めるなら
Object-CなりJavaなり他の言語でも使えと言わんばかりですが、
どうしてもAppleScriptのみで何とかならないか? と、考えてみました。
しかしAppleScriptでシステムから直接ミリ秒を取得することができる逃げ
道が見当たらないので、簡易的なスクリプトを考えてみました.


(*初期設定*)
property mSec : 0 --スクリプト全体で変数|mSec|を共有できるようにします

(*メインルーチン*)
on run
WaitTimeReset(1) --(*リセットするサブルーチンを呼び出しています*)
WaitTime(50) --(*一時停止する時間を決めその時間分止めるサブルーチンを呼び出しています*)
end run

(*これよりサブルーチン*)
on WaitTimeReset(rp)
set a0 to time of (current date)
repeat
set a1 to time of (current date)
if a1 is not a0 then exit repeat
end repeat
set b to 0
repeat
set b to b + 1
set a2 to time of (current date)
if (a2 - a1) < rp then
--
else
exit repeat
end if
end repeat
set mSec to (b / rp) as integer
return mSec
end WaitTimeReset

on WaitTime(x)
set b to -1
set c to (0.01 * mSec * x)
repeat
set b to b + 1
set dammy to time of (current date)
if b < c then
else
exit repeat
end if
end repeat
end WaitTime

ここからスクリプトの説明です、

このスクリプトは、指定されたミリセコンド単位で進行を一時停止するものです。
最初に|property|命令を使い、変数|mSec|をこのスクリプト全体で共有できるように宣言をしています。
初期値も決められるのですが、ここでは何でも良いので あえて0を入れておきました.
追記)何でも良いのであれば|global|で宣言しても良いのですが、宣言した変数にはまだ何も入っていない(nul)状態なので その後変数の代入を忘れないようにしなければいけません。

その次の行の|on run|〜|end run|では、ミリ秒の初期設定用の|WaitTimeReset|と実際の作業(Wait作業)ルーチン|WaitTime|の呼び出しをしています。
このメインルーチンである|run|ハンドラは、作りたいプログラムを入力する場所になります。呼び出す例として使っています。
追記)|on run|と|end run|のハンドラを宣言している最初と最後の2つの行は、スクリプトエディタでは基本的に省略してもかまわない事になっています。今回はあえて記入しました。

さて、これからが一番説明しなければいけない部分ですが 流れとしては2つのサブルーチンから構成されています。
WaitTimeReset(x) ・・・ マシンによって変わるスペック等の計算をし
時間内にさせた空ループの回数を取得します。
ここではxで指定した時間(単位は秒)で何回
空ループするかを取得し変数|mSec|に代入
しています。これを1ミリ秒での平均回数を
計算してます。つまり1ミリ秒の間に何回空ルー
プするかを測ってるんですね。
WaitTime(y) ・・・・・・ |mSec|の数値をもとに指定されたyミリ秒の
時間を空ループするものです。

スクリプトを読んで解る人なら、なんでこんな回りくどい事をしてるんだ?と思うところも有るでしょうが、とりあえずいかがでしょう?

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。