2009-06-06 61 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