【问题标题】:Trig problem, choppy movement of a triangle around a circle三角问题,三角形围绕圆圈的起伏运动
【发布时间】:2011-09-17 01:40:02
【问题描述】:

下面的代码应该围绕一个“不可见”的圆圈旋转一个三角形。它按我的预期工作,但是,三角形有时似乎在这个“圆圈”周围结结巴巴。这东西的 CPU 和内存负载似乎还可以,所以我想知道这是否是舍入和绘图的问题......感谢帮助。
P.S 我正在使用 SetInterval 来建立帧速率。我正在尝试做的事情需要> 30的帧速率。 谢谢。

var canvas = document.getElementById("game_area");
var context = canvas.getContext("2d");

var angle = 0;

var SinA = Math.sin(Math.PI);
var CosA = Math.cos(Math.PI);

var SinB = Math.sin(Math.PI-0.087);
var CosB = Math.cos(Math.PI-0.087);

var SinC = Math.sin(Math.PI+0.087);
var CosC = Math.cos(Math.PI+0.087);

canvas.width = 700;
canvas.height = 700;

var half = (canvas.width/2);

function on_enter_frame(){

    SinA = Math.sin(Math.PI+angle);
    CosA = Math.cos(Math.PI+angle);

    SinB = Math.sin(Math.PI-0.087+angle);
    CosB = Math.cos(Math.PI-0.087+angle);

    SinC = Math.sin(Math.PI+0.087+angle);
    CosC = Math.cos(Math.PI+0.087+angle);

    angle+=0.05;

    if (angle>(Math.PI*2)){
        angle=0;
    }

    context.clearRect(0,0,500,500);

    context.fillStyle = "#FFF";

    context.beginPath();
    context.moveTo(half+(SinA*50), half+(CosA*50));
    context.lineTo(half+(SinB*45), half+(CosB*45));
    context.lineTo(half+(SinC*45), half+(CosC*45));
    context.closePath();
    context.fill();
}

setInterval(on_enter_frame,30);

【问题讨论】:

  • 您考虑过使用分层画布吗?也许一次重绘太多了?
  • 您不应该将setInterval 用于动画。您应该改用requestAnimationFrame。大多数现代浏览器都支持它。 Microsoft Demo, MDN
  • tjameson:只有一件事正在绘制,分层画布有什么帮助? @Derek:我会调查 requestAnimationFrame,你认为这可能是我的问题造成的吗?

标签: javascript html canvas trigonometry


【解决方案1】:

请参阅http://paulirish.com/2011/requestanimationframe-for-smart-animating/,了解 requestAnimationFrame 以及使用它的原因。

现实情况是requestAnimationFramesetInterval 都不会提供坚如磐石的时机,尽管requestAnimationFrame 的机会应该会更好。您遇到的卡顿可能是由于您计算机上的其他进程,甚至是您当前 JS 进程中的垃圾收集。

由于您的循环时间永远不会可靠,因此最好将动画(在本例中为轨道三角形的位置)基于实际时间(或自上一帧以来经过的时间)。

我看不到您遇到的口吃,所以我不知道这是否会有所改进,但您可以在此处查看如何使用 requestAnimationFrame 和经过时间的实时示例:@987654322 @

【讨论】:

  • 感谢您的帮助,但不幸的是,即使在您的 FiddleJS 示例中,我仍然看到抖动。我正在使用 Firefox 5.0,但我想这一定是我的电脑的问题......
  • @jonh 是位置或方向或形状的卡顿/抖动?
  • 我说的主要是位置,三角形似乎短暂停止,然后“跳过一步”以弥补它的空闲。我尝试了四舍五入、更改速度和帧速率,但似乎没有任何效果。
  • @jonh,很难说是FF还是你的电脑。 FF 有更新的版本,安装 Chrome 等其他浏览器也很容易。最后,在 Paul Irish 页面上有一个轨道球演示 .. 你的设置是什么样的?
  • 它和三角形一样有波涛汹涌的感觉。猜猜我们刚刚查明了问题......在我们说话的时候下载 chrome :)
猜你喜欢
  • 2019-03-03
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2014-11-14
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多