關於嵌入瀏覽器架構的一些總結和思考

2021-05-21 13:06:39 字數 1941 閱讀 4001

1.  瀏覽器主線程和工作執行緒的任務劃分

一開始瀏覽器沒有劃分主線程和工作執行緒, 整個瀏覽器只有乙個執行緒.  (8623資源太少, 所以我們堅持很長一段時間都是乙個執行緒).

後來, 由於cpu太爛, 載入乙個頁面的時間太長 (大概是2秒左右), 影響了按鍵的響應速度, 又後來, 執行阻塞型的js指令碼會導致動態gif停下來,  所以我決定增加乙個執行緒作為工作執行緒,  這個工作執行緒主要的任務就是處理一些需要快速響應的任務 (包括按鍵的處理, 還有一些提示性的ui) . 至此, 在8623平台上面瀏覽器的執行緒方面的架構基本確定下來, 分別是:

主線程:    資源載入, html解析,css解析, js指令碼的執行, 頁面的渲染輸出

工作執行緒: 按鍵接收,防抖 ,  動態gif, 走馬燈等一些動態ui的處理

可見硬體平台對軟體架構的影響有多大.

經過這樣的執行緒安排之後, 解決了一些問題, 比如 按鍵的接收不會因為載入頁面而被阻塞,  動態ui不會因為載入頁面而阻塞.  但是切換到8654上之後, 再回過頭來看,也發現了一些問題:

主線程和工作執行緒都會進行ui的處理, 執行緒功能不明確, 不利於以後的擴充套件;

8654的cpu非常強勁, 現在載入乙個頁面的時間在200毫秒到400毫秒之間, 原來特定增加乙個執行緒來處理按鍵已經顯得不那麼重要;

所以後面會對瀏覽器的架構進行適度的調整, 主線程專心處理ui 的渲染和輸出, 而工作執行緒則處理ui渲染和輸出以外的其他工作, 這樣才名副其實.

2. 我們的瀏覽器應該具備什麼最基本的功能

這個問題思考過很多遍, 現在基本明確下來:

能通過html+ css 來表現機頂盒的ui; (基本實現)

能通過js 來描述和控制機頂盒業務; (基本實現)

能通過http(s),ftp等傳輸方式來同步和更新機頂盒端的資料; (還未能實現通過http直接載入頁面)

mbrsrcore 作為瀏覽器的核心, 必須完成上面描述的最基本的功能 ,其他功能都應該將其排除在外, 保持瀏覽器核心的簡潔. 所以這幾天我們建立了乙個基本庫, 將瀏覽器核心原來的解析和載入, 字型檔的解析和載入, 還有一些工具類的功能(如定時器佇列, ) 裁剪處理,  納入基本庫中.

應該將什麼功能納入到瀏覽器核心, 可以根據以下的原則進行判斷:

只能將符合w3c標準的ui表現納入; (比如不能將自定義的html元素或者css屬性的實現放到mbrsrcore中)

只能將通用的基於tv的事件處理納入; (比如基於遙控方向鍵的焦點跳轉)

3. 如何對瀏覽器核心進行擴充套件

擴充套件的目的主要有兩個:

增加ui功能,  比如對話方塊; (ui類)

增加業務處理能力, 比如解析節目清單的xml等; (後台業務類)

目前主要通過以下方式來對瀏覽器進行擴充套件:

通過自定義js函式進行擴充套件;

通過自定義js物件進行擴充套件 (不依賴於任何html元素)

通過自定義html元素 + 相關聯的dom物件進行擴充套件.

在採用上面的方式對瀏覽器進行擴充套件時,發現了一些問題:

通過 js 對ui進行擴充套件時,  缺乏一些渲染,布局功能函式的支援 (比如文字布局), 導致實現 js擴充套件函式,物件困難;

後台業務完全通過js物件實現, 缺乏靈活性;

所以, 應該在瀏覽器的渲染模組上提供更多布局和渲染介面, 供擴充套件ui使用.

應該將後台業務的實現跟瀏覽器分離開來, 不過瀏覽器應該提供資料的輸入和查詢介面, 供js物件使用.

4. 我們的瀏覽器應該走專用的方向, 就像ucweb, 為了讓瀏覽器可以在手機上應用, 在ui呈現,  瀏覽器外掛程式和資料傳輸方面下了很多功夫.  所以接下來應該花更多時間去研究如何將瀏覽器方式的應用運用在電視上面. 暫時可參考的是yahoo widget

關於瀏覽器UA的一些介紹

使用js檢查瀏覽器標誌 code from使用方法 判斷是否ie核心 if browser.versions.trident 判斷是否webkit核心 if browser.versions.webkit 判斷是否移動端 if browser.versions.mobile browser.vers...

瀏覽器(BOM)物件的一些內建方法總結

1 bom就是瀏覽器那端執行的 dom就是伺服器那端操作html的 2 記好bom的幾個物件,那就很好理解很多 了,也很好寫很多 了 bom的核心物件是window,它表示瀏覽器的乙個例項,它也是ecmascript規定的globle物件,也就是說網頁中任何乙個物件都是在window這個物件裡面的。...

關於迭代器的一些總結

在進行for迴圈的時候,會碰到兩個名詞 乙個是可迭代的物件iterable,乙個是迭代器iterator。可迭代的物件有很多,例如sequence中的string,list,tuple,還有字典dict,檔案file等,在可迭代的物件中,主要是實現了 iter 方法,從而使可迭代的。迭代器itera...