阅读更多

1顶
0踩

Web前端
上周,成千上万来自全世界的IG用户齐聚在社区组织的先下聚会 Worldwide InstaMeet11上。WWIM11 是历史上最大,最具地域多样性的Instagram聚会,从Muscat到Bushwick,成千上万用户分享了大约10万张照片。

每月世界上有超过3亿用户每月使用IG,其中65%来自美国以外的国家,无论用户在哪,我们一致致力于让IG更快,更容易使用。自从去年夏天IG重新设计后,我们在继续努力提升性能。

我们最近的一项改进是关于渲染庞大复杂的文本以及如何通过改进它优化IG的feed滚动。我们希望你可以从我们的经验中找到提升自己app速度的方法。

产品需求和性能问题

在IG中,feed是由图片,视频和文字组成的。对于每个图片和视频,我们需要展示对应的图片说明和5条最近的评论。由于用户通常通过图片说明来讲书图片背后的故事,这些图片说明通常是大段复杂的文字,甚至可能包含链接和emoji表情。



渲染这种复杂文本的主要问题在于它滚动时对性能的影响。在Android中,文本的渲染是很慢的。即使在一个像Nexus 5这样的新设备上,一段有十几行复杂文本的图片说明的初始绘制时间可能会达到50ms,而其文本的measure阶段就需要30ms。这些都发生在UI线程,在滚动时会导致app跳帧。

使用text.Layout,缓存text.Layout

Android有很多用于文字展示的控件,但实际上,他们都用text.Layout进行渲染。例如,TextView会将String转化为一个text.Layout对象,并通过canvas API将它绘制到屏幕上。

由于text.Layout需要在构造函数中测量文本的高度,因此它的创建效率不高。缓存text.Layout和复用text.Layout实例可以节省这部分时间。Android的TextView控件并没有提供设置TextLayout的方法,但是添加一个这样的方法并不困难:


使用自定义的view来手动绘制text.Layout会提升其性能:TextView是一个包含大量特性的通用控件。如果我们只需要在屏幕上渲染静态的,可点击的文本,事情就简单多了:
  • 我们可以不用从SpannableStringBuilder转化到String。根据你的文本中是否包含链接,底层的TextView可能会复制一份你的字符串,这需要分配一些内存。
  • 我们可以一直使用StaticLayout,这比DynamicLayout要稍微快一些。
  • 我们可以避免使用TexView中其他的逻辑: 监听文本修改的逻辑,展示嵌入drawable的逻辑,绘制编辑器的逻辑以及弹出下拉列表的逻辑。

通过使用TextLayoutView,我们可以缓存和复用text.Layout,从而避免了每次调用TextView的setText(CharSequence c)方法时都要花费20ms来创建它。
下载feed后准备好Layout缓存

由于我们确定会在下载评论后展示他们,一个简单的改进是在下载它们后就准备好text.Layout的缓存。



停止滚动后准备好TextLayoutCache

在可以设置text.Layout缓存后,我们的到来常数级的测量(measure)和绑定(binding)时间。但是初次绘制的时间仍然很长。50ms的绘制时间可能会导致明显的卡顿。

这50ms中的大部分被用于测量文本高度以及产生文字符号。这些都是CPU操作。为了提升文本渲染速度,Android在ICS中引入了TextLayoutCache用于缓存这些中间结果。TextLayoutCache是一个LRU缓存,缓存的key是文本。如果查询缓存时命中,文本的绘制速度会有很大提升。

在我们的测试中,这种缓存可以将绘制时间从30ms-50ms减少到2ms-6ms。



为了更好的提升绘制性能,我们可以在绘制文本到屏幕前准备好这个缓存。我们的思路是在一块屏幕外的canvas上虚拟的绘制这些文本。这样在我们绘制文本到屏幕前,TextLayoutCache就已经在一个背景线程中被准备好了。



