SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
FtnApp 的缩略图实践
     AyangXu
Agenda


列表缩略图和预览大图

图片缓存策略(磁盘,内存)

耗时操作的应对(读写、压缩)

大图滑动的逐步调优
两种缩略图的异同
列表缩略图

文件小(15-20k)

文件多(列表)

滑动的时候频繁读

高缓存命中
预览大图

文件大(200k+)

绘制耗时长

重用率低

内存控制要求更高
共同特点

平滑性要求高

多重检查:本地 ➜ 原图(压缩) ➜ 网络

过度状态(ICON / loadingView)
loadThumbnail




 small                   big



            QMCache



thumb.db                 file



           original
             file


              web
           thumbnail
小图的缓存策略(磁盘)
            loadThumbnail




    small



               QMCache



   thumb.db



              original
                file


                 web
              thumbnail
小图的缓存策略(磁盘)

全部小图保存到⼀一个 DB

启动的时候子线程加载(15k*100张)

滚动停止时,只更新 visibleCells

先更新内存,显示,再在后面更新 DB

不要在 cellForRowAtIndexPath 里做太多事情
图片缓存策略
小图的缓存策略(内存)

内存更新策略

 缩略图只加不减

 全部小图,包括默认的 ICON 都只读⼀一次
大图的缓存策略(内存)
NSCache

  NSDiscardableContent / NSPurgeableData

  不Copy Key,释放时机不可控

QMCache

  NSMutableArray w/ NSMutableDictionary

  自定义 Capacity,多了就删
耗时操作的应对
本地 ➜ 原图 ➜ 网络

                        QMCache

难点:
            thumb.db               file
 两种 IO 操作
                       original
 两个网络操作                  file



 相互嵌套                     web
                       thumbnail
GCD VS
      OperationQueue
GCD

  保留作用域,线程池

  不好控制并发任务,不好取消

NSOperationQueue w/ NSBlockOperation

  FIFO,封装了 GCD,可配置并发数,支持取消

  保留还在队列里的 URL,避免重复的操作

  快速滑动时,取消未开始的任务,优先留给当前页
dispatch_async(
   dispatch_get_global_queue(0,0), ^{
     dispatch_async(
      dispatch_get_main_queue(),^{/*UI*/});
  });


                     VS
[queue addOperation:
 [NSBlockOperation blockOperationWithBlock:^{
   dispatch_async(
    dispatch_get_main_queue(), ^{/*UI*/});
}]];
大图滑动的逐步调优
大图滑动的基本实现
两层UIScrollView

    1




        2
⼀一次性准备ContentSize


{ numOfImages * (width + padding), height }
将读取逻辑扩展出去

[previewImage renderMultipleImages:
 ^(int page, downloadImageCallback callback) {
   asyncLoadImage(page, ^(UIImage *image) {
    callback(image);
   });
 }
];
评估工具


           Instruments




Core Animations      Allocations
大图滑动 V1
图片和 loadingView 分开两个数组

  未渲染部分用 [NSNull null] 占位,提前创建
  好N个 loadingView

  检查是否 [NSNull class] 来判定是否需要加
  载

scrollViewDidEndDecelerating 时加载

每次加载时创建 view,加载过的不会释放
大图滑动 V1

FPS 10-15

不断创建新的 view,不断释放

在 scrollViewDidEndDecelerating 才加载,太
慢

进列表时间很长,初始化东西太多
大图滑动 V1.1


动态补充 loadingView

将绘制逻辑改到 scrollViewWillBeginDragging

缓存第二层的 zoomingScrollView
大图滑动 V1.1


进列表时间有所改善

所有第⼀一次翻动都很卡 FPS: 10-15

Cache 过的 view 不需重新创建 FPS: 20-30
大图滑动 V1.2


提前加载左右 N 页

判定是否到了 N 页,再进行加载

N=5
大图滑动 V1.2


预加载左右 5 张,进列表时间又长了⼀一点

左右 5 张之内 FPS 30-40

第 6 张⼀一次性又要加载5张 FPS 10-20
大图滑动 V1.x
zoomingScrollView 基本不可重用

 大图缓存的命中率很低

