【262】44周 进度条,能准吗? | 科普

Fairyex
07月04日

进度条,能准吗? | 科普

| 本文为付费栏目文章,您已订阅,可阅读全文 |
在我们的数字生活中有一样东西,它无处不在,同时形式外表多种多样,每天每个人都与其打无数次交道。但是,在互联网向着「更快更精确」的目标发展的时候,它却保持着一贯的缓慢和随性的误差。它就是你会为其激动,为其焦虑的 —— 进度条。

进度条
说到进度条,相信每个人心里都有很多想要抱怨的地方:
  • 缓慢蠕动的百分比,任凭你戳爆 F5,它自岿然不动。代表:浏览器加载进度。
  • 任性的剩余时间,明明写着「30」秒却能让人等到天荒地老。代表:文件复制进度,解压缩进度。
  • 卡在 99% 的痛苦,上面两种情况起码还有希望,99% 后的失败提示让人感觉「人生都失去希望」。代表:某雷下载进度,视频转码进度。
仔细想想,我们平时还真的没有见过几次完全准确的进度条。今天,我就以平时常见的几种进度条类型为例,为大家科普上面几种情况背后的根本原因,再跟大家聊聊有什么操作能让进度条更加「张弛有序」。

进度条的定义与历史

首先让我们来了解一下进度条的前世今生。今天我们常见的是计算机领域的进度条 —— 用于视觉化计算机操作进度的图形组件,不过,其实在计算机出现之前就已经有「进度条」这种概念了。
从事管理或者互联网产品方面职业的派友对于甘特图肯定不陌生,它就是进度条的「祖宗」。1896 年波兰经济学家卡罗尔·亚当基(Karol Adamiecki)提出了「时间表」这一概念,相隔不久,在 1910–1915 年间被亨利·甘特(Henry Laurence Gantt)向西方推广普及,所以就有了甘特图这一名词。

甘特图
上面就是一张很标准的甘特图,它在纵轴(Y)上列出了需要执行的任务,横轴(X)则是自定义的时间间隔。通过 Y 上每一项任务右边线条的位置与宽度就能直观地看出每个任务和整个计划的持续时间、各部分的相互关系等,还能通过重叠部分发现任务间是否有时间冲突。直到今天甘特图仍然是项目管理上必不可少的得力帮手。
抛去这些专业解释,我们直接看图也能看出来甘特图就像是手绘的进度条,如果 Y 轴上不同的任务换成单个任务的不同阶段,那么几乎就跟数码设备上的进度条一模一样。
而将甘特图的概念用于计算机又是几十年后的事情(毕竟现代计算机的出现都已经是几十年后),第一个图形化进度条出现在 Mitchell Model 的 1979 年博士论文《在复杂计算环境中监控系统行为》中。1985 年,布莱恩·迈尔斯(Brad Allan Myers)在计算机 - 人类交互会议上发表了一篇关于《百分比完成进度指标》的论文。在此之后所有设备上的进度条都是踩着这两位巨人的肩膀出现的了。

计算机上进度条的作用

我们知道了进度条是怎么来的,那么为什么计算机上需要出现进度条?计算机上不用进度指示器(Loading Indicator)而用进度条的时候主要考虑以下原因:
  • 缓解用户焦虑,延长用户耐心,为什么我们看着「转圈圈」很快会失去耐心,而无聊的时候可以看着半个小时的文件复制进度条(反正我干过……)?因为圈圈是单调的预设动画,而进度条是由系统检测数据反馈的数据实时生成的,每一次的速度,变化频率都有微妙差别,显然后者更能给用户带来更多的新鲜感。同理,越多的数据变化,用户感到焦虑前的时间就越长,所以 Windows 不断地在复制文件进度条上加新数据和动画(速度折线图,网格,实时速度数据还有那个上下动来动去的速度指示器等等)。
    Windows 复制文件进度条的动画
  • 给用户踏实的反馈,试想一下执行用户不知道原理又需要比较长时间的操作,比如安装程序和升级系统,又没有进度条只有提示或转圈圈会怎么样?这时这个操作就拥有了「薛定谔的进度」—— 用户会很纠结,等了好久都没反应,程序是不是挂了?关了吧,万一再等一下就行了呢;不关吧,万一真的是挂了呢。有了进度条,用户至少可以直观地知道这个程序还能动,动了多少,安全感瞬间提升。
    网页还要多久才能加载好呢?
  • 让用户了解大概剩余时间,即使 99% 的时候进度条显示的剩余时间都是不准的,但是我们仍然可以通过进度条跑的速度大概推测出剩余的时间,以决定是先离开屏幕洗个澡还是直接取消掉操作。
总的来说,进度条既不加快操作速度也不提升性能,完全是为了「讨好你」而已。我们平时见多了可能没啥感觉,只要想想如果每次开会领导讲话头上都插着一根进度条,就能感觉进度条对我们心理影响有多大。

进度条不准确的原因

本地进度条

