【问题标题】:Html renderer with limited resources (good memory management)资源有限的 HTML 渲染器(良好的内存管理)
【发布时间】:2009-06-06 16:49:32
【问题描述】:

我正在用 C++ 为便携式设备创建一个 linux 程序,以呈现 html 文件。

问题是设备内存有限,因此无法打开大文件(使用实际软件)。

一种解决方案是动态加载/卸载文件的某些部分,但我不确定如何实现。

滚动的能力是必须的,如果可能的话有流畅的体验

我想听听您对这种情况最好的方法是什么? 你可以建议一个算法、一个开源项目来看看,或者一个支持我正在尝试做的事情的库(webkit?)。

编辑: 我正在写一个电子书阅读器,所以我只需要纯 html 渲染,没有 javascript,没有 CSS,...

【问题讨论】:

    标签: c++ html embedded low-memory


    【解决方案1】:

    为了能够在不完全加载的情况下浏览树文档(如 HTML),您必须做出一些假设——比如文档是一个实际的树。所以,不要费心检查关闭标签。无论如何,关闭标签是为人类消费而设计的,计算机也会对<> 感到满意。

    第一步是假设文档的第一部分由文档的第一部分表示。这听起来像是一个重言式,但对于“现代”HTML 和当然 JS,这在技术上不再正确。尽管如此,如果任何 HTML 行可以影响任何像素,您根本无法部分加载页面。

    因此,如果 HTML 文件的位置和屏幕上的页面之间存在简单的关系,那么下一步就是在每个页面的末尾定义解析状态。然后这将包括单个文件偏移量,可能(但不一定)在段落的末尾。这种状态的一部分还有一堆打开的标签。

    为了使分页更容易,明智的做法是为您目前遇到的每个页面保持这种“页面边界”状态。这使得翻页变得容易。

    现在,在渲染新页面时,之前的页面边界状态将为您提供初始渲染状态。您只需读取 HTML 并逐个元素地呈现它,直到溢出单个页面。然后你回溯一点,确定新的页面边界状态。

    平滑滚动基本上是渲染两个相邻页面并显示第一个页面的 x% 和第二个页面的 100-x%。一旦你实现了这一点,在渲染每一页时完成一个段落可能会变得很聪明。这将使您的页面长度略有不同,但您不必处理损坏的段落,这反过来会使您的页面边界状态更小。

    【讨论】:

      【解决方案2】:

      Dillo 是我所知道的最轻量级的 Linux 网络浏览器。

      编辑:如果它(或其渲染组件)不能满足您的需求,那么您可能会发现维基百科的layout engines 列表和比较会有所帮助。

      编辑 2: 我怀疑动态加载和卸载 HTML 文件的某些部分会很棘手;例如,你怎么知道随机选择的文件块不在标签的中间?您可能必须使用 SAX 之类的东西将文件解析为中间表示,将中间表示的离散块保存到持久存储中,这样它们就不会占用太多 RAM。或者,您可以使用 SAX 解析文件以立即显示适合 RAM 的内容,然后在用户滚动太多时重新解析它。 (样式表和 Javascript 会破坏这种方法;一些纯 HTML 也可能。)如果是我,我会尝试找到一种简单的标记语言或某种富文本查看器,而不是遇到所有这些困难。

      【讨论】:

      • 这看起来是一个很好的解决方案,除了: 1- 这是完整的浏览器,而不是库 2- 即使它是轻量级的,也没有迹象表明它可以处理大文件(动态加载/卸载页面)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2021-09-23
      • 2022-11-17
      • 1970-01-01
      • 2013-01-25
      • 2010-09-10
      • 2016-02-22
      相关资源
      最近更新 更多