每⼀一次绘制都需要遍历三个N长数组

 图片,loadingView,zoomingScrollView

 每次翻动的时间跟列表长度相关 O(N)

创建后不移出 view,subviews 越来越多
大图滑动 V2
不采用单独的 loadingView 数组和 [NSNull null]

  用 zoomingScrollView 来引用 loadingView 跟
  image

View的缓存和回收

  NSMutableSet

    无序,NSObject 不重复

  visiblePages / recyclePages
大图滑动 V2
scrollViewDidScroll

判定当前可见的页(<=2)

如果需要绘制,从 recyclePages 里 dequeue
⼀一个放到 visiblePages

回收不可见的页,从 visiblePages 里挪到
recyclePages

如果不需要绘制,什么都不做
大图滑动 V2

FPS 40-50

保持外层 UIScrollView 的 subviews,最多只
有两个

减少不断创建新 view 的开销

减少 scrollViewDidScroll 时的遍历开销 O(1)
进化路线


滑动时的 FPS 15 => 45

滑动时的遍历:O(n) => O(1)

内存增长:

  view 的创建和回收: N => 2
Next?
大图内存没有尽快释放

  [obj release] 只是引用-1,并没有马上释放

采用小图策略,DB 保存等比小图

⼀一次加载到内存,内存只缓存小图 (20k * 100)

快速滑动时拉伸小图,模糊,但是快

scrollViewDidEndDecelerating 时绘制大图

view 不可见时马上清大图 image = nil;
And..


[NSURLConnection sendSynchronousRequest:returningResponse:error:]


所有网络数据都 load 到内存,并发下载三个,
内存涨了 10M (Oh my!)

对可能的大图片,异步 IO + 文件流
Thanks
 Q&A

Mais conteúdo relacionado

Mais procurados

Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&LockLixun Peng
 
Vim 实用技术,第 1 部分: 实用技巧
Vim 实用技术,第 1 部分: 实用技巧Vim 实用技术,第 1 部分: 实用技巧
Vim 实用技术,第 1 部分: 实用技巧King Hom
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
并发编程交流
并发编程交流并发编程交流
并发编程交流bluedavy lin
 
Redis分享
Redis分享Redis分享
Redis分享yiihsia
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术团队
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流Edward Lee
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
深入Docker的资源管理
深入Docker的资源管理深入Docker的资源管理
深入Docker的资源管理SpeedyCloud
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223Jinrong Ye
 
云计算环境中Ssd在cassandra测试的性能表现
云计算环境中Ssd在cassandra测试的性能表现 云计算环境中Ssd在cassandra测试的性能表现
云计算环境中Ssd在cassandra测试的性能表现 july19850903
 
Ceph in UnitedStack
Ceph in UnitedStackCeph in UnitedStack
Ceph in UnitedStackRongze Zhu
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇bluedavy lin
 
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)Jeff Chu
 
UC奇趣百科性能优化分享
UC奇趣百科性能优化分享UC奇趣百科性能优化分享
UC奇趣百科性能优化分享linx4200
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiCeph Community
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁reinhardx
 
Sheepdog内部实现机制
Sheepdog内部实现机制Sheepdog内部实现机制
Sheepdog内部实现机制Liu Yuan
 

Mais procurados (20)

Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&Lock
 
Vim 实用技术,第 1 部分: 实用技巧
Vim 实用技术,第 1 部分: 实用技巧Vim 实用技术,第 1 部分: 实用技巧
Vim 实用技术,第 1 部分: 实用技巧
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
并发编程交流
并发编程交流并发编程交流
并发编程交流
 
Redis分享
Redis分享Redis分享
Redis分享
 
Sun jdk 1.6 gc
Sun jdk 1.6 gcSun jdk 1.6 gc
Sun jdk 1.6 gc
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
深入Docker的资源管理
深入Docker的资源管理深入Docker的资源管理
深入Docker的资源管理
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
 
云计算环境中Ssd在cassandra测试的性能表现
云计算环境中Ssd在cassandra测试的性能表现 云计算环境中Ssd在cassandra测试的性能表现
云计算环境中Ssd在cassandra测试的性能表现
 
