chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解ROMA中復(fù)雜圖表的渲染實(shí)現(xiàn)

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2025-10-21 13:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、背景

ROMA承接很多復(fù)雜圖表的渲染需求,在京東金融APP內(nèi),特別是首頁(yè)首屏的圖表,對(duì)圖表渲染的及時(shí)性要求很高。近期業(yè)務(wù)反饋頻繁重啟時(shí),首頁(yè)的黃金走勢(shì)圖偶現(xiàn)渲染不出的問(wèn)題,通過(guò)梳理圖表的渲染流程,對(duì)緩存策略、視圖加載和渲染過(guò)程進(jìn)行了重構(gòu),確保渲染成功率,提升了渲染速度以及補(bǔ)充了異常重試的功能。

二、使用場(chǎng)景分析

京東金融App內(nèi)有很多使用復(fù)雜圖表的業(yè)務(wù)場(chǎng)景,以下截取部分場(chǎng)景。下圖分別是黃金歷史金價(jià)的走勢(shì)圖、用戶購(gòu)買(mǎi)的基金的收益走勢(shì)圖、小金庫(kù)的收益柱狀圖、用戶投資診斷的雷達(dá)圖、省錢(qián)賬單和AI助手賬單趨勢(shì)柱狀圖。

wKgZPGj3IMGAQ5tLAAQZOteqvo0650.png

可見(jiàn),金融App內(nèi)圖表的使用具備種類(lèi)豐富、數(shù)據(jù)信息量大,定制程度高、交互頻繁等特點(diǎn),經(jīng)調(diào)研發(fā)現(xiàn),Apache ECharts 是一個(gè)基于 JavaScript 的功能強(qiáng)大的開(kāi)源可視化圖表庫(kù),被廣泛應(yīng)用于數(shù)據(jù)分析、監(jiān)控系統(tǒng)、報(bào)表工具等領(lǐng)域。并且支持定制支持的圖表類(lèi)型,可降低圖標(biāo)庫(kù)的體積和提升圖標(biāo)庫(kù)的加載速度。由于原生端并沒(méi)有類(lèi)似的圖表庫(kù),因次決定在 ROMA 中引入 ECharts 來(lái)承接復(fù)雜圖表的顯示需求 。

三、重構(gòu)過(guò)程分析

1、原理分析

ROMA 對(duì)外提供 echarts 標(biāo)簽,內(nèi)部依賴提前加載了 echarts.js 庫(kù)的 WebView,將圖表數(shù)據(jù)交給準(zhǔn)備好環(huán)境的 webveiw,達(dá)到渲染圖表的目的。這里有一個(gè)重要的前提就是成功加載了echarts.js 庫(kù)的 WebView 才具備快速渲染各類(lèi)圖表的能力。并且需要提前打通 ROMA 與 Native,Native 與 WebView 之間的數(shù)據(jù)通訊,保證數(shù)據(jù)在三端之間的順暢流轉(zhuǎn)。

為此自定制了 JRTransEchartsWebView 專(zhuān)門(mén)用于渲染 echarts 數(shù)據(jù),JRTransEchartsComponent 作為標(biāo)簽實(shí)現(xiàn)在承接 webview 和 jue 環(huán)境的數(shù)據(jù)傳遞和業(yè)務(wù)邏輯處理。以下類(lèi)圖展示了各主要類(lèi)對(duì)象之間的相互關(guān)系。

wKgZO2j3IMGAJ7lAAAJipjadxGE594.jpg

首先打通 Native 和 WebView 的數(shù)據(jù)交互,原生端在創(chuàng)建 WebView 的時(shí)候就向其環(huán)境中注入 window 的 message 事件監(jiān)聽(tīng),攔截指定類(lèi)型的事件,獲取從 WebView 環(huán)境中發(fā)來(lái)的數(shù)據(jù)。

