2016-07-24 42 views
0

我一直在与一个自动运行功能在棋盘游戏中为两名玩家呈现画布上的元素进行了数日的搏斗。从一个玩家移动到另一个玩家可见的整个过程耗时过长。我设法通过优化我作为流星初学者编写的代码来削减很多,并且通过将更新游戏的方法放入(meteor.isServer)中,以便它不会首先在移动制造商的客户端中运行该方法它已经在服务器的文件夹中了)。 一次延迟超出了我的理解,发生在服务器完成移动制作方法之前,直到客户端的自动运行开始运行(Chrome大约需要60 ms,Firefox使用150(!))。我已经进行了一些测试,试图缩小为什么会发生这种情况的选项,最后一个是从另一个页面订阅游戏集合,并查看响应时间是否也很慢。这是代码:流星自动运行响应速度比助手慢

Template.Watch.onCreated(function(){ 
    this.subscribe('activeGames'); 
    this.autorun(()=>{ 
    if(this.subscriptionsReady()){ 
     console.log(Games.findOne().turn + " " + (new Date).getTime()); 
    } 
    }); 
}); 


Template.Watch.helpers({ 

    games:()=> { 
    console.log(Games.findOne().turn + " " + (new Date).getTime()); 
    return Games.find({result: false}); 
    } 

}); 

现在,客户都console.logs每当出现一个举动被打时,奇怪的事情是,帮助者的console.log与无延迟发射,自动运行的控制台前50毫秒.log与游戏页面具有相同的延迟。 由于我的理解不够清楚,如果客户端知道数据库发生了变化,自动运行应该简单地运行,就像助手简单运行一样。 我会非常感谢谁向我解释导致延迟的自动运行行为,以及是否有办法取消它。

在此先感谢!

回答

1

当你调用使用Meteor.call客户端上的方法,两件事情发生在并行:

  1. 客户端发送一个请求到服务器在安全 环境中运行的方法,就像一个AJAX请求将工作

  2. 方法的仿真直接运行在客户机上尝试预测利用现有信息服务器调用的结果 。

因此,这里的原因自动运行之前,你的助手控制台打印。

  • 你的迷你蒙戈(客户端DB)获取根据点号2。
  • 根据点1号服务器的数据更新之前更新时,客户端向服务器发送的请求,则服务器将更新服务器数据库服务器将数据重新发布到客户端,并在您的案例中自动运行重新初始化。

所以重点是你的迷你mongo(客户端数据库)在订阅准备就绪之前更新。这就是为什么你在自动运行之前将控制台登录到帮助程序中。当你的服务器数据到客户::

如果来自服务器的结果回来,并与 模拟客户端上的一致,一切都仍保持原样

一两件事发生。如果 上的结果与服务器与 客户端上的仿真结果不同,则将修补UI以反映服务器的实际状态。

+0

这只会解释为什么谁通过这个回合通常会看到移动的结果之前的第二个没有调用该方法的玩家。我通过放置方法(meteor.isServer)取消了该行为。我所说的差距也发生在第二个没有调用该方法的玩家身上,因此他的客户端只有在服务器向他发送数据后才能更新。一旦服务器发送数据,他的助手会立即更新,他的自动运行更新只有45毫秒(一致) – Fuseques

+1

如果在自动运行中条件为“this.subscriptionsReady()”,则添加。因此,您的控制台日志只会在订阅准备就绪时显示。但是,如果您的帮手,它会显示订阅的准备或进行状态。 this.subscriptionsReady()也等待来自服务器的就绪状态,该服务器将this.subscriptionsReady()设置为true。 make sence? –

+0

我看到...我的测试模板的自动运行延迟确实消失,一旦我删除订阅准备就绪。不幸的是,对于我原来的自动运行,呈现帆布板,没有订阅开始,并仍然有一个延迟... – Fuseques