Javascript 使用图像作为帧显示动画的最佳方式是什么?

Javascript 使用图像作为帧显示动画的最佳方式是什么?,javascript,html,performance,canvas,gpu,Javascript,Html,Performance,Canvas,Gpu,我计划通过快速地一个接一个地显示几个图像来播放一个简短的动画。这些图像将是动画的帧。我想要60帧每秒。当然,图像将被预加载。我不想使用标记有一些原因 对我来说,有两种选择: 更改图像标记的src标记 按说明在内显示图像 在为所有浏览器编写复杂的基准测试之前,我要问那些有经验的人: 哪种方法最好 这些方法或方法是否存在任何缺陷或加快速度 我会用位置:绝对,将所有图像放在彼此的顶部代码,然后使用jqueryeach函数依次隐藏图像。我会使用位置:绝对代码,然后使用jqueryeach函数依次隐藏

我计划通过快速地一个接一个地显示几个图像来播放一个简短的动画。这些图像将是动画的帧。我想要60帧每秒。当然,图像将被预加载。我不想使用
标记有一些原因

对我来说,有两种选择:

  • 更改图像标记的
    src
    标记
  • 按说明在
    内显示图像
在为所有浏览器编写复杂的基准测试之前,我要问那些有经验的人:

  • 哪种方法最好
  • 这些方法或方法是否存在任何缺陷或加快速度

  • 我会用
    位置:绝对,将所有图像放在彼此的顶部代码,然后使用jqueryeach函数依次隐藏图像。

    我会使用
    位置:绝对代码,然后使用jqueryeach函数依次隐藏图像。

    我会使用
    位置:绝对代码,然后使用jqueryeach函数依次隐藏图像。

    我会使用
    位置:绝对代码,然后使用jQuery each函数依次隐藏图像。

    使用类似于:

    // this is a useful shim for requestAnimationFrame. I copied it from somewhere else:
    window.requestAnimFrame = function(){
        return (
            window.requestAnimationFrame       ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame    ||
            window.oRequestAnimationFrame      ||
            window.msRequestAnimationFrame     ||
            function(/* function */ callback){
                window.setTimeout(callback, 1000 / 60);
            }
        );
    }();
    
    var currentFrameTime, previousFrameTime, timeBetweenFrames;
    var playbackStartTime = Date.now();
    var timePerFrame = 1000/60.0;
    
    function updateFrame(frameNumber) {
        requestAnimFrame(updateFrame);
    
        currentFrameNumber = parseInt((currentFrameTime - playbackStartTime) / timePerFrame);
    
        showImage(frameNumber);
    }
    
    它最多每秒显示60帧,但不会播放得太快或太慢。

    使用类似于:

    // this is a useful shim for requestAnimationFrame. I copied it from somewhere else:
    window.requestAnimFrame = function(){
        return (
            window.requestAnimationFrame       ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame    ||
            window.oRequestAnimationFrame      ||
            window.msRequestAnimationFrame     ||
            function(/* function */ callback){
                window.setTimeout(callback, 1000 / 60);
            }
        );
    }();
    
    var currentFrameTime, previousFrameTime, timeBetweenFrames;
    var playbackStartTime = Date.now();
    var timePerFrame = 1000/60.0;
    
    function updateFrame(frameNumber) {
        requestAnimFrame(updateFrame);
    
        currentFrameNumber = parseInt((currentFrameTime - playbackStartTime) / timePerFrame);
    
        showImage(frameNumber);
    }
    
    它最多每秒显示60帧,但不会播放得太快或太慢。

    使用类似于:

    // this is a useful shim for requestAnimationFrame. I copied it from somewhere else:
    window.requestAnimFrame = function(){
        return (
            window.requestAnimationFrame       ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame    ||
            window.oRequestAnimationFrame      ||
            window.msRequestAnimationFrame     ||
            function(/* function */ callback){
                window.setTimeout(callback, 1000 / 60);
            }
        );
    }();
    
    var currentFrameTime, previousFrameTime, timeBetweenFrames;
    var playbackStartTime = Date.now();
    var timePerFrame = 1000/60.0;
    
    function updateFrame(frameNumber) {
        requestAnimFrame(updateFrame);
    
        currentFrameNumber = parseInt((currentFrameTime - playbackStartTime) / timePerFrame);
    
        showImage(frameNumber);
    }
    
    它最多每秒显示60帧,但不会播放得太快或太慢。

    使用类似于:

    // this is a useful shim for requestAnimationFrame. I copied it from somewhere else:
    window.requestAnimFrame = function(){
        return (
            window.requestAnimationFrame       ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame    ||
            window.oRequestAnimationFrame      ||
            window.msRequestAnimationFrame     ||
            function(/* function */ callback){
                window.setTimeout(callback, 1000 / 60);
            }
        );
    }();
    
    var currentFrameTime, previousFrameTime, timeBetweenFrames;
    var playbackStartTime = Date.now();
    var timePerFrame = 1000/60.0;
    
    function updateFrame(frameNumber) {
        requestAnimFrame(updateFrame);
    
        currentFrameNumber = parseInt((currentFrameTime - playbackStartTime) / timePerFrame);
    
        showImage(frameNumber);
    }
    

    它最多每秒显示60帧,但不会播放得太快或太慢。

    我建议按照第二个选项中的建议在画布中显示图像。这样做的原因是,虽然您可以确保图像已预加载到DOM中,但您无法控制它们何时从源代码解码到图像数据中-通常在它们在文档中可见时会发生这种情况,这可能(而且确实!)导致执行延迟,从而影响您的帧速率。使用canvas还可以对图像数据进行预解码,从而生成更平滑的动画


    我最近使用了他的技术,当时我为信息亭编写的一些类似幻灯片放映的软件在预装的图像首次滑入视图时,帧速率急剧下降(60 FPS到20 FPS):使用Chrome的开发工具的时间轴功能,我通过使用canvas提前对图像进行解码,完全避免了这种情况。

    我建议按照第二个选项中的建议在画布中显示图像。这样做的原因是,虽然您可以确保图像已预加载到DOM中,但您无法控制它们何时从源代码解码到图像数据中-通常在它们在文档中可见时会发生这种情况,这可能(而且确实!)导致执行延迟,从而影响您的帧速率。使用canvas还可以对图像数据进行预解码,从而生成更平滑的动画


    我最近使用了他的技术,当时我为信息亭编写的一些类似幻灯片放映的软件在预装的图像首次滑入视图时,帧速率急剧下降(60 FPS到20 FPS):使用Chrome的开发工具的时间轴功能,我通过使用canvas提前对图像进行解码,完全避免了这种情况。

    我建议按照第二个选项中的建议在画布中显示图像。这样做的原因是,虽然您可以确保图像已预加载到DOM中,但您无法控制它们何时从源代码解码到图像数据中-通常在它们在文档中可见时会发生这种情况,这可能(而且确实!)导致执行延迟,从而影响您的帧速率。使用canvas还可以对图像数据进行预解码,从而生成更平滑的动画


    我最近使用了他的技术,当时我为信息亭编写的一些类似幻灯片放映的软件在预装的图像首次滑入视图时,帧速率急剧下降(60 FPS到20 FPS):使用Chrome的开发工具的时间轴功能,我通过使用canvas提前对图像进行解码,完全避免了这种情况。

    我建议按照第二个选项中的建议在画布中显示图像。这样做的原因是,虽然您可以确保图像已预加载到DOM中,但您无法控制它们何时从源代码解码到图像数据中-通常在它们在文档中可见时会发生这种情况,这可能(而且确实!)导致执行延迟,从而影响您的帧速率。使用canvas还可以对图像数据进行预解码,从而生成更平滑的动画


    我最近使用了他的技术,当时我为信息亭编写的一些类似幻灯片放映的软件在预装的图像首次滑入视图时,帧速率急剧下降(60 FPS到20 FPS):使用Chrome的开发工具的时间轴功能,我通过提前使用画布对图像进行解码,成功地避免了这种情况。

    您想要的解决方案是画布。
    只有使用它,您才能(轻松地)使用一个或一组简化的图形文件来制作动画。
    由于您负担不起要下载的1000个文件,您实际上需要处理打包的文件,这些文件可能如下所示:

    可以将多个字符或任何图形打包到该文件中

    加载图像后,必须计算每个帧的纹理坐标。
    动画是一系列帧。
    这里画布的关键方法是drawImage,它具有9个参数的风格,允许剪裁/调整大小/。。。形象

    我做了一点小提琴来说明,但你应该