HTML5请求游戏刷新率动画帧

问题描述:

我正在开发一款使用HTML5 Canvas和JavaScript的游戏。最初的FPS是体面的,但随着游戏的持续,FPS下降。最初的fps大约是45 fps,但它降低到5 fps。HTML5请求游戏刷新率动画帧

以下是我gameloop

var last_draw = Date.now(); //To track when last time GameDraw was called last time 
var fps; 
function gameloop() 
{ 
    var elapsed = Date.now() - last_draw; 
    last_draw = Date.now() 
    fps = 1000/elapsed; 
    context.clearRect(0,0,canvas.height,canvas.width);// This function clears the canvas. 
    GameUpdate();// This function updates property of all game elements. 
    GameDraw(); //This function draws all visible game elements in the canvas. 
    window.requestAnimationFrame(gameloop); //Requests next frame 
} 

window.requestAnimationFrame(gameloop); 

它在以下浏览器测试了这一点:

  1. 的Mozilla Firefox 32.0.3
  2. 谷歌浏览器38.0.2125.101米

我的问题是

  1. 为什么rAF在游戏继续时调用频率较低?
  2. 是否由于内存泄漏?
  3. 是否因为GameDraw和GameUpdate花费的时间非常长?
  4. 是否执行Gamedraw函数的时间与实际在画布中绘制元素所用的时间不同。 Gamedraw调用绘制每个游戏元素的功能。
+3

你的循环代码看起来很好。没有更多信息,我们无法帮助您找到确切的问题。 Chrome开发人员工具具有出色的工具来检查内存泄漏或检测不同功能的配置文件(测量执行速度)。我推荐免费课程https://www.codeschool.com/courses/discover-devtools以了解如何使用这些工具。 – Iftah 2014-10-12 14:11:30

+0

谢谢您的回复。你是对的我应该先学习铬devtools为了消除我的问题。 – 2014-10-12 14:48:27

你会发现很多关于优化画布性能的在线教程。这不是关于使用这个或那个功能,而是关于每两帧之间发生的处理量。

由于您的问题(S)不能有一个坚实的答案,我将简要讨论每个子问题:

为什么皇家空军称其为比赛继续那么频繁?

就像你在接下来的问题猜到了 - 这是泄漏:它可能是从,说什么,在每个周期中增加更多的纹理,事件监听器,DOM对象,等...只需有太多的JS对象堆积,因为它们仍然被引用,所以垃圾收集器无法摆脱它们。但底线是你需要发现每两帧之间的变化/增加。

是否由于内存泄漏?

很可能,而且很容易测试。在Chrome中,Shift + Escape将打开任务管理器,您可以在其中查看每个打开选项卡的内存,CPU等使用情况。监视它。

是否因为GameDraw和GameUpdate所花费的时间非常长?

绝对是!这也可能导致内存泄漏。学会做CPU和画布分析,它会帮助你很多。我相信Chrome中的画布分析仍然是一个实验性功能,因此您需要先从配置标记启用它。这两个函数是99%的滞后来自哪里,调查那里发生了什么。

是时候执行Gamedraw函数与实际在画布中绘制元素所用的时间不同。 Gamedraw调用绘制每个游戏元素的功能。

这应该不重要,因为它们都是阻止代码,意味着一个只会在另一个之后发生。渲染帧的时间大致是两者的总和。再次,适当的画布渲染优化可以在这里创造奇迹。

+0

先生,我使用Chrome devtools记录了我的游戏时间线。看起来好像是时候运行脚本,渲染和绘制小于16毫秒,但对于“其他”而言,铬合金工具正在花费更多时间。你能解释一下这个灰色条代表什么吗? 以下是链接到时间轴快照 - [时间轴快照](https://drive.google.com/file/d/0B34WuAFidsDNeHJ3YU1POVVUSzA/view?usp=sharing) – 2014-10-13 07:40:12

+0

这可能是很多事情。尝试将开发工具扩展到全屏,然后使用鼠标选择时间线的一部分。下面将显示该时期所有事件的列表。隔离花费最多时间的人,看看是否有什么可以优化他们的方法。 – Shomz 2014-10-13 08:03:15

+0

在Chrome浏览器中,我使用任务管理器来监视内存和CPU,并且根据观察结果,内存随着时间的推移不断增加,CPU数量为25个。现在可以确定对象正在创建并且不会被垃圾收集。所以请告诉我解决这种情况的方向。 我还想告诉我,在我的游戏中,大部分时间我都使用new运算符创建对象,并将其引用存储在数组中。要清除该对象,我只是使用数组中的拼接函数来清除其引用。是否足以启用垃圾收集对象? – 2014-10-13 18:31:02