我正在寻找如何让客户在动画时保持同步的想法。我正在尝试用meteor构建一个基于浏览器的提词器。我已经有了基本的功能,我可以设置字体大小和滚动速度,但我还没有想出一个可靠的方法来让所有的客户端在滚动开始时保持同步。
到目前为止,我已经尝试了两种方法,都有效,但都不是完美的。
我的第一个想法是在服务器上运行一个间隔,它用位置更新一个集合。这在局域网上工作得很好,但是一旦我移动到互联网上,更新和客户端上观察到的更新之间的滞后时间导致滚动卡顿。下面是代码的样子:
服务器:
if(Meteor.isServer){
Meteor.methods({
start_scroll: function(){
interval = Meteor.setInterval(function() {
var _speed = Prompter.findOne({_var:"prompter_speed"})._val;
Prompter.update({_var:"prompter_y"}, {$inc:{_val:(-1*_speed/4)}});
}, 30);
}, ...
}客户端:
if(Meteor.isClient){
Prompter.find({_var: "prompter_y"}).observe({
changed: function(pos){
$("#inner_scroll").css({top: pos._val});
}
});
}上面版本的主要问题是,观察更新时的任何延迟都会导致动画卡顿。所以,我决定在客户端做动画。这就是我想出的方法:
服务器:
if(Meteor.isServer){
Meteor.methods({
start_move: function(){
Prompter.update({_var:"prompter_move"},{$set:{_val:1}});
}, ...
}客户端:
if(Meteor.isClient){
Prompter.find({_var: "prompter_move"}).observe({
changed: function(obj){
if(obj._val == 1){
interval = Meteor.setInterval(function(){
var cp = parseFloat($("#inner_scroll").css("top"));
var sp = parseInt(Session.get("_speed"));
var mv = cp + (-1 * sp)/4;
$("#inner_scroll").css("top", mv);
}, 30);
}
else{
Meteor.clearInterval(interval);
}
}
});
}在这个版本的客户端上,动画非常流畅,但是(由于观察“启动”更新的延迟)客户端可能不会同时启动,因此不同步。我注意到的另一个问题是,在这个版本中,一些速度较慢的客户端(就CPU性能而言)滚动速度较慢。
我正在挠头,有什么建议吗?
发布于 2012-11-01 06:54:30
我最终使用了时间戳比较来保持所有内容的同步。当服务器收到更新请求时,它会创建一个时间戳。时间戳与更新的数据一起传递,因此客户端可以将时间戳与“现在”进行比较,并进行相应的调整。
仍然对其他建议持开放态度,但这对我来说工作得很好。
https://stackoverflow.com/questions/13020384
复制相似问题