如何强制浏览器重新绘制图像?
How can one force the browser to redraw an image?
我正在制作一款涉及投掷雪球的JavaScript游戏。我需要雪球在飞行过程中尽可能频繁地渲染。Chrome完成了所有的计算,包括设置样式。左边和样式。顶部属性,但实际上不会重新绘制雪球,直到它到达目的地。Opera没有这个问题。
相关的一点是,在renderSnowball()
之后放入alert()
可以解决问题,除非使用alert()是一个明显的问题。
function throwSnowball()
{
var theta = parseFloat(angleField.value) * Math.PI/180 ;
var Vir = parseFloat(velocityField.value) ;
if (!isNaN(Vir) && !isNaN(theta) )
{
Vix = Math.cos(theta) * Vir * 50;
Viy = Math.sin(theta) * Vir * 50;
time = new Date() ;
var timeThrown = time.getTime() ;
while (snowballPosY > 0)
{
current = new Date() ;
var currentTime = current.getTime() ;
var timeElapsed = (currentTime - timeThrown)/5000 ;
snowballPosX += Vix * timeElapsed;
snowballPosY += Viy * timeElapsed;
Viy -= GRAVITY * timeElapsed ;
renderSnowball() ; //renderSnowball() sets the style.left
// and style.top properties to snowballPosX pixels
// and snowballPosY pixels respectively
timeThrown = currentTime ;
}
snowballPosX = 0 ;
snowballPosY = 50 ;
renderSnowball() ;
}
}
你完全阻塞了主线程。你有没有尝试过使用setTimeout
(即使是零超时)来允许其他事情发生在你的动画?
如果你愿意使用实验技术,requestAnimationFrame
会更好。
setTimeout
方法看起来像这样(取代while
循环):
var drawAndWait = function() {
if (snowballPosY > 0) {
// movement/drawing code here
setTimeout(drawAndWait, 20 /* milliseconds */);
} else {
// reset code that would normally go after your while loop
}
};
drawAndWait();
所以每次绘图完成时,如果合适的话,它会安排自己再次被调用。注意,您的throwSnowball
函数将很快返回;投掷直到稍后才真正完成。这需要一段时间来习惯正确的操作;如果一开始不直观,也不要太在意。
试着跳出这个紧循环。Chrome可能不希望重新绘制,直到你的函数退出。尝试使用setInterval
或setTimeout
给Chrome一个机会重新绘制。
相关文章:
- 画布:逐像素绘制图像并请求动画帧计时
- WebGL绘制图像
- 多重绘制图像后画布清除
- 可以'清除Rect后,不要在画布上绘制图像
- 如何在单页应用程序中重新绘制图像
- 画布中的图像在绘制图像后立即消失
- 使用Canvas绘制图像
- 如何在javascript中在图像上绘制图像(没有CSS和HTML)
- 使用模式在 HTML5/JS 中绘制图像
- 绘制并重新绘制图像以模拟动画是行不通的
- Dart Canvas未绘制图像
- 在新窗口中打开时,未在画布中绘制图像
- 在画布上绘制图像并导出打印质量的图像
- 用一个加载项绘制图像阵列
- html画布绘制图像不起作用
- Chrome 31.0 HTML5画布绘制图像
- 用HTML5和Javascript绘制图像
- 在新框架上绘制图像,同时仍然使用P5.js中的利萨茹曲线
- 如何在画布上更快地绘制图像
- 在 HTML5 画布中绘制图像,同时保留图像