【发布时间】:2011-12-02 16:16:12
【问题描述】:
现在我正在制作的游戏中有两个游戏循环。一个循环遍历屏幕上的对象数组的绘制循环和一个执行游戏逻辑的逻辑循环。我的逻辑循环比绘图循环运行了大约 10 帧。我之所以这样设置,是因为执行游戏逻辑可能需要更长的时间,而且我不希望它干扰绘图循环。
我的逻辑循环是这样设置的:
vs.logicloop = function(){
vs.Gameloop();
//do the updating of object scripts
if(vs.windowActive){
var l = vs.scenegraph.length;
var i = 0;
while(i < l){
vs.scenegraph[i].logicScript();
i++;
}
}
//restart loop
setTimeout(vs.logicloop, 1000/(vs.fps+10));
};
和这样的绘制循环:
vs.drawloop = function(){
//clear the screen
vsd.clr();
//goes through everything in the scene
//graph and draws it and runs each object's
//personal draw code
if(vs.windowActive){
var l = vs.scenegraph.length;
var i = 0;
while(i < l){
vs.ctx.save();
vs.scenegraph[i].update();
vs.scenegraph[i].draw();
vs.scenegraph[i].drawScript();
vs.ctx.restore();
i++;
}
}
//restart loop
setTimeout(vs.drawloop, 1000/vs.fps);
};
我使用 setTimeout 是因为我听说 setInterval 会导致循环重叠,如果一个还没有完成。 我可以做一些优化来真正提高速度吗?尤其是优化游戏循环。
我听说过一些 javascript 引擎会同时在屏幕上显示数千个对象。我无法想象他们是如何做到的,在一台非常旧的计算机上最多可以在屏幕上显示 100 个对象,而在一台库存充足的计算机上最多可以显示大约 700 个对象。这还没有在后台运行大量游戏代码,在我研究出如何进行像素完美碰撞检测和物理之前。
我的过程是在每次绘制循环时在画布上绘制背景色填充矩形,然后遍历所有对象并绘制它们的绘制代码。它也不会尝试将对象绘制到视野之外。
这是我的第一份带薪工作,我真的很想给人留下深刻印象。另外,一旦我完成游戏,我就可以保留引擎的所有权。
非常感谢
【问题讨论】:
-
评论是多余的,浏览器会为你做缓冲:)
-
我进行了一些搜索,听说使用多个画布会有所帮助,我想我也会尝试一下,但我真的很想听听有关让游戏循环运行得更快的任何意见跨度>
-
你支持哪些浏览器?
标签: javascript html optimization canvas