默认情况下,TextLayoutCache的大小为0.5M,这足以缓存十几张图片的评论。我们决定在用户停止滑动时准备缓存,我们向用户滑动的方向提前缓存5个图片的评论。在任何时候,我们都至少在任何一个方向上缓存了5个图片的评论。



在应用了所有的这些优化后,掉帧情况减少了60%,而卡顿的情况减少了50%。我们希望这些能帮助你提升你app的速度和性能。告诉我们你的想法吧,我们期待听到你的经验。

原文:Improving Comment Rendering on Android
译文来自:CodeThink
  • 大小: 67.4 KB
  • 大小: 36.6 KB
  • 大小: 9.1 KB
  • 大小: 58 KB
  • 大小: 17 KB
  • 大小: 14.2 KB
来自: CodeThink
1
0
评论 共 1 条 请登录后发表评论
1 楼 leiyuch 2015-04-28 17:28
{"body":"{\"userMap\":{\"safeLev\":\"\",\"birthday\":\"\",\"albumurl\":\"\",\"sex\":\"\",\"username\":\"\",\"score\":\"20\",\"qstatus\":\"\",\"mobile\":\"13524143732\"}}","header":{"code":"200","msg":"操作成功","success":true}}

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • proftpd安装和配置,2分钟搞定

    压缩包,包含配置文件和安装文件(proftpd-1.3.4b.tar.gz) 不需要太多的修改,就可以完成ftp的配置。 实现:指定用户访问一个特定的目录,不允许匿名登录

  • ProFTPD使用

    1.安装 新版的proftp中已经有mod_quotatab了,所以不用另外下载了。 # tar -zxvf proftpd-1.2.10.tar.gz # cd proftpd-1.2.10 ...

  • Proftpd(MySQL验证+配额)配置

    五、Proftpd(MySQL验证+配额)配置1、下载ProFTPD,用编译安装,因为yum安装后在数据库认证会有问题,待研究:/bin/mkdir /home/src/cd /home/src//usr/bin/wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.4d.tar.gz/bin/tar zxvf proftpd-1.3.4d....

  • proftpd搭建ftp服务器以及相关设置

    配置文件在etc/proftpd.conf,配置文件说明如下: ServerName                      "ProFTPD Default Installation" ServerType                      standalone DefaultServer                   on 分别表示:服务器名称,服务类型和默认服务状态! 后面

  • linux proftpd 用户,linux之proftpd搭建(随时盖楼)

    FTP:file transfer protocol 文件传输协议。使用端口为20(数据通道,传输文件或目录列表)和21(命令通道,传输用户命令),FTP服务器能够从网上提供文件的传输服务,远程客户端可以上传和下载文件。linux中常见FTP服务器有:proftpd、vsftp、wu-ftpd。FTP工作模式有两种:主动模式PROT和被动模式PASV。主动模式:客户端随机开放1个大于1024的端口...

  • 如何配置 ProFTPd 以使用 SFTP 而不是 FTP

    FTP(文件传输协议)是在本地和远程服务器之间传输文件的一种流行方式。虽然过去FTP是首选的传输方法,但它使用明文进行身份验证,因此不安全。ProFTPd是一种流行的FTP服务器,可以配置为使用SFTP协议,这是FTP的安全替代方案。本文将向您展示如何配置ProFTPd以使用此协议,以避免FTP的不安全性。我们将向您展示如何在Ubuntu 12.04 VPS上配置此功能,但大多数发行版应该以类似的方式操作。

  • linux设置proftp的根目录,Linux系统平台下配置Proftp服务的小技巧

    Proftp的几个小问题:本文引用地址:http://www.eepw.com.cn/article/201610/305453.htm1、配置Ftp允许Root登录修改/etc/ftpusers,去掉root2、如果希望实现Root用户Ftp后可以切换到/目录一般用户只能切换到自己的主目录,修改/etc/proftpd.conf文件,在DefaultRoot一行前面增加一行DefaultRoot...

  • proftpd详细配置

     然后新建两个用户:ftp和ftpadmin,home目录都是/home/ftp 下面是proftpd的配置文件,比较全面的配置 # cat /usr/local/etc/proftpd.conf ------------------------------------------------------------------------- ServerName      "babydrago

  • Proftpd安装与配置

    下载wgetftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5rc3.tar.gz解压tarzxvfproftpd-1.3.5rc3.tar.gz进入目录cdproftpd-1.3.5rc3编译./configure--prefix=/var/proftpd--sysconfdir=/etc指定安装目录和配置文件目...

  • proftpd的一些简单配置

    1.开启root登录(1)删除/etc/ftpusers里的root(2)在proftpd.conf里添加如下配置:RootLoginon2.配置匿名登录,对protfpd.conf做如下配置:<Anonymous/app> #匿名登录后进行ftp上传下载是,使用smile启动proftpd守护进程UsersmileG...

  • proftpd安装及基本配置

    环境 系统:CentOS release 6.5 (Final IP:192.168.1.93 proftpd版本:1.3.6 proftpd用户/密码:ftpadmin/ftptest 文章中的防火墙自定义 安装yum依赖包 yum -y install gcc gcc-c++ autoconf automake 下载proftpd安装包 wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6.tar.gz ...

  • linux下ftp管控,proftpd使用

    linux下ftp管控proftpd使用 1、安装:源码地址:http://www.proftpd.org/ 下载完毕后编译安装: tar -zxvf proftpd-1.3.8.tar.gz cd proftpd-1.3.8 ./configure --enable-nls --prefix=/usr/local/proftpd #(其中nls是mod_lang,文档:http://www.proftpd.org/docs/modules/mod_lang.html ) make make insta

  • Linux下xampp里面的proftpd简明使用方法

    Linux版的xampp自带了FTP服务器端proftpd,十分方便. 用XAMPP的 安装方法可以开一个默认的lampp用户,不过多用户怎样管理.目录怎样设置.这里简明说一下. 要求: 使用xampp的proftpd,开通多个FTP用户,并各分配一个目录,而且需要限制用户在自己的目录里面,可以自由读写. 解决: 1.设置ftp用户组 groupadd ftpus

  • proftpd安装,新增用户配置访问权限

    tar -zxvf proftpd-1.3.3e.tar.gz 进行解压 cd proftpd-1.3.3e 进入文件夹 ./configure --prefix=/usr/local/proftpd make make install groupadd sunftpgroup useradd -g sunftpgroup -d /var/ftp -s /sbin/nologin ...

  • proftpd复杂权限的设置

    一、测试平台 Debian 4.0r3 Proftpd 1.3.1 (WITH SSL) 二、原理简介 1、继承性 子目录会继承其父目录的属性。 2、优先级 优先级由大到小的顺序: 原始FTP命令(LIST DELE等) > 命令组(DIRS READ WRITE) > ALL命令组 3、访问控制的应用顺序 ...

  • PROFTPD简单介绍

    最近公司有个客户,对VSFTP的模块集成有所不满。要求更换为PROFTP。因此对该服务器做了简单的了解和部署搭建。坑太多,简单记录下:部署:获取proftp源码包:ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5b.tar.gz获取模块包(客户需要使用MD5模块):http://www.castaglia.org/p...

  • ProFTPD配置匿名登录与目录访问权限控制

    对ProFTPD服务器配置匿名登录;限定用户只能访问自己的目录;配置匿名用户目录访问权限;Limit容器

  • proFTPd的使用配置

    http://www.chinaunix.net 目的: 安装配置一个proftpd,达到以下要求 1  不允许匿名访问。 2  开放一个帐号,只有在upload目录有上传权限,可以续传,不能改名和删除。 操作: 0  切换到root帐户 [code

  • Proftpd 服务器安装配置

    yum install proftpd 如果提示没有找到源 rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm chkconfig --level 3 proftpd on vi /etc/proftpd.conf 更改 AuthOrder mod_auth_fil...

Global site tag (gtag.js) - Google Analytics