先说说我们最常见的本地进度条吧,无论是复制文件,安装程序还是升级系统你有很大机会看到剩余时间经常大幅度的跳跃。有时候跳得就跟随便给个时间一样,而且更加好玩的是,无论硬件怎么发展,这个问题从 Windows 95 到最新的 Windows 10 的几十年来一直伴随着我们,这可是相当长的时间。

跳跃的复制速度
举个例子:微软连语音助手都做进了 Windows,却连我们文件多久才能复制好都弄不准,这其中最重要的原因是进度条并不能获取到所有它显示出来的数据。在你复制文件的时候,我们能看到进度条获取了文件数量与文件总大小,但大部分人都不知道有一样东西 Windows 不知道:硬件的速度。
现实情况是,随着时间推移磁盘吞吐量会发生明显的变化,比如你复制文件同时还在下载电影、玩游戏。CPU、硬盘被占用和硬件温度上升直接导致文件复制速度大幅下降,但是进度条不知道呀,它只会继续按照刚复制那一瞬间检测到的硬盘速度来显示剩余时间。如果这个时候你暂停下载/切出游戏查看复制进度,CPU 和硬盘占用被释放,于是文件复制速度蹭得上去了,你就看到鬼畜跳动的剩余时间。由于这个原因,通常我们看到复制文件时速度大都先达到顶峰然后瞬间就降了下来。

复制速度的变化
任何占用 CPU/磁盘的行为都会导致上面的结果,比如后台更新或是应用后台自启动,而不仅是用户的行为。但是这不能解释有时后台 CPU/磁盘占用没有变动,复制速度也会鬼畜的情况。
这时候导致鬼畜的是另一个原因 —— 寻找文件的速度。无论是机械硬盘还是固态硬盘,上面的每个文件都是通过碎片的方式储存的,在一个块/簇大小为 32k 的硬盘里面 1MB 的文件就被分散到 32 个不同的块/簇中储存。读取这个文件的时候硬盘需要分别从这 32 个地方拿出数据在拼起来,找出这 32 个地方在哪是需要时间的(也就是常说的寻道时间)。即使是同一个文件,因为硬件不同,在不同硬盘上的找出所有碎片的时间也是不同的。
在复制文件,特别是复制很多数量文件时,进度条获取不了硬盘的寻道时间,由于每次寻道时间都有微小的差别,加上不同大小文件的总寻道时间不同,于是剩余时间便没办法精确得出了。
提示:Windows 复制文件进度条横轴代表的是百分比,而不是已复制的数据量/时间。

是否能让本地进度条变得精确?

实际上我们每天与精确的进度条相处的时间也不少,比如音乐进度条和视频进度条,它们是如何做到精确的呢?因为它们是有确定长度的单个文件,视频音频文件里面内置了自己的长度,放到文件复制上就相当于等复制完再告诉你用了多长时间,这样当然就是准确的了。
再者,根据上面进度条的作用解释,用户需要的只是一个根据大概数据动起来的东西让自己有个底,精确的数据对于绝大部分用户来讲意义不大(就像我们日常说时间一般只会精确到分,很少有人会精确到毫秒一样)。微软当然有能力去让文件复制进度变得精确,不过这需要改动系统的架构,新增 API 去获取更多的数据,还要写算法去处理这些数据,同时增加一吨以上的 BUG,最后的结果甚至不够换个按钮颜色更能吸引用户的注意。

macOS 的升级让你知道 1 秒有多长
不准确的进度条就这样顺理成章地保持了下来。对于个人开发者来讲,优化自己程序里面进度条精确度的优先级远远不如给用户新皮肤来得高,甚至现在很多开发者在安装程序里面用「假进度条」(也就是平时我们安装程序时进度条直接窜到最后让你等的那种)。

迅雷安装

网络进度条

说完本地进度条我们再来讲讲网络上的进度条,由于网络本身的复杂度,影响网络速度的因素太多,我们甚至可以夸张点说「假进度条」遍地都是。
比如很多浏览器顶部加载网页时的进度条,很多时候并不能反应加载网页的进度。某些浏览器断网的时候进度条还能走到尽头,过几秒再提示「无网络链接」;网页还没加载完毕进度条就走完了,或者网页加载完毕还进度条没走完的情况比比皆是。
说到假进度条,就不得不说坑爹的游戏加载进度条了。无论是网络游戏还是单机游戏,基本上用的都是假进度条,这是为什么呢?
  • 如果程序员按照真实的速度和文件加载情况做,用户看起来的进度条是一段一段往右「窜」的,「窜」起来还时快时慢。
  • 美术和产品肯定就有意见了,那没办法只能先加载完一部分再让进度条匀速增加一部分,这样看起来每一段都很顺滑了,也能反应加载情况。
  • 一般来讲做到这里就行了,我们经常看到的游戏进度条也多是这样,不过奈何有些「像素级强迫症」的美术和「完美主义」产品经理就是不满意,进度条一定要完全顺滑地走完,不能让用户觉得卡。那没办法,程序员只好匀速运动定时跑完的进度条咯。
  • 这样顺滑是顺滑了,可是全是假的也不行啊,进度条都跑完了资源还在加载怎么办?产品给程序员支了一招:你让进度条匀速跑到 99% 不动,等到加载完资源再变成 100% 不就得了,用户一看都 99% 了肯定会再等等,也不会流失用户。
