2013-12-16 38 views
0

我需要在浏览器(手机和桌面)上重现类似动画的效果,这种效果只是背景颜色从黑色到白色的程序变化。setTimeout函数精确定时

调光很重要,因为短时间的黑色背景意味着“0”,而更长的时间意味着“1”(就像二元莫尔斯电码)。该信息由屏幕前面的光传感器解释。传感器速度非常快,如果我们使用较低的频率,我们不会遇到屏幕问题(假设最大刷新频率为50Hz)。

这是使用脚本IM:

var i = 0; 
var b0t = 100; 
var b1t = 3.5 * b0t; 
var wl = 100; 

function pulses(){ 
    bytes = "1001101010110101001000100"; 

     bit = bytes[i]; 

     i += 1; 

     document.body.style.backgroundColor = 'white'; 
     document.body.style.color = 'white'; 

     setTimeout(toblack, wl); 

     if(i <= bytes.length) { 
      if (bit == 1) 
       setTimeout(pulses, b1t + wl); 
      else 
       setTimeout(pulses, b0t + wl); 
     } 
} 

function toblack() { 
    document.body.style.backgroundColor = 'black'; 
    document.body.style.color = 'black'; 
} 

pulses(); 

而一个working demo(如果你受到任何癫痫综合征,不要打开)

的问题是,1出20浏览器一塌糊涂的计时,当然在传感器方面,我有一个容忍范围,一个非常宽容的范围,但浏览器有时再次出现几毫秒,这并不奇怪,如果您的手机电脑在后台执行某些操作,性能的浏览器受到严重影响。

有没有这方面的软件解决方案?我正在考虑使用闪光灯更精确地进行闪烁,但我真的很喜欢我的应用程序可以从IOS访问。或者我可以创建一个本地应用程序,肯定会比浏览器更精确,但是再次,我想知道我是否可以使其在浏览器上工作。

+0

我认为NaCl应用程序是最好的解决方案,因为您真的不想依赖同步单线程应用程序中的计时器(至少在我的经验中)。 Flash可能会诀窍,但正如你所说,IOS可能是一个问题。也许帆布? http://stackoverflow.com/questions/16253920/canvas-game-timer –

+1

*“...假设最大刷新频率为50Hz ...”*这似乎是一个无效的假设,我用过的大多数显示器都是至少* 60Hz,即使在英国,这里的主电源是50. –

+1

还有其他的方法来计时JS中的事件,上面的链接或[this](http://stackoverflow.com/questions/13939719/best-方法 - 创建时间敏感 - 浏览器 - 应用程序 - 桌面 - 高 - ti)可能是使用setTimeout的可能替代方案 – DBS

回答

1

我建议你尝试的唯一的事情就是,忘记sestTimeout并尝试Date()。getTime()它会给你一个微秒的unix时间戳,你可以尝试查询并实现你自己的设置超时。我不知道这是否会奏效,但你没有失去任何努力。

看看这里http://www.sitepoint.com/creating-accurate-timers-in-javascript/

有一些例子。