Ceph in UnitedStack
Ceph in UnitedStackCeph in UnitedStack
Ceph in UnitedStack
 
Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇Sun JDK 1.6内存管理 -调优篇
Sun JDK 1.6内存管理 -调优篇
 
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)
雲端的架構開發 (Designing Cloud Application Architecture with Windows Azure Platform)
 
UC奇趣百科性能优化分享
UC奇趣百科性能优化分享UC奇趣百科性能优化分享
UC奇趣百科性能优化分享
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang Li
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
Sheepdog内部实现机制
Sheepdog内部实现机制Sheepdog内部实现机制
Sheepdog内部实现机制
 

Semelhante a FtnApp 的缩略图实践

Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails serverMichael Chen
 
Vulkan introduction
Vulkan introductionVulkan introduction
Vulkan introductionJiahan Su
 
快速打包工具Quick build
快速打包工具Quick build快速打包工具Quick build
快速打包工具Quick buildtb-vertical-guide
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制裝機安 Angelo
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染Ailsa126
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎frogd
 
数据库与ssd的实践与探索-2011数据库技术大会
数据库与ssd的实践与探索-2011数据库技术大会数据库与ssd的实践与探索-2011数据库技术大会
数据库与ssd的实践与探索-2011数据库技术大会freezr
 
从零开始做首页
从零开始做首页从零开始做首页
从零开始做首页fangdeng
 
高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践孙立
 
网站存储经验谈pdf
网站存储经验谈pdf网站存储经验谈pdf
网站存储经验谈pdfYu Lin
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdfYu Lin
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨George Ang
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践Wensong Zhang
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践lovingprince58
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践drewz lin
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践maclean liu
 

Semelhante a FtnApp 的缩略图实践 (20)

Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
 
Vulkan introduction
Vulkan introductionVulkan introduction
Vulkan introduction
 
Nova与虚拟机管理
Nova与虚拟机管理Nova与虚拟机管理
Nova与虚拟机管理
 
快速打包工具Quick build
快速打包工具Quick build快速打包工具Quick build
快速打包工具Quick build
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制
【VM保護備份專題】Dell Power Protect Data Manager (PPDM) 詳解TSDM機制
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
 
数据库与ssd的实践与探索-2011数据库技术大会
数据库与ssd的实践与探索-2011数据库技术大会数据库与ssd的实践与探索-2011数据库技术大会
数据库与ssd的实践与探索-2011数据库技术大会
 
从零开始做首页
从零开始做首页从零开始做首页
从零开始做首页
 
高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践
 
网站存储经验谈pdf
网站存储经验谈pdf网站存储经验谈pdf
网站存储经验谈pdf
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdf
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
 
Taobao base
Taobao baseTaobao base
Taobao base
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践
 

Mais de Frank Xu

淘宝交易平台前端重构
淘宝交易平台前端重构淘宝交易平台前端重构
淘宝交易平台前端重构Frank Xu
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 
排行榜V3项目总结
排行榜V3项目总结排行榜V3项目总结
排行榜V3项目总结Frank Xu
 
JsDoc的使用
JsDoc的使用JsDoc的使用
JsDoc的使用Frank Xu
 
Web Developing In Search
Web Developing In SearchWeb Developing In Search
Web Developing In SearchFrank Xu
 
淘宝搜索前端优化
淘宝搜索前端优化淘宝搜索前端优化
淘宝搜索前端优化Frank Xu
 

Mais de Frank Xu (7)

Watcher
WatcherWatcher
Watcher
 
淘宝交易平台前端重构
淘宝交易平台前端重构淘宝交易平台前端重构
淘宝交易平台前端重构
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
排行榜V3项目总结
排行榜V3项目总结排行榜V3项目总结
排行榜V3项目总结
 
JsDoc的使用
JsDoc的使用JsDoc的使用
JsDoc的使用
 
Web Developing In Search
Web Developing In SearchWeb Developing In Search
Web Developing In Search
 
淘宝搜索前端优化
淘宝搜索前端优化淘宝搜索前端优化
淘宝搜索前端优化
 

FtnApp 的缩略图实践