NSString *jsStrring = @"window.addEventListener('message', (e) => { 
                        var customDict = {'function':'jdttransWindowEventDispatch', 
                                          'careParamDict':{'data': e.data, 'origin': e.origin}}; 
                        window.webkit.messageHandlers.JDTTransEchartsHandler.postMessage(customDict);})";
NSString *jscode = [NSString stringWithFormat:jsStrring];
WKUserScript *script = [[WKUserScript alloc]initWithSource:jscode injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
[webView.configuration.userContentController addUserScript:script];

Native 向 WebView 發(fā)送數(shù)據(jù)通過(guò) evaluateJavaScript 的方式,向JS環(huán)境中輸入數(shù)據(jù):

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{@"type":@"message"}]; 
[dict jdd_setObjectCheck:message forKey:@"data"]; 
[dict jdd_setObjectCheck:@"*" forKey:@"origin"]; 
NSString *dictString = [dict jdd_JSONString]; 
NSString *jsString = [NSString stringWithFormat:@"javascript:(function (){ 
                                                  var event = new MessageEvent('message', %@); 
                                                  window.dispatchEvent(event);})()",dictString]; 
[webView evaluateJavaScript:jsString completionHandler:nil];

JUE 和 Native 之間的通訊通道在初始化 ROMA 的 SDK 時(shí)就已經(jīng)建立,Native 和 webview 的數(shù)據(jù)交互也通過(guò) postMessage 的方式建立,如下圖所示:

wKgZPGj3IMKAUtK_AABqBd-ss88690.jpg

以上,JUE 通過(guò)調(diào)用 call native 將數(shù)據(jù)發(fā)送到 Native,Native 通過(guò) window.dispatchEvent 的方式將數(shù)據(jù)傳遞給 WebView。而圖表上的手勢(shì)交互等事件 WebView 通過(guò) postMessage 的方式發(fā)送,在 Native 監(jiān)聽(tīng)指定類(lèi)型的 message 獲取數(shù)據(jù),通過(guò)處理并通過(guò) fire event 觸發(fā)到 JUE。

2、緩存的設(shè)計(jì)

對(duì)于 echarts 渲染圖表數(shù)據(jù),大致經(jīng)歷以下過(guò)程,創(chuàng)建 webview,加載 echarts.js 渲染庫(kù),資源開(kāi)始加載 ,資源成功加載,最后渲染圖表數(shù)據(jù),這幾個(gè)過(guò)程中,除了最后一步渲染數(shù)據(jù),前面的步驟都可以提前做,越早完成前面的工作,越能提升圖表渲染的效率。

wKgZO2j3IMOAfj05AAA7HIKfmzY261.jpg

為此,設(shè)計(jì)了可重復(fù)利用的并可自動(dòng)擴(kuò)容的 WebView 緩存容器 JRTransEchartsCache。在App啟動(dòng)階段緩存 min 個(gè) WebView 保存至緩存列表 cacheArray 中,并持續(xù)跟蹤 WebView 加載 echarts.js 的階段,確保在成功加載了 echarts.js 資源后再開(kāi)始渲染圖表數(shù)據(jù)。而對(duì)于過(guò)早的圖表渲染指令,則先保存至指定標(biāo)簽的指令緩存列表 eventArray 中,待成功加載后,再渲染 eventArray 中的數(shù)據(jù)。

而對(duì)于 WebView 加載 echarts.js 資源失敗的情況,也加入了失敗重試的邏輯,當(dāng)業(yè)務(wù)端發(fā)起數(shù)據(jù)渲染時(shí)會(huì)檢查環(huán)境狀態(tài),而觸發(fā) echarts.js 的重新加載。

隨著 WebView 使用,其狀態(tài)被標(biāo)記為 using,并根據(jù)使用的情況,自動(dòng)觸發(fā) cacheArray 中的 WebView 擴(kuò)容,最大擴(kuò)容至 max 個(gè)。對(duì)于從詳情頁(yè)返回而釋放的圖表,其 WebView 將會(huì)被標(biāo)記為 free ,可提供為其他的圖表視圖使用。 當(dāng)使用圖表的業(yè)務(wù)持續(xù)增多,當(dāng) cacheArray 中的 WebView 都被使用后,則新創(chuàng)建的 WebView 不再加入 cacheArray,遵循當(dāng)次獲取,當(dāng)次創(chuàng)建,使用完成,就地銷(xiāo)毀的原則。