然后我们就看到这些窜到 99% 之后就不动的进度条了。

王者荣耀检查更新这瞬间都要做进度条
甚至很多我们认为是精确的进度条都在这样子干 —— 就拿迅雷下载举个例子。
不止迅雷,下载卡在 99% 很久的情况相信大家在各个下载软件上都有遇见过,迅雷的下载进度条有时候也会跟用户玩一些「小伎俩」,卡 99% 就是其中一种。很多派友就会问了,只要用剩余文件大小除以每秒网速不就可以得出精确进度和剩余时间了吗,怎么还会卡 99%?
看过我的《下载科普:隐私,稳定与速度》教程的派友应该知道,BT 下载时文件是切成一个个小块来下载的,一个大的文件会被切成千上万的小块,下载时也不是按照文件块的顺序来下载。文件下载到 99% 的时候迅雷就会把下载好的文件块和 BT 种子里面记录的文件块的文件指纹进行匹配以保证文件块的正确性与完整性。网络复杂的时候这成千上万文件块里面肯定会有一些数据不完整的,这时就需要重新下载这些错误的文件块。
如果迅雷的进度条是精确的那么会发生什么?(举例)用户会看到下载到 99% 的进度条突然间变成了 90%,剩余时间也从 00:00:01 变成 00:01:30。那用户肯定就毛了,老子会员都充了这破玩意儿下着下着还缩回去?接着就是投诉三连走起,迅雷为了保证「用户体验」,只能让进度条卡在那儿咯。

卡在 99% 的进度条
除了下载损坏文件块,机子硬盘性能差导致拼接文件块太慢或者写入硬盘速度太慢也会导致卡 99% 的情况。其实大多数网络进度条,包括上面说的浏览器进度条卡 99% 的情况占绝大部分,其中绝大部分是故意设计的。
网络上的进度条依旧遵循着上面提到的进度条的作用。不准确的进度条甚至是假进度条不全是技术上不能实现,而更多是照顾用户心理的体现。为了达到这个目的甚至会故意延长进度条走完的时间以免某项操作执行得太快,还是那句话 —— 用户不需要精确的数据,有就行了。

其他类型的进度条

随着时代的发展,智能设备对于互联网的依赖越来越强,而用户的习惯也发生了巨大的变化。我们经常在电脑上看到的进度条已经不适合放在手机等设备上(比如常见的卡片瀑布流,要是每张卡片都放个带数字的进度条,有密集恐惧症的用户可以当场去世),于是我们就可以看到很多新类型的进度条。

圆形进度条

这应该是我们在手机等设备上见得最多的进度条了,典型的外观是一个空心圆/圆环,通过填满的程度来表示进度。这种进度条优点是不占位置,指示明显,中间还可以显示数字进度。不过在准确度上并没有太大的提升,该卡 99% 还是会卡 99%:

急不急?
有时候我们自己都能感觉出来这些进度条是在安慰用户,最经典的就是 iOS 上安装应用时的圆形进度条。Apple 把下载和安装进度放在同一进度条,下载进度只占前 50%,以营造出「一到 50% 速度就快得飞起」的错觉,使用户产生快感。

iOS 应用下载完进度条只走了 50% 左右

图片逐步加载与色块占位

既然无法做到准确地判断加载进度,很多 App 开始追求通过另一些「欺骗」的手段去给用户进度反馈,减少用户在等待过程中产生的焦虑。
Pinterest 就在图片加载完成先将图片区域的背景颜色设置为图片的主色调,然后在图片加载完毕时,通过淡入动画把图片显示出来。

Pinterest 用色块对图片提前占位
而大图页面上 Pinterest 采用了逐步加载的策略,先将首页加载完的小图拉大放到大图的位置,同时加载高清大图,大图一边加载一边显示从模糊到清晰的动画。这也是很多图片网站加载大图的方法:

先拉伸小图,再逐步加载高清大图
比起单独的一条,这种和内容结合在一起的进度条显然更加能「讨好」用户,也避免了图出来进度条还没跑完和卡 99% 的情况。有了这些优点,使用与内容相结合的进度条与拟物化进度条的网站应用越来越多。

总结

这篇文章到此已经基本介绍了各种类型进度条不准确的原因,我们知道很多进度条这辈子大概都不会准了,我们也知道很多进度条就是为了不准确而设计出来的。大家以后再见到进度条的时候不用再盯着那一条缓缓蠕动的条子和跳来跳去的时间,可以多利用其中的时间去做一些更有意义的事情(比如刷下少数派

上一期
新建成组文件夹的自动化做法与思路
下一期
用 OmniFocus 建立重复项目模板
 
精选评论(0) 我的评论