阅读更多

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的配置。 实现:指定用户访问一个特定的目录,不允许匿名登录

  • ubtuntu Proftpd 同时支持SFTP和FTP

    Proftpd同时支持sftp和ftp

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

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

  • 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 分别表示:服务器名称,服务类型和默认服务状态! 后面

  • 教你配置安全的ProFTPD服务器(下)

    教你配置安全的ProFTPD服务器(下) 2009-07-31 19:30 在上两篇文章中(上、中),介绍了ProFTPD服务器的基本配置方法以及如何加固ProFTPD服务器,下面继续介绍配置安全的ProFTPD服务器的其他安全策略。 四、其他安全策略 ...

  • 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的安装配置实例

    为什么80%的码农都做不了架构师?>>> ...

  • 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 ...

  • 教你配置安全的ProFTPD服务器(中)

    教你配置安全的ProFTPD服务器(中) 2009-07-31 19:28 在上篇文章中(点击查看),介绍了ProFTPD服务器的基本配置方法,本文继续介绍如何加固ProFTPD服务器。 二、 基本加固ProFTPD服务器步骤 ...

  • linux 配置sftp日志,在CentOS 7.5上为SFTP配置ProFTPd

    这是有关如何为SFTP会话配置ProFTPd的指南。 安全文件传输协议(SFTP)是FTP的安全版本,它通过SSH协议传输文件。 与使用默认FTP协议相比,可以重新配置ProFTPD以服务SFTP会话。 本指南假设您已经安装了ProFTPD。 如果您还没有安装它,请参考这里如何安装Proftpd,见 https://www.linuxidc.com/Linux/2018-11/155143.htm...

  • 使用Proftpd搭建多功能FTP服务器(一)

    理论描述Linux系统中,有不少实现FTP服务器的软件套件。但是,大部分都是基于Linux系统用户。。这一方面,没必要,ftp用户能上传下载文件即可;另一方面,不安全,ftp用户一旦采用弱密码,则会大大降低系统安全性。根据我们的需求,我们的FTP服务器需要满足以下特点:匿名登录FTP的Passive传输模式UTF-8编码,对客户端推送语言编码虚拟用户,用户磁盘空间限额FTPS...

  • Proftpd快速搭建FTP服务器

    Proftpd快速搭建FTP服务器 Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript w

  • proftpd限制匿名用户的配置

    ftp匿名用户配置

  • ProFTPD:Limit配置

    ProFTPD的<Limit>配置部分允许进行强大的细粒度控制,即:允许谁使用哪些FTP命令。 然而,这种能力是以复杂性为代价的。 本文档描述了编写<Limit>部分时要记住的一些事项。 优先权 也许使用<Limit>最难的地方是理解它的优先级规则,它决定了<Limit>限制何时生效。 首先,Limit指令中有三种类型的参数:“RAW”FTP命令、F...

  • 6-20漏洞利用-proftpd测试

    ProFTPD一个Unix平台上或是类Unix平台上(如Linux,FreeBSD等)的FTP服务器程序http可以下载对应的版本,然后进行环境搭建。

  • Linux源码安装proftpd之后无法使用service启动的解决方案

    由于proftpd是选择源码编译安装的,在/etc/init.d/目录下不会有proftpd的启动配置文件,需要自己手动配置,下面我搜索了下一般的配置文件,都不是很全,这里我提供一个比较全的启动脚本,基本上可以通用,可以使用start,stop,restart,status,... #!/bin/sh # # Startup script for ProFTPD # # chkconfig: 3

  • UBuntu9.10安装proFTPd支持SFTP

    目的 1)支持SFTP协议 2)不采用系统帐号验证方式,改为数据库MySQL验证 3)数据库中不保存密码,只保存经过sha256算法加密过的可打印16位小写字符串,系统中还需保存一个salt文件 4)数据库中指定用户目录,proFTPd能够动态创建用户目录 修改ssh服务端口号为21 修改文件中的配置/etc/ssh/sshd_config 然后重新启动ssh服务 su...

Global site tag (gtag.js) - Google Analytics