3、渲染流程

下圖記錄了從 App 啟動(dòng)到業(yè)務(wù)創(chuàng)建 echarts 圖表,到業(yè)務(wù)退出,到 App 退出期間,融合了緩存的初始化以及自動(dòng)擴(kuò)容,包括在 webview 加載 echarts.js 資源的不同階段對(duì)渲染指令的處理,以及視圖銷(xiāo)毀后的內(nèi)存處理等場(chǎng)景下的處理流程。

wKgZO2j3IMOAM9ZUAAMT5-fZGd0681.jpg

四、效果驗(yàn)證

為了更直觀的展示圖表在業(yè)務(wù)上的使用場(chǎng)景,使用重構(gòu)后的圖表標(biāo)簽渲染柱狀圖、條形圖、折線圖、餅圖和組合圖表,渲染的效果和操作都很流暢(由于文檔的限制,對(duì)以下視頻做了降頻和清晰度的處理),效果如下:

wKgZPGj3IMqAcuXCAJXxyyZNU14523.gif

五、總結(jié)

通過(guò)此次圖表的重構(gòu),在App冷啟時(shí),以 iPhoneXS Max 設(shè)備為例,首頁(yè)首屏渲染圖表數(shù)據(jù)的時(shí)間平均縮短了200ms;冷啟首頁(yè)首屏圖表的渲染成功率,由之前的平均90%提升至接近100%;非首頁(yè)首屏的圖表渲染幾乎零延遲;對(duì)于異常情況導(dǎo)致的環(huán)境初始化失敗的問(wèn)題,也在接受渲染指令時(shí)自檢渲染環(huán)境并重啟環(huán)境初始化,自動(dòng)恢復(fù)數(shù)據(jù)的渲染。如果你也對(duì)圖表渲染或者對(duì)跨端框架 ROMA 感興趣,可留言交流。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 渲染
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    11309
  • 京東
    +關(guān)注

    關(guān)注

    2

    文章

    1056

    瀏覽量

    49804
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    知乎開(kāi)源“智能預(yù)渲染框架” 幾行代碼實(shí)現(xiàn)鴻蒙應(yīng)用頁(yè)面“秒開(kāi)”

    ,交互延遲等核心痛點(diǎn),通過(guò)智能預(yù)測(cè)用戶瀏覽目標(biāo)進(jìn)行提前渲染,只需幾行代碼即可顯著提升復(fù)雜頁(yè)面的加載性能,實(shí)現(xiàn)“頁(yè)面秒開(kāi)”的高效體驗(yàn),為鴻蒙開(kāi)發(fā)者帶來(lái)開(kāi)發(fā)效率和用戶體驗(yàn)的雙重飛躍。 隨著鴻蒙生態(tài)快速發(fā)展,應(yīng)用開(kāi)發(fā)者難免會(huì)遇到一些性
    的頭像 發(fā)表于 08-29 14:32 ?387次閱讀
    知乎開(kāi)源“智能預(yù)<b class='flag-5'>渲染</b>框架” 幾行代碼<b class='flag-5'>實(shí)現(xiàn)</b>鴻蒙應(yīng)用頁(yè)面“秒開(kāi)”

    通道渲染:釋放渲染的全部潛能!通道渲染的作用、類(lèi)型、技巧

    在3D圖形創(chuàng)作渲染通道(RenderPasses)是一項(xiàng)至關(guān)重要的技術(shù),它通過(guò)將復(fù)雜渲染圖像拆分為多個(gè)圖層,如陰影、光照、法線等,使藝術(shù)家能夠在后期制作
    的頭像 發(fā)表于 07-15 14:22 ?323次閱讀
    通道<b class='flag-5'>渲染</b>:釋放<b class='flag-5'>渲染</b>的全部潛能!通道<b class='flag-5'>渲染</b>的作用、類(lèi)型、技巧

    CPU渲染、GPU渲染、XPU渲染詳細(xì)對(duì)比:哪個(gè)渲染最快,哪個(gè)效果最好?

    動(dòng)畫(huà)渲染動(dòng)畫(huà)3D渲染技術(shù)需要應(yīng)對(duì)復(fù)雜的計(jì)算任務(wù)和精細(xì)的圖像處理,作為渲染技術(shù)人員,選擇合適的渲染模式,會(huì)直接影響制作效率和成品質(zhì)量。在主流的
    的頭像 發(fā)表于 04-15 09:28 ?996次閱讀
    CPU<b class='flag-5'>渲染</b>、GPU<b class='flag-5'>渲染</b>、XPU<b class='flag-5'>渲染</b>詳細(xì)對(duì)比:哪個(gè)<b class='flag-5'>渲染</b>最快,哪個(gè)效果最好?

    2D圖形渲染緩慢怎么加快?

    我有一個(gè)圖形應(yīng)用程序,它似乎渲染屏幕的速度很慢。按下屏幕后,通常需要相當(dāng)長(zhǎng)的時(shí)間來(lái)更新,大約 50 或 100 毫秒。 在應(yīng)用程序啟動(dòng)時(shí),我看到一條錯(cuò)誤消息“GDK 無(wú)法創(chuàng)建 GL 上下文,回退
    發(fā)表于 04-02 06:46

    HarmonyOS應(yīng)用高負(fù)載場(chǎng)景分幀渲染

    ,可以采用分幀渲染技術(shù),將原本在一幀內(nèi)加載的數(shù)據(jù)分散到多幀逐步加載,從而減輕單幀的渲染壓力。不過(guò),分幀渲染需要開(kāi)發(fā)者精確計(jì)算每幀加載的數(shù)據(jù)量,操作較為
    的頭像 發(fā)表于 03-25 10:28 ?719次閱讀
    HarmonyOS應(yīng)用高負(fù)載場(chǎng)景分幀<b class='flag-5'>渲染</b>

    基于鴻蒙原生ArkTS語(yǔ)法開(kāi)發(fā)的圖表組件--柱狀圖

    大家好,我是陳楊。在上一篇文章,我簡(jiǎn)要介紹了折線圖的實(shí)現(xiàn)邏輯,并解釋了整體圖表的繪制規(guī)則。根據(jù)這些規(guī)則,我們還可以繪制更多種類(lèi)的圖表組件。在本期中,我將講解如何
    的頭像 發(fā)表于 03-16 16:01 ?679次閱讀
    基于鴻蒙原生ArkTS語(yǔ)法開(kāi)發(fā)的<b class='flag-5'>圖表</b>組件--柱狀圖

    Labview坐標(biāo)與圖表上的點(diǎn)

    怎么把(x,y)這一坐標(biāo)對(duì)應(yīng)到Labview圖表上的點(diǎn)?
    發(fā)表于 02-19 18:04

    GPU渲染才是大勢(shì)所趨?CPU渲染與GPU渲染的現(xiàn)狀與未來(lái)

    在3D建模和渲染領(lǐng)域,隨著技術(shù)的發(fā)展,CPU渲染和GPU渲染這兩種方法逐漸呈現(xiàn)出各自獨(dú)特的優(yōu)勢(shì),并且在不同的應(yīng)用場(chǎng)景各有側(cè)重。盡管當(dāng)前我們處在一個(gè)CPU
    的頭像 發(fā)表于 02-06 11:04 ?1061次閱讀
    GPU<b class='flag-5'>渲染</b>才是大勢(shì)所趨?CPU<b class='flag-5'>渲染</b>與GPU<b class='flag-5'>渲染</b>的現(xiàn)狀與未來(lái)

    SciChart 3D for WPF圖表庫(kù)

    DirectX 支持的 WPF 3D 圖表和廣泛的 API 完成工作。 WPF 3D 圖表性能 我們傳奇的 WPF 3D 圖表性能由廣泛的端到端性能優(yōu)化、不安全代碼、C++ 互操作、DirectX
    的頭像 發(fā)表于 01-23 13:49 ?1123次閱讀
    SciChart 3D for WPF<b class='flag-5'>圖表</b>庫(kù)

    SciChart—高性能的JavaScript圖表和圖形庫(kù)

    使用 SciChart 的 JavaScript 圖表庫(kù)為您的 JS 應(yīng)用程序發(fā)現(xiàn)終極解決方案。 使用 WebGL 創(chuàng)建動(dòng)態(tài)、高速的圖表和圖形,非常適合實(shí)時(shí)處理復(fù)雜的數(shù)據(jù)可視化。使用我們強(qiáng)大而靈活
    的頭像 發(fā)表于 01-22 10:15 ?1787次閱讀
    SciChart—高性能的JavaScript<b class='flag-5'>圖表</b>和圖形庫(kù)

    Chart FX——金融圖表

    和收盤(pán)價(jià)之間的關(guān)系被視為重要信息,是這些圖表的精髓所在。 使用 Chart FX,您可以創(chuàng) 高低收盤(pán)圖、開(kāi)高低收盤(pán)圖和蠟燭圖。向這些圖表傳遞數(shù)據(jù)的過(guò)程與向 Chart FX 任何圖表
    的頭像 發(fā)表于 01-15 17:20 ?746次閱讀

    Chart FX——圖表導(dǎo)出

    Web格式的圖片(如 PNG 或 JPEG)。 Chart FX 還有其他文件類(lèi)型,稱為 “圖表模板”,允許您將圖表的外觀(顏色、圖表類(lèi)型和樣式、可視工具等)保存在一個(gè)文件
    的頭像 發(fā)表于 01-15 14:38 ?613次閱讀
    Chart FX——<b class='flag-5'>圖表</b>導(dǎo)出

    Chart FX——打印圖表

    另一個(gè)重要的問(wèn)題是圖表打印的頁(yè)數(shù)。當(dāng)您需要打印包含大量點(diǎn)的圖表(可滾動(dòng))時(shí),Chart FX 將根據(jù)需要打印盡可能多的頁(yè)面。若使用壓縮屬性, Chart FX 會(huì)通過(guò)重新計(jì)算適當(dāng)?shù)闹凳顾悬c(diǎn)都能
    的頭像 發(fā)表于 01-13 09:12 ?567次閱讀
    Chart FX——打印<b class='flag-5'>圖表</b>

    Chart FX-圖表渲染尺寸和格式

    渲染尺寸 網(wǎng)絡(luò)開(kāi)發(fā)人員的常見(jiàn)做法是創(chuàng)建一個(gè)大圖表,以便于在瀏覽器上閱讀。然而,這種做法可能是影響服務(wù)器在大負(fù)載情況下的表現(xiàn)和性能的一個(gè)重要因素。從本質(zhì)上講,圖表越大,意味著必須處理、生成、存儲(chǔ)和最終
    的頭像 發(fā)表于 01-08 11:25 ?508次閱讀
    Chart FX-<b class='flag-5'>圖表</b><b class='flag-5'>渲染</b>尺寸和格式

    Chart FX-選擇圖表輸出

    的格式即可。 您也可以指示 Chart FX 以多種格式渲染圖表。配置圖表的方法也有多種。 作為一個(gè)服務(wù)器控件,Chart FX 支持一種名為 RenderToStream 的方法,該方法允許開(kāi)發(fā)人員選擇
    的頭像 發(fā)表于 01-05 11:06 ?695次閱讀
    Chart FX-選擇<b class='flag-5'>圖表</b>輸出