Upgrade to Pro — share decks privately, control downloads, hide ads and more …

微信读书阅读器架构

Frank Xu
November 27, 2015

 微信读书阅读器架构

微信读书的排版引擎设计,区别于浏览器,实现大部分常见的 HTML/CSS ,通过流排版和支持流索引的存储设计提高移动端的性能,牺牲部分准确性。

Frank Xu

November 27, 2015
Tweet

More Decks by Frank Xu

Other Decks in Programming

Transcript

  1. 阅读器器⼯工作流程 zip HTML DOM CSS Text Stream RangeTree Style List

    Cursor PageFactory Paragraph Page PageView Scroller Render
  2. 树的流存储 - RangeTree <p><i>WeRead</i><b>Rocks</b>!</p> WeReadRocks! tag: p color: blue [0..12)

    tag: i font-style: italic color: black [0..6) tag: b font-weight: bold color: red [6..11)
  3. 树的流存储 - RangeTree tag: p color: blue [0..12) tag: i

    font-style: italic color: black [0..6) tag: b font-weight: bold color: red [6..11)
  4. 树的流存储 - RangeTree tag: p color: blue [0..12) tag: i

    font-style: italic color: black [0..6) tag: b font-weight: bold color: red [6..11)
  5. 树的流存储 - RangeTree tag: p color: blue [0..12) tag: i

    font-style: italic color: black [0..6) tag: b font-weight: bold color: red [6..11) WeReadRocks! tag: p color: blue tag: i font-style: italic color: black tag: b font-weight: bold color: red
  6. 树的流存储 - RangeTree tag: p color: blue [0..12) tag: i

    font-style: italic color: black [0..6) tag: b font-weight: bold color: red [6..11) WeReadRocks! WeReadRocks! tag: p color: blue tag: i font-style: italic color: black tag: b font-weight: bold color: red
  7. Stream Cursor { Paragraph1 PageFactory Paragraph2 Paragraph3 Paragraph4 Paragraph5 text-align:

    right text-indent: 2em border-radius: 4px border: 1px solid black
  8. }Page1 Stream Cursor { Paragraph1 PageFactory Paragraph2 Paragraph3 Paragraph4 Paragraph5

    text-align: right text-indent: 2em border-radius: 4px border: 1px solid black
  9. Stream Cursor { Paragraph1 PageFactory font-size: 1.5em font-weight: bold Paragraph3

    float: left font-size: 2em Paragraph2 { text-indent: 2em
  10. }Page2 Stream Cursor { Paragraph1 PageFactory font-size: 1.5em font-weight: bold

    Paragraph3 float: left font-size: 2em Paragraph2 { text-indent: 2em
  11. 分⻚页索引 Page 0 1 2 3 4 5 Offset 0

    120 240 360 480 600 PageFactory Stream Cursor
  12. 分⻚页索引 Page 0 1 2 3 4 5 Offset 0

    120 240 360 480 600 PageFactory Stream Cursor …
  13. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Data View
  14. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  15. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  16. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  17. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  18. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  19. Page 0 1 2 3 4 5 Offset 0 120

    240 360 480 600 … Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Page 0 1 2 3 4 5 Offset 0 120 240 360 480 600 Data View
  20. 差值压缩 1 2 3 4 5 6 7 8 9

    10 11 12 1 1 1 1 1 1 1 1 1 1 1 1
  21. 差值压缩 1 2 3 4 5 6 7 8 9

    10 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 12
  22. 变⻓长数字 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 255
  23. 变⻓长数字 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 255
  24. 多种压缩混合 1 2 3 4 5 6 7 8 9

    10 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 12
  25. 多种压缩混合 1 2 3 4 5 6 7 8 9

    10 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0
  26. 多种压缩混合 1 2 3 4 5 6 7 8 9

    10 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 33164
  27. Gilber Vernam + AES • 世界上最安全的加密(OTP,One-Time-Pad) • 真正随机/密钥不不复⽤用/密钥不不泄露露 • 随机密钥,每章⼀一个密钥

    • 轮转密钥,跟偏移位置相关 • 有偏移位置可部分解密 • 流接⼝口(FilterInputStream)
  28. 正⽂文 (加密) 资源 正⽂文样式 全局样式 存储 排版 渲染 交互 布局

    (位置) 断⾏行行断字 分⻚页 预渲染 样式 (级联) ⽪皮肤 绘制
  29. 翻⻚页 选区 事件 正⽂文 (加密) 资源 正⽂文样式 全局样式 存储 排版

    渲染 交互 布局 (位置) 断⾏行行断字 分⻚页 预渲染 样式 (级联) ⽪皮肤 绘制