我一直在与一个自动运行功能在棋盘游戏中为两名玩家呈现画布上的元素进行了数日的搏斗。从一个玩家移动到另一个玩家可见的整个过程耗时过长。我设法通过优化我作为流星初学者编写的代码来削减很多,并且通过将更新游戏的方法放入(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与游戏页面具有相同的延迟。 由于我的理解不够清楚,如果客户端知道数据库发生了变化,自动运行应该简单地运行,就像助手简单运行一样。 我会非常感谢谁向我解释导致延迟的自动运行行为,以及是否有办法取消它。
在此先感谢!
这只会解释为什么谁通过这个回合通常会看到移动的结果之前的第二个没有调用该方法的玩家。我通过放置方法(meteor.isServer)取消了该行为。我所说的差距也发生在第二个没有调用该方法的玩家身上,因此他的客户端只有在服务器向他发送数据后才能更新。一旦服务器发送数据,他的助手会立即更新,他的自动运行更新只有45毫秒(一致) – Fuseques
如果在自动运行中条件为“this.subscriptionsReady()”,则添加。因此,您的控制台日志只会在订阅准备就绪时显示。但是,如果您的帮手,它会显示订阅的准备或进行状态。 this.subscriptionsReady()也等待来自服务器的就绪状态,该服务器将this.subscriptionsReady()设置为true。 make sence? –
我看到...我的测试模板的自动运行延迟确实消失,一旦我删除订阅准备就绪。不幸的是,对于我原来的自动运行,呈现帆布板,没有订阅开始,并仍然有一个延迟... – Fuseques