2009-06-06 42 views
0

我正在用C++创建一个Linux程序,用于渲染html文件的便携式设备。Html渲染器资源有限(良好的内存管理)

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

一个解决方案是动态加载/卸载部分文件,但我不知道如何实现。

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

我想听听您的意见是什么这样的情况,最好的方法? 你可以推荐一个算法,一个开源项目来看看,还是一个支持我想要做的事情的库(webkit?)。

编辑: 我写的电子书阅读器,所以我只需要纯HTML的渲染,不需要JavaScript,CSS没有,...

回答

1

为了能够在没有完全加载的情况下浏览树形文档(如HTML),您必须做出一些假设 - 例如文档是实际的树。所以,不要打扰检查密切的标签。无论如何,关闭标签是为人类消费而设计的,电脑也会对<>感到满意。

第一步是假定文档的第一部分由文档的第一部分表示。这听起来像是一种同义反复,但是对于“现代”的HTML,当然JS在技术上不再是真实的。不过,如果任何一行HTML都会影响任何像素,那么您无法部分加载页面。

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

为了使分页更容易,对于您到目前为止遇到的每个页面保持此“页边界”状态是明智的。这使得分页容易。

现在,在渲染新页面时,上一页面边界状态将为您提供初始渲染状态。您只需阅读HTML并逐个呈现它,直到您溢出单个页面。然后您回溯一下并确定新的页面边界状态。

平滑滚动基本上是渲染两个相邻页面并显示第一个百分比的x%和第二个100-x百分比的问题。一旦实现了这一点,在渲染每个页面时完成段落可能会变得很明智。这会给你稍微不同的页面长度,但是你不必处理破碎的段落,而这又会使页面边界状态变得更小。

0

Dillo是重量最轻的Linux的Web浏览器,我很意识到。

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

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

+0

这看起来像一个很好的解决方案,除了: 1-这是完整的浏览器,而不是一个库 2-即使它是轻量级的,也没有迹象表明它可以处理大文件(动态加载/卸载页面) – karatchov 2009-06-06 17:10:52