首页 > 其他分享 >可能引起画面gif图片显示掉帧的问题

可能引起画面gif图片显示掉帧的问题

时间:2024-09-01 21:38:24浏览次数:11  
标签:动画 浏览器 GIF 渲染 gif 画面 播放 重绘 图片

以下内容针对在IE11浏览器的情况,其他edge,chrome可能有些微差别。

GIF文件本质上是一个包含多帧静态图片的动画文件。当GIF播放时,浏览器只需按顺序显示这些帧,从而产生动画效果。

GIF动画帧切换过程:

  1. 解码GIF文件:当GIF被加载时,浏览器会解码GIF文件,提取出每一帧的图像数据。每帧都是独立的静态图像。

  2. 定时切换帧:GIF文件中包含了帧的显示时间(通常以毫秒为单位)。浏览器根据这个时间来决定何时切换到下一帧。这个过程由浏览器内部的定时机制管理。

  3. 帧的重绘(注意是“重绘”(repaint),而不是“渲染”(render),因为渲染通常指的是生成一个新图像或内容的过程,而重绘则是指在已有内容的基础上更新显示的内容)

    • 清除旧帧:在显示新帧之前,浏览器可能会先清除或覆盖掉当前显示的帧。
    • 显示新帧:浏览器将解码后的新帧图像绘制到屏幕上。这部分的操作非常快,因为帧图像数据已经解码完成,只需将其显示出来。
  4. 循环播放:如果GIF设置为循环播放,浏览器会在最后一帧显示完后,回到第一帧,继续按照相同的过程切换帧。

GIF动态图片播放过程中,如果在浏览器中执行JavaScript代码,可能会导致GIF动画掉帧或播放不流畅。这是因为JavaScript执行和浏览器的渲染(包括重绘)是单线程处理的(同步),这意味着当JavaScript脚本在执行时,会阻塞浏览器的渲染进程,如果这时候刚好是GIF下一帧动画的显示时间,就会被阻塞,从而被跳过,画面就会表现为有一帧没显示。

具体来说,浏览器的渲染引擎和JavaScript引擎通常共享一个线程(通常称为主线程)。当JavaScript代码执行时间较长时,主线程无法及时处理其他任务,比如页面的渲染或动画的更新。这就可能导致GIF动画掉帧或表现不流畅。
比如下面这个例子(也是这次项目遇到的一个问题)

当页面向后台发送请求并获取新的画面时,页面的更新是在新内容被成功接收并初次渲染之后发生。具体流程如下:

  1. 发出请求:通过XMLHttpRequestfetch API、form的commit,或其他方式向后台发出请求。

  2. 等待响应:在请求发送出去后,页面会等待后台返回响应。在此期间,页面通常不会做出任何变化。

  3. 接收响应并更新:当后台响应到达后,浏览器会解析并构建DOM,CSSOM以及渲染树。

  4. 首次渲染新内容:有了渲染树后,浏览器会渲染这个新内容。

  5. 旧内容消失:旧的画面或内容会在新内容首次渲染后消失。

在第一步发出请求后,我在画面加载了一个转圈的GIF动画,以遮住旧内容,直至新内容表示出来,但是第三部里面,返回的HTML中包含有立刻执行的JS代码,这时候执行JS代码就会阻塞转圈的GIF动画的部分换帧动作,因为换帧是通过重绘实现的,而执行JS阻塞了重绘处理,因此造成GIF动画播放掉帧现象,表现为动画播放不流畅。

标签:动画,浏览器,GIF,渲染,gif,画面,播放,重绘,图片
From: https://www.cnblogs.com/shixiaobin/p/18391766

相关文章

  • Python 图片去重,删除重复图片
    删除文件夹中相似图片的任务比较复杂,因为需要定义“相似”的标准,并且这通常涉及到图像内容分析。一种常见的做法是使用图像哈希(如感知哈希、平均哈希等)来比较图像之间的相似度。在Python中,可以使用一些库如Pillow(PIL的更新版)来处理图像,以及ImageHash库来生成图像哈希。下面......
  • Java利用POI实现对Word的操作(包括有换行的文本和图片)
    目录一、实现效果二、实现部分1、导入依赖2、工具类3、实体类4、测试代码如果您也有类似的需求,可以参考这篇文章进行实现并扩展。一、实现效果1、重要说明:①普通文本使用${字段名}进行标注,有换行的文本使用$${字段名}进行标注。②图片使用#{字段名}进行标注......
  • Linux Debian12使用flameshot或gnome-screenshot和ImageMagick垂直合并多张图片后组成
    在发布博客,有时需要滚动截长图,虽然在windows系统有滚动截长图的工具,例如:FastStoneCapture等,但是LinuxDebian系统,这种滚动截长图的工具没有找到合适的。经过自己筛选验证,发现LinuxDebian12使用flameshot或gnome-screenshot截取多张图片,再使用和ImageMagick图像处理工具进行垂直合......
  • Python实现图片的拼接
    Python实现图片的拼接Python中有多种方法可以实现图片拼接,下面是一个使用Pillow库的示例:首先,你需要安装Pillow库:pipinstallpillow然后,可以使用以下代码实现图片拼接:fromPILimportImage#读取两张图片img1=Image.open('image1.jpg')img2=Image.open('imag......
  • pbootcms文章插入图片取消最大只有1000宽度怎么办
    pbootcms文章插图无法突破固定最大1000像素这一问题。PBCMS在默认上传图片时,会自动为图片添加宽度和高度。就PC端而言,这并无太大影响,原因在于图片的宽度通常不会过大。然而,对于手机端情况则截然不同,部分自适应的网站其图片宽度设置为auto或者100%,一旦对宽度和高度加以限......
  • PbootCMS文章列表没有缩略图时也不显示默认图片怎么办
    在运用pbootcms模板来构建网站的整个流程之中,如果列表采用了缩略图予以显示,那么即使在后台未曾上传缩略图的情况下,依然会展示出默认图片。倘若我们并不期望显示默认图片,在此种情形下,我们便能够借助PB自身所带有的缩略图返回值,来对是否上传了缩略图进行判定。以下所呈现的是......
  • vue使用html2canvas将页面dom生成图片,解决页面中带有图片导出
    安装npm installhtml2canvas引入importhtml2canvas from 'html2canvas'使用this.$refs.canvasToPic是div的dom,只要在这个div中的区域都可以生成图片1this.$nextTick(()=>{2html2canvas(this.$refs.canvasToPic,{useCORS:true,logging:true}).......
  • 给一个块元素添加多张背景图片
    最近做的项目需要用到多张底图(背景图)最开始做的时候能想到的办法只有嵌套多层div然后设置背景图并定位以实现今天重写这块代码发现明明可以很简单的解决!!!话不多说,上代码<divclass="menu"><!--任意内容--></div>先定义元素类名,再在css中设置背景图.menu{backg......
  • vite3接入vue-quill:处理图片,自定义字体和字体大小,切换源码模式
    环境适用版本:node:14.21.2"vue":"^3.2.26""vite":"^3.1.0"安装模块:"@vueup/vue-quill":"^1.2.0","quill-html-edit-button":"^3.0.0","quill-image-resize-module":"^3......
  • 如何接收后端接口返回的图片或者pdf后去预览打印
    在线效果:https://codepen.io/13476075014/pen/VwJdGvz?editors=1010<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scal......