myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

JScript で Sleep / Timer

以前にJScriptからVBScriptのSleepを実行する方法を書いたんですけど、このやり方だと必ず2ファイルになってしまいます。アドオンとかだったら別に問題ないけど、スクリプトとプラグインだと面倒かもしれません。

さっきふと思ったんだけど、JScriptからそのSleep専用スクリプトを作って、実行して、消せばいいじゃない?

VBSを作っているからタイムラグが出て正確なタイマーにはなりません。
俺の実験では60~80ミリ秒のラグがあります。

function Sleep(seconds){
// Creating the VBS Sleep File in C:\
var FSO = new ActiveXObject("Scripting.FilesystemObject");
var VBSleep = FSO.CreateTextFile("C:\\vbsleep.vbs", true);
VBSleep.WriteLine("dim mult : mult = wscript.Arguments.Item(0)");
VBSleep.WriteLine("wscript.sleep 1000 * mult");
VBSleep.Close();

// Calling VBS Sleep
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.run("C:\\vbsleep.vbs " + seconds, 2, 1)
FSO.DeleteFile("C:\\vbsleep.vbs")
}


しかしメリットとしては、待っている間にCPUが使われません。


因みに、ミリ秒を秒にしている時点で2ミリ秒ぐらいのタイムラグが出ます。


CPU使用率より正確なタイマが必要な時に、ミリ秒で while ループにすれば良いです。

JRの方とかかな?

とにかくこんな感じ:


function Sleep(seconds){
var StartTime = new Date();
var datet = 0;
while(datet < (seconds * 1000)){
var EndTime = new Date();
var datet = EndTime.getTime() - StartTime.getTime();
}
}


これでループして毎回 経過時間 - 開始時間 という計算して、目的時間と比べているからCPUの使用率がずっと100%のままです。最近のCPUはマルチコアだけど、スクリプトはマルチスレッドじゃないから1コアだけが使用率100%になります。なので、大抵の場合は特に影響がないかもしれません。

メリット: VBSleepより正確なタイマーです。
デメリット: Sleepしている間にCPU1コアを100%で使いまくります。

なので、スリープの時間が長いか、しょぼい1コアのPCでやる時にVBS-Sleepでやったほうが良いかもしれません。

なんか、無駄にCPU使用率を100%にするのは嫌です。
僕、エコですから。


プラグインを作る気があれば、TimerEvent を使えば良い。
メリット: 上記の方法より正確でCPUにやさしい。
デメリット: Softimage以外のソフトでは使えません。当たり前ですけど。プラグインかアドオンにしないと使えません。


タイマー機能としては微妙としても、なんかの参考になれば良いな~。

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/67-96f368da
Use trackback on this entry.