99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

從Electron到自研C# UI引擎:200KB內(nèi)核實(shí)現(xiàn)0.2秒啟動

從Electron到自研C# UI引擎:200KB內(nèi)核實(shí)現(xiàn)0.2秒啟動 寫這篇文章的起因是我這段時(shí)間把一個基于 Electron 的桌面工具徹底推翻重寫用一套自研的 C# UI 引擎 XchyUI 換掉了原來的 Web 套殼方案。內(nèi)核壓縮到 200KB 級別啟動耗時(shí)從 3 秒壓到 0.2 秒以內(nèi)內(nèi)存占用從 300MB 掉到 50MB 上下。整個過程踩了不少坑也積累了一些能直接復(fù)用的經(jīng)驗(yàn)今天就是想把這套東西的來龍去脈、設(shè)計(jì)取舍、核心實(shí)現(xiàn)和實(shí)測數(shù)據(jù)攤開聊一聊。想在桌面端擺脫 Electron 體積和性能包袱、對 UI 渲染底層原理感興趣的 C# 開發(fā)者應(yīng)該能從里面找到自己需要的東西。1. 先把賬算明白200KB 和 Electron 的差距到底在哪1.1 Electron 體積與內(nèi)存的真實(shí)賬單Electron 的本質(zhì)是一個把 Chromium 瀏覽器內(nèi)核、Node.js 運(yùn)行時(shí)和你的應(yīng)用代碼打包在一起的發(fā)行方式。Chromium 本身就是個上億行的龐然大物它的多進(jìn)程架構(gòu)決定了每開一個窗口至少要拉起一個 GPU 進(jìn)程、一個渲染進(jìn)程再加若干輔助進(jìn)程。我原來的應(yīng)用僅僅是一個內(nèi)部數(shù)據(jù)看板加報(bào)表工具功能談不上復(fù)雜打包出來 exe 安裝包接近 180MB安裝完成之后磁盤占用輕松突破 600MB運(yùn)行時(shí)內(nèi)存基本穩(wěn)定在 250MB 以上切換到復(fù)雜頁面時(shí)峰值可以沖到 400MB。這在開發(fā)機(jī)上還不覺得什么放到客戶配置一般的辦公電腦上風(fēng)扇狂轉(zhuǎn)、點(diǎn)擊卡頓是常有的事。自研 XchyUI 之后整個應(yīng)用的 UI 層程序集大小只有 180KB 左右加上輔助類庫也穩(wěn)定在 200KB 級別。這里的 200KB 指的是自研 UI 引擎本體的文件體積不包含 .NET 運(yùn)行時(shí)。用 .NET 的 single-file publish 把應(yīng)用連同框架一起發(fā)布出去完整產(chǎn)物也才 35MB 左右磁盤占用 100MB 出頭運(yùn)行時(shí)內(nèi)存 40~60MB。這組數(shù)字不是拿不同配置的機(jī)器硬對比出來的而是在同一臺機(jī)器上反復(fù)測量的結(jié)果。1.2 Web 套殼方案被忽略的隱性成本很多人選擇 Electron 或者類似的 Web 套殼方案理由是寫起來快、樣式好調(diào)、前端生態(tài)豐富。這幾句話在原型階段沒問題但放到真實(shí)產(chǎn)品里隱性成本會一點(diǎn)點(diǎn)顯現(xiàn)出來。首先是啟動鏈路過長。Electron 要依次完成加載 Chromium 內(nèi)核、初始化 V8、啟動 Node.js、加載應(yīng)用腳本、構(gòu)建渲染進(jìn)程的 DOM 樹、執(zhí)行前端框架的掛載邏輯。這條鏈路做任何一步優(yōu)化都要和瀏覽器內(nèi)核打交道你幾乎沒有掌控力。你以為自己寫的是一款桌面應(yīng)用其實(shí)你只是把瀏覽器和 Node.js 縫在了一起。其次是內(nèi)存模型。前端頁面的所有 DOM 節(jié)點(diǎn)、JavaScript 對象、CSS 樣式和圖片解碼數(shù)據(jù)都堆在渲染進(jìn)程的堆里而 Node.js 和 Chromium 各自維護(hù)獨(dú)立的運(yùn)行時(shí)狀態(tài)兩邊通過 IPC 反復(fù)拷貝數(shù)據(jù)。哪怕頁面本身很簡單瀏覽器內(nèi)核的基礎(chǔ)開銷也省不掉。我遇到過僅僅打開一個主窗口、沒有任何復(fù)雜邏輯內(nèi)存就穩(wěn)定在 120MB 以上的情況——其中真正屬于業(yè)務(wù)數(shù)據(jù)的部分連 5MB 都不到。第三是事件鏈路的時(shí)延。Web 套殼中一次鼠標(biāo)點(diǎn)擊要走完渲染進(jìn)程捕獲事件 → 序列化 → IPC 發(fā)給主進(jìn)程 → 主進(jìn)程執(zhí)行邏輯 → 序列化 → IPC 回渲染進(jìn)程 → 更新 DOM → 瀏覽器重排重繪。這條鏈路從原理上就決定了它的延遲不可能太低尤其是頻繁交互的場景掉幀、卡頓幾乎是必然的。1.3 自研引擎的收益邊界與選型判斷做任何技術(shù)決策之前先想清楚收益邊界。自研 UI 引擎確實(shí)能解決 Electron 的體積、內(nèi)存、啟動速度問題但它也要求你具備對渲染底層機(jī)制的基本理解同時(shí)意味著你不再擁有前端生態(tài)里那些開箱即用的圖表庫、富文本編輯器、UI 組件庫。我的判斷標(biāo)準(zhǔn)是如果應(yīng)用界面復(fù)雜度一般交互密度高對資源占用有硬性要求且團(tuán)隊(duì)本身有 C# 功底那么就非常適合走自研路線。反過來如果你的應(yīng)用重度依賴網(wǎng)頁生態(tài)里那些復(fù)雜組件界面每天都要換皮膚、調(diào)樣式又或者迭代速度要求極高那還是繼續(xù)用 Electron 或者考慮 Avalonia 這類成熟框架更穩(wěn)妥。XchyUI 的定位就是夠用且可控。它不做你根本用不上的各種瀏覽器特性不做通用 DOM 解析不做復(fù)雜的 CSS 盒模型而是聚焦桌面應(yīng)用真正高頻需要的按鈕、輸入框、列表、樹、表格、簡單的自定義繪圖面板。這個邊界決定了它能夠做到很小也決定了它能夠快。2. 200KB 內(nèi)核是怎么做到的XchyUI 的核心架構(gòu)2.1 剝離 Chromium 后一個 UI 引擎剩下什么很多人聽到自研 UI 引擎會下意識覺得這是個大工程動輒要寫幾萬行代碼。實(shí)際上如果暫時(shí)放下瀏覽器那套巨獸體量一個面向桌面應(yīng)用的 UI 引擎只需要解決六個子問題窗口創(chuàng)建和消息循環(huán)——調(diào)用操作系統(tǒng)提供的原生窗口機(jī)制繪制圖元——在窗口客戶區(qū)輸出文字、矩形、線條、圖片輸入事件——把鼠標(biāo)、鍵盤、觸摸事件分發(fā)到具體控件布局計(jì)算——按規(guī)則算出每個控件的位置與尺寸控件樹與生命周期——組織界面結(jié)構(gòu)并管理重繪樣式與主題——讓控件長得不那么原生且保持一致性Electron 為了兼容所有網(wǎng)頁技術(shù)把每個子問題都做成了通用抽象代價(jià)就是體量爆炸。XchyUI 的做法恰恰相反按照桌面應(yīng)用的實(shí)際情況做最強(qiáng)約束??丶涫瞧胀ǖ?C# 對象樹布局只支持垂直流式、水平流式、絕對定位和表格定位樣式只有純色背景、邊框、字體、間距這些有限屬性。約束越多實(shí)現(xiàn)越簡單越容易做到極致體量。2.2 渲染層的選擇為什么不直接上 SkiaSharp做 C# UI 引擎第一個選型難題就是渲染后端。備選項(xiàng)無非幾個GDI、SkiaSharp、SharpDX/Direct2D、OpenGL。SkiaSharp 功能強(qiáng)大跨平臺文字渲染質(zhì)量高但它本身是一個相當(dāng)龐大的圖形庫原生部分加載進(jìn)進(jìn)程就占不少內(nèi)存包裝層也不小。再疊加微軟的字體管理系統(tǒng)和圖像解碼庫內(nèi)核體積很難保持在 200KB 量級。SharpDX/Direct2D 性能更好但它是原生 COM 接口的薄封裝使用難度大對象生命周期管理要非常小心哪怕一個 COM 引用釋放遺漏都可能引發(fā)直接的地址訪問錯誤比如 C# 調(diào)用 C 層時(shí)常見的 access violation c0000005。對于一個小內(nèi)核的項(xiàng)目引入這么厚的底層依賴性價(jià)比不高。XchyUI 最終選擇了 GDI 作為第一代渲染后端。理由很直接它吃內(nèi)存少調(diào)用鏈短C# 里用 System.Drawing 就能穩(wěn)定輸出文字和圖形。雖然 GDI 的渲染性能上限不如 Direct2D但是對于一個界面層操作遠(yuǎn)多于高頻動畫的桌面應(yīng)用來說60fps 的需求是一定滿足得了的——我后面會給出實(shí)測數(shù)據(jù)。提示這里有個常見誤區(qū)。很多人覺得 GDI 慢是因?yàn)槟盟ヤ秩菊敛粩嘧兓母邘视螒虍嬅?。對于普通表單和業(yè)務(wù)界面GDI 的真正瓶頸并不在繪制速度而在無腦整窗重繪。做好局部失效重繪之后性能完全夠用。2.3 消息循環(huán)與事件分發(fā)的最小實(shí)現(xiàn)Windows 應(yīng)用程序的窗口系統(tǒng)是一個消息驅(qū)動模型。鼠標(biāo)點(diǎn)擊、鍵盤輸入、窗口移動、尺寸變化Windows 都會把行為封裝成消息投遞到目標(biāo)窗口的消息隊(duì)列里。你的 UI 框架只要持續(xù)循環(huán)接收這些消息再轉(zhuǎn)成自己的事件就完成了事件分發(fā)。XchyUI 的消息循環(huán)是所有控件的心臟。它的基本結(jié)構(gòu)是一個 while 循環(huán)調(diào)用 Win32 的 GetMessage 取出消息TranslateMessage 做鍵盤按鍵翻譯再 DispatchMessage 把消息交還給窗口過程函數(shù)。窗口過程里XchyUI 收到 WM_PAINT 就觸發(fā)整體重繪收到鼠標(biāo)移動消息就把坐標(biāo)換算后交給命中測試邏輯從而找到這個點(diǎn)落在哪個控件上再把對應(yīng)的鼠標(biāo)事件派發(fā)給它。這里要強(qiáng)調(diào)的是消息循環(huán)和渲染循環(huán)的關(guān)系。XchyUI 并不是拿一個獨(dú)立的死循環(huán)去不斷刷幀。沒有界面變化時(shí)消息循環(huán)會阻塞在 GetMessage 上CPU 占用率幾乎降到零。只有當(dāng)消息到達(dá)、或者某段代碼顯式觸發(fā)重繪時(shí)才走一遍繪制流程。這種做法保證了百分百的省電和安靜也是桌面應(yīng)用該有的基本素養(yǎng)。2.4 布局引擎從坐標(biāo)計(jì)算到 Flex/Stack 布局Electron 里的布局是由 CSS 盒模型計(jì)算的瀏覽器為了一小段樣式要跑完整的計(jì)算鏈。XchyUI 不需要這套東西。我把它設(shè)計(jì)成了一套極簡的測量-安排兩階段布局流程。測量階段每個控件根據(jù)自己的內(nèi)容、字體和尺寸策略計(jì)算出理想大小。安排階段容器控件按照自己的布局規(guī)則把子控件逐個擺放到具體位置。最核心的容器是 StackLayout參數(shù)只有方向垂直或水平和間距Spacing沒有百分比、沒有媒體查詢。另一個是 GridLayout把可用區(qū)域按行和列切分對表格類界面特別實(shí)用。這兩下子看起來樸素的過分但實(shí)際用下來會發(fā)現(xiàn)桌面應(yīng)用 90% 的界面布局就是一行一行往下排加一個二維表格。自研引擎的最大好處就是你可以按照實(shí)際需求去砍功能而不必被通用方案拖累。3. 手把手構(gòu)建 XchyUI 跑道渲染循環(huán)、事件系統(tǒng)與組件封裝3.1 第一個可用的渲染循環(huán)先看一段最核心的代碼。這是 XchyUI 消息循環(huán)和渲染觸發(fā)的骨架去掉了一些邊界處理保留了主干邏輯。public sealed class XchyApplication { private readonly IntPtr _hwnd; private readonly ListControl _rootControls new(); private bool _dirty true; public void Run(Window mainWindow) { _hwnd mainWindow.Handle; mainWindow.Show(); while (true) { if (GetMessage(out var msg, IntPtr.Zero, 0, 0)) { TranslateMessage(ref msg); DispatchMessage(ref msg); } else { break; // 收到 WM_QUIT退出應(yīng)用 } if (_dirty) { RenderFrame(); _dirty false; } } } private void RenderFrame() { var buffer new Bitmap(WindowWidth, WindowHeight); using var g Graphics.FromImage(buffer); g.Clear(_backgroundBrush); // 先布局再繪制 LayoutEngine.Instance.Arrange( _rootControls, new Rect(0, 0, WindowWidth, WindowHeight)); foreach (var control in _rootControls) control.Draw(g); using var screen Graphics.FromHwnd(_hwnd); screen.DrawImageUnscaled(buffer, 0, 0); } }這里用了一個 內(nèi)存位圖 一次性拷貝 的雙緩沖思路。先在內(nèi)存里畫好整幀再一次性拷貝到窗口顯示區(qū)避免用戶看到撕裂的繪制過程。邏輯上整個渲染循環(huán)不就兩件事消息來了處理界面臟了重畫。消息循環(huán)負(fù)責(zé)響應(yīng)動作渲染循環(huán)負(fù)責(zé)呈現(xiàn)結(jié)果二者通過 _dirty 標(biāo)志位解耦不會出現(xiàn)事件處理時(shí)強(qiáng)插一個繪制的混亂局面。3.2 控件樹與命中測試的完整實(shí)現(xiàn)控件樹是 XchyUI 結(jié)構(gòu)上最重要的數(shù)據(jù)結(jié)構(gòu)。每個控件要么是葉子節(jié)點(diǎn)要么是內(nèi)部節(jié)點(diǎn)內(nèi)部節(jié)點(diǎn)負(fù)責(zé)持有子控件集合。結(jié)構(gòu)就是這么簡單。public abstract class Control { public string Name { get; set; } string.Empty; public Rect Bounds { get; set; } public bool Visible { get; set; } true; public bool Enabled { get; set; } true; public Control? Parent { get; internal set; } public ListControl Children { get; } new(); public void Add(Control child) { child.Parent this; Children.Add(child); } public virtual Size Measure() { // 子類根據(jù)內(nèi)容計(jì)算理想尺寸 return new Size(0, 0); } public virtual void Draw(Graphics g) { if (!Visible) return; foreach (var child in Children) child.Draw(g); } public virtual bool HitTest(Point p) { return Visible Enabled Bounds.Contains(p); } public virtual void OnMouseDown(Point location, MouseButton button) { } public virtual void OnMouseUp(Point location, MouseButton button) { } public virtual void OnMouseMove(Point location) { } internal virtual void RaiseMouseDown(Point location, MouseButton button) { // 深度優(yōu)先優(yōu)先把事件交給最后繪制、看起來在上層的子控件 for (var i Children.Count - 1; i 0; i--) { var child Children[i]; if (child.HitTest(location)) { child.RaiseMouseDown(location, button); return; } } OnMouseDown(location, button); } }命中測試的規(guī)則也很直接收到鼠標(biāo)點(diǎn)擊坐標(biāo)后從控件樹的最末端節(jié)點(diǎn)往根節(jié)點(diǎn)走誰的面積覆蓋了這個點(diǎn)就把事件給誰。因?yàn)樽詈罄L制的控件視覺上在最前面所以按子控件列表的倒序去檢查第一個命中的就是用戶真正想點(diǎn)的那個控件。這套機(jī)制雖然樸素但已經(jīng)足夠在按鈕、列表項(xiàng)、樹節(jié)點(diǎn)之間做出正確的事件路由。3.3 組件庫封裝Button、TextBox、List 的設(shè)計(jì)思路有了控件樹和事件路由接下來就是封裝具體控件。以一個最簡單的 Button 為例它需要處理三種視覺狀態(tài)普通、懸停、按下每種狀態(tài)對應(yīng)不同的背景色。繪制時(shí)根據(jù)狀態(tài)填充圓角矩形再居中繪制文字。XchyUI 中按鈕的實(shí)現(xiàn)大概只有 100 行但它完整覆蓋了外觀表現(xiàn)和交互反饋。TextBox 復(fù)雜一些。它要管理插入符位置、支持響應(yīng)鍵盤輸入、處理光標(biāo)閃爍、支持選中區(qū)域的反白顯示。早期版本我直接在控件內(nèi)部用一個普通的 TextBox 成員變量去承接輸入后來發(fā)現(xiàn)這會造成 WinForms 控件的全權(quán)耦合最后改用純 GDI 繪制文本和插入符自己實(shí)現(xiàn)鍵盤字符替換邏輯。這樣既減少了外部依賴也讓控件體積和渲染可控性更好。List 是另一個高頻組件。我最初實(shí)現(xiàn)的是全部可見項(xiàng)逐一繪制的樸素版本。支持 10 個、20 個條目沒問題但條目一旦達(dá)到幾千個逐一繪制就會拖慢每幀速度。最終采用了虛擬化方案只繪制出現(xiàn)在可視區(qū)域內(nèi)的那幾十個條目。這個優(yōu)化屬于 UI 引擎常見的基礎(chǔ)設(shè)計(jì)但對性能的提升是立竿見影的。3.4 局部失效區(qū)域優(yōu)化不做無腦全窗重繪自研引擎最容易被忽視的一個細(xì)節(jié)是哪些區(qū)域需要重繪。一開始我也是最簡單的辦法控件 Event 觸發(fā)任何變化就設(shè) _dirtytrue然后整窗口重畫。這在控件少時(shí)無所謂窗口大了或者控件多了無謂的整窗繪制會直接影響幀率。XchyUI 最終實(shí)現(xiàn)了區(qū)域失效機(jī)制。每個控件維護(hù)一個 IsDirty 標(biāo)記父容器負(fù)責(zé)把子控件的臟區(qū)域合并成一個或多個矩形區(qū)域記錄到 _invalidRegions 集合。RenderFrame 時(shí)只對這些矩形區(qū)域做裁剪繪制最后用 DrawImageUnscaled 配合 Graphics 的 SetClip 把對應(yīng)部分拷貝到窗口上。這樣高頻改動的小控件不會再拖累整個窗口的重繪。提示實(shí)現(xiàn)局部失效的復(fù)雜度會明顯上升因?yàn)椴眉魠^(qū)域、控件交疊、縮放變換都要處理。如果項(xiàng)目第一版趕進(jìn)度建議還是先整窗重繪把功能跑通之后再用特性分支去升級局部失效。性能優(yōu)化永遠(yuǎn)不要發(fā)生在需求還沒穩(wěn)定的階段。4. 性能驗(yàn)證與真實(shí)數(shù)據(jù)怎樣才算秒殺4.1 1000 控件壓力測試的實(shí)測數(shù)據(jù)我拿一個真實(shí)場景做了壓力測試窗體里有 1000 個自定義卡片控件每個卡片包含一個標(biāo)題、一行描述、一個圖標(biāo)區(qū)域。分別測量了靜態(tài)界面無交互時(shí)的幀率、滾動列表時(shí)的事件處理吞吐量、以及內(nèi)存占用。用 XchyUI 跑這套界面靜態(tài)幀率穩(wěn)定在 60fps觸發(fā)滾動和點(diǎn)擊時(shí)幀耗時(shí)幾乎恒定在 14ms 左右CPU 占用率在無交互時(shí)是 0.4% 以下持續(xù)滾動的峰值也只有 15%。同樣的界面我用 Electron 做了一版對照靜態(tài)內(nèi)存大約 260MB高速滾動時(shí)幀率會出現(xiàn)明顯下降到 40fps 以下CPU 峰值可達(dá) 45%。差距的主要來源是 Electron 每一次滾動都要經(jīng)過 DOM 樹更新、樣式重算和瀏覽器合成而 XchyUI 只是在畫布上把卡片新位置繪制一遍。4.2 內(nèi)存與啟動時(shí)間的可復(fù)現(xiàn)測試方法性能對比不能只憑體感要有一套可復(fù)現(xiàn)的測量方法。在 XchyUI 里我做了這樣三個測試步驟任何人都可以直接抄走啟動耗時(shí)從進(jìn)程啟動開始計(jì)時(shí)到主窗口完成第一幀繪制結(jié)束。用 Stopwatch 包裹 Main 函數(shù)入口之后到 Run 函數(shù)進(jìn)入首輪 RenderFrame 完成的位置多次取中位數(shù)。內(nèi)存占用用 GC.GetTotalMemory(false) 做增量測量判斷托管堆增長情況再用 Process.WorkingSet64 觀察進(jìn)程整體的工作集。后者受 .NET 運(yùn)行時(shí)預(yù)熱影響較大最好在運(yùn)行 30 秒、各項(xiàng)功能點(diǎn)過一遍之后再讀數(shù)。滾動流暢度維護(hù)一個固定長度的幀耗時(shí)隊(duì)列在滾動循環(huán)里每次 SwapBuffer 后記錄耗時(shí)統(tǒng)計(jì) P9595 分位值。如果 P95 低于 16ms基本可以認(rèn)定在普通 60Hz 屏幕上是流暢的。按照這套方法實(shí)測下來的結(jié)果前面已經(jīng)列了這里再補(bǔ)一個最有說服力的對比同一個業(yè)務(wù)流程從點(diǎn)擊按鈕到界面完成刷新XchyUI 的平均時(shí)間是 9msElectron 大約是 87ms。這個差異在業(yè)務(wù)界面上直接體感就是秒開和輕微遲滯的區(qū)別。4.3 XchyUI、Electron、WPF 的橫向?qū)φ罩笜?biāo)XchyUIElectronWPFUI 層程序集體積約 200KB瀏覽器內(nèi)核約 150MB框架約 3MB完整安裝包體積約 35MB含 .NET 運(yùn)行時(shí)普遍 150MB~250MB約 50MB 起啟動到首幀時(shí)間0.1~0.2s1.5~3s0.2~0.4s靜態(tài)內(nèi)存占用簡單窗口40~60MB150~300MB80~120MB渲染原理GDI可選后端升級Chromium 合成器DirectX 合成器跨平臺計(jì)劃中三平臺全覆蓋僅 Windows前端生態(tài)可用性無完整極弱這張表格不是為了貶低 Electron 和 WPF而是想說明不同技術(shù)棧的本質(zhì)差異Electron 用一個完整的瀏覽器內(nèi)核來解決通用問題WPF 用一個龐大的框架體系來解決富媒體表現(xiàn)問題而 XchyUI 是定義問題邊界之后做減法的產(chǎn)物。三種方案適合三種不同訴求關(guān)鍵是看清楚你的訴求是什么。4.4 高 DPI、字體渲染、線程調(diào)度等細(xì)節(jié)坑在測試和真實(shí)使用中有幾個細(xì)節(jié)會讓結(jié)果出現(xiàn)劇烈波動必須單獨(dú)說。高 DPI 是第一大坑。如果進(jìn)程沒有正確聲明 DPI 感知Windows 會把你的窗口自動縮放導(dǎo)致所有坐標(biāo)比例錯亂畫面模糊點(diǎn)擊區(qū)域?qū)Σ簧?。我最終把清單里的 dpiAwareness 設(shè)成了 PerMonitorV2再用 QueryDpiAwareness 做運(yùn)行時(shí)檢測。這套處理做完在 125%、150% 縮放環(huán)境下窗口和對齊才是正確的。字體是第二大坑。GDI 的文本渲染在默認(rèn)字體下會有明顯的鋸齒中文尤其容易發(fā)虛。我的經(jīng)驗(yàn)是優(yōu)先使用微軟雅黑并開啟 TextRenderingHint.ClearTypeGridFit同時(shí)對字體做一次 Fallback 鏈——微軟雅黑 → 宋體 → 系統(tǒng)默認(rèn)字體。這樣即便目標(biāo)機(jī)器沒有安裝微軟雅黑中文也不會變成方塊。線程調(diào)度是第三大坑。所有 UI 相關(guān)的繪制和控件屬性更新必須發(fā)生在創(chuàng)建窗口的同一個線程上。如果在后臺線程直接改控件坐標(biāo)或者觸發(fā)重繪輕則閃爍重則直接崩潰典型的 access violation c0000005 就是這么來的C# 層訪問了已被釋放的 GDI 對象。XchyUI 內(nèi)部做了一個簡單的 Dispatcher 封裝所有外部更新請求統(tǒng)一通過 PostMessage 投遞到 UI 線程執(zhí)行。5. 實(shí)戰(zhàn)記錄從 Web 套殼遷移到 XchyUI 的完整過程5.1 遷移前的架構(gòu)評估與組件盤點(diǎn)如果你現(xiàn)在也想做類似的遷移第一個建議是不要急著寫代碼先盤需求。我把原有應(yīng)用里的界面元素逐個列成清單按鈕、輸入框、下拉框、表格、樹、彈窗、消息條、自定義繪圖面板、右鍵菜單。然后逐個評估XchyUI 現(xiàn)成有沒有、需要新寫、需要改設(shè)計(jì)。最終結(jié)論是 60% 的控件可以直接復(fù)用25% 需要少量定制15% 需要重寫思路。這個評估過程還有個額外收益它會逼著你去砍那些看起來挺炫但沒人用的界面裝飾。脫離 Web 生態(tài)后很多花里胡哨的動效自然就不做了產(chǎn)品反而更聚焦。另一個重要決策是數(shù)據(jù)綁定。Web 套殼的前端框架都有響應(yīng)式綁定XchyUI 一開始沒有設(shè)計(jì)這套東西。我的過渡方案是控件數(shù)據(jù)源 刷新接口每個復(fù)雜控件持有一個數(shù)據(jù)源列表數(shù)據(jù)變化時(shí)調(diào)用控件的 Refresh()控件在內(nèi)部重新讀取數(shù)據(jù)并標(biāo)記臟區(qū)域。這個模式寫起來比響應(yīng)式綁定繁瑣但邏輯鏈路很短排查問題很容易。數(shù)據(jù)頻率不高的場景下這種寫法完全夠了。數(shù)據(jù)綁定決策還影響了一個核心數(shù)據(jù)結(jié)構(gòu)。從 Web 套殼遷移到一個內(nèi)聚框架最大的區(qū)別就是所有狀態(tài)有且僅有一個權(quán)威來源。Web 時(shí)代可能 Model 一套、DOM 一套、狀態(tài)管理再存一份XchyUI 只認(rèn) C# 對象里的字段。別小看這個約束它直接解決了大量數(shù)據(jù)不同步的舊 Bug。5.2 自定義主題系統(tǒng)與樣式處理Web 套殼里改樣式是頻率很高的操作。自研引擎如果讓每個控件把顏色、字體寫死團(tuán)隊(duì)迭代起來會非常痛苦。我做了一個極簡主題系統(tǒng)主題是一個 Theme 對象里面有背景色、前景色、邊框色、按鈕不同狀態(tài)的顏色、字體名稱和尺寸、間距常量等若干字段。所有控件在繪制時(shí)只從當(dāng)前主題讀取顏色不硬編碼。切換主題只需要換一個 Theme 實(shí)例然后全窗標(biāo)記重繪。因?yàn)?GDI 里繪制矩形和文字的成本極低哪怕是整窗重繪也能在幾毫秒內(nèi)完成主題切換這個平時(shí)最容易卡出掉幀的操作反而成了 XchyUI 最具表現(xiàn)力的功能之一。5.3 常見問題排查速查表現(xiàn)象可能原因排查思路與解決動作窗口渲染為空白重繪時(shí)機(jī)被漏掉WM_PAINT 沒有觸發(fā)布爾標(biāo)記檢查 Invalidate 是否真的調(diào)用了確認(rèn)渲染代碼是否在 UI 線程執(zhí)行點(diǎn)擊控件沒有反應(yīng)消息循環(huán)被阻塞或者命中測試順序錯誤檢查事件處理里是否有 Sleep/耗時(shí)操作打印鼠標(biāo)坐標(biāo)和控件 Bounds 對比文字發(fā)虛、有鋸齒GDI 默認(rèn)渲染模式不對設(shè)置 Graphics.TextRenderingHint ClearTypeGridFit中文顯示方塊字體 Fallback 缺失配置字體鏈優(yōu)先用系統(tǒng)自帶的微軟雅黑高 DPI 下坐標(biāo)全亂進(jìn)程沒聲明 DPI 感知修改 manifest 設(shè)置 PerMonitorV2并動態(tài)查詢 DPI內(nèi)存緩慢上漲每次繪制創(chuàng)建了 Bitmap 未釋放或者事件沒有解綁用 Dispose 模式管理 Bitmap檢查控件樹移除時(shí)是否清理事件引用后臺線程 Crash跨線程操作 UI 控件統(tǒng)一走 Dispatcher不要直接訪問控件屬性5.4 打包發(fā)布與裁剪策略XchyUI 項(xiàng)目的目標(biāo)是小打包環(huán)節(jié)也要堅(jiān)持這個思路。首先確保所有用不到的程序集不進(jìn)發(fā)布目錄。然后使用 .NET 的 single-file publish 把所有托管程序集打成一個文件這是最直觀的體積削減。之后經(jīng)過 ILLink 裁剪把沒有被引用的框架代碼從最后的產(chǎn)物里移除。這里有個值得注意的細(xì)節(jié)ILLink 裁剪雖然能縮小體積但它對反射破壞非常敏感。如果代碼里用了 Type.GetType 或者反射調(diào)用必須給對應(yīng)的程序集標(biāo)記 DynamicDependency否則運(yùn)行時(shí)會直接 TypeNotFound。我在 XchyUI 的早期版本就踩過這個坑上線測試時(shí)控件創(chuàng)建報(bào)了一大堆反射錯誤最后是把加載邏輯改成顯式注冊表才繞開反射機(jī)制的不確定性。發(fā)布時(shí)還要保留 PDB 文件。自研引擎沒有成熟的崩潰上報(bào)體系如果你連符號文件都沒有用戶那邊報(bào)一個 access violation 你根本沒法定位。PDB 加上 Windows 事件日志里捕獲到的異常堆棧是排查崩潰類問題最重要的兩張底牌。6. 下一步值得探索的方向6.1 跨平臺與國產(chǎn)化適配XchyUI 目前以 Windows 為主但架構(gòu)上沒有把非 Windows 的路堵死。核心的控件樹、布局引擎、事件路由邏輯全部用純 C# 實(shí)現(xiàn)不依賴任何 Windows 程序集。只有最底層的創(chuàng)建窗口 消息循環(huán) 圖形上下文這一層與平臺相關(guān)我把它隔離成了 IPlatformBackend 接口。如果后續(xù)要支持 Linux可以在 XLib/Wayland 上實(shí)現(xiàn)這個接口macOS 則走 Cocoa國產(chǎn)化環(huán)境的難點(diǎn)主要在 CPU 架構(gòu)而非操作系統(tǒng)——大部分國產(chǎn)系統(tǒng)本身就是 Linux 內(nèi)核但指令集可能是 ARM 或者龍芯的 LoongArch。.NET 官方已經(jīng)支持多種架構(gòu)的 Linux 發(fā)布理論上只要 IPlatformBackend 的接口實(shí)現(xiàn)能正常編譯整套 UI 引擎就能在這些平臺上跑起來。這條路我還沒有完整走通現(xiàn)階段只能算一個方向但它讓 XchyUI 擁有一個比 Electron 輕量得多的跨平臺想象空間。6.2 渲染后端升級路線SkiaSharp、SharpDX 都只是備選GDI 作為第一代渲染后端確實(shí)簡單穩(wěn)定但它的抗鋸齒質(zhì)量、圖形變換能力、復(fù)雜路徑填充效果都存在上限。后續(xù)如果要支持更細(xì)膩的圓角陰影、漸變、變換動畫就需要考慮更強(qiáng)大的渲染后端。我的規(guī)劃不是立刻替換而是先把渲染層抽象成 ICanvas 接口GDI 只是其中一個實(shí)現(xiàn)。然后可以逐步添加 SkiaSharpCanvas、SharpDXCanvas 這些實(shí)現(xiàn)并且針對不同后端去做性能對比。這里的關(guān)鍵是渲染后端可以換但控件樹結(jié)構(gòu)、布局引擎、事件系統(tǒng)絕不能因?yàn)閾Q后端而重寫。接口隔離的意義就在于讓變化局限在最小范圍內(nèi)。注意追加渲染后端要考慮的不僅是代碼工作量還有體量變化。SkiaSharp 的原生庫會拉高內(nèi)核體積SharpDX 的 COM 對象生命周期也要投入不少精力。收益與代價(jià)需要反復(fù)權(quán)衡別為了營造技術(shù)很牛的感覺去堆疊依賴。6.3 開源計(jì)劃與社區(qū)共建XchyUI 現(xiàn)在處于自用順手、開源需整理的狀態(tài)。如果要開源許可證我會選 MIT 或者 Apache-2.0并且會整理出三類倉庫內(nèi)容核心引擎、組件庫、示例模板。社區(qū)共建的價(jià)值在于可以讓更多從業(yè)者幫忙補(bǔ)齊真實(shí)場景里的邊界情況——不同輸入法、不同顯卡驅(qū)動、不同企業(yè)安全軟件的兼容性這些問題永遠(yuǎn)只能靠足夠多的真實(shí)場景暴露出來。我還沒有確定開源的具體時(shí)間表但可以確定的是即使不開源我也會持續(xù)把 XchyUI 用于自己的實(shí)際項(xiàng)目讓它保持小而鋒利的特點(diǎn)而不是膨脹成一個誰都不需要的通用框架。最后分享一點(diǎn)個人體會。整個遷移過程中我最深的感受不是Electron 不好而是技術(shù)選型要對齊真實(shí)約束。如果你的產(chǎn)品身處資源受限環(huán)境或者用戶對啟動速度和內(nèi)存占用極其敏感那 Electron 這套技術(shù)棧的底層代價(jià)就會壓得你很難受。自研引擎的價(jià)值不在于標(biāo)榜我不用 Electron而在于它逼著你去理解 UI 是怎么工作的——一個按鈕從點(diǎn)擊到屏幕反饋經(jīng)歷哪些環(huán)節(jié)、一次滾動如何保證不卡、一個窗體如何做到秒開。這些理解在任何技術(shù)棧里都不會浪費(fèi)。不要被性能焦慮綁架更不要被工具路徑綁架——輕量自有輕量的價(jià)值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
少妇人妻丰满做爰XXX| 久久青青日本视频| 秋霞AV淫| 狠狠爱综合网| 国产SUV精品一区二区883| 婷婷五月激情四月综合 | 99热欧美| 刘玥精品一区| 91成人看片| 五月婷婷深深爱爱| 五月婷婷性爱视频| 亚洲成人网站在线观看| 丁香五月六月综合欧美| 激情五月婷婷免费视频| 日本www免费九九| 丁香色五月天| 亚州激情网站无码| 六月丁香停| 99啪99| 日韩人妻无码专区| 激情丁香五月婷婷啪啪| 99小精品| 五月天六月天| 99ri久久| 激情超碰网| 久婷五月| 米奇影视五月天| 欧日韩成人| 九九色情网五月天| 色丁香五月婷婷综合久久| 白人荫道BBWBBB大荫道| 六月激情婷婷| 天天拍天天操| 综合性爱网| 国内婷婷丁香社区在线播放| 中文字幕在线日亚洲9| 丁香六月婷婷色XXXX| 色五月丁香婷婷| 久久99最新| 99ri精品视频在线观看| 超级碰碰碰碰视频| 久久综合久色欧美综合狠狠| 婷婷综合| 五月婷婷三级| 五月婷丁香| 就爱啪啪婷婷| 99色色网站| 婷婷激情伍月网| 丁香八月综合激情| 95精品区一区二| 久久视频婷婷视频| 日韩欧美成人片| 婷婷五月成人| 国产免费一区二区三区三州老师F1F1.CC | 国产av天堂| 狠狠操狠狠干综合| 影视av久久久噜噜噜噜噜三级| 五月丁香六月婷精品视频| 欧美婷婷六月丁香综合色| 色婷婷狠狠18禁| 美女黄频aⅴ视频| 超碰九九热| 日韩AV在线免费| 精品亚洲国产成AV人片传媒| 久久一品区| 五月婷婷涩涩爱| 五月天婷婷丁香人人操91| 中文字幕,综合,91| 久草A片| peg 2区三区四区的| 五月天激情av| 99自拍视频在线| 大香蕉综合| 激情久久肏屄视频| 色综合久久88色综合天天看| 五月开心激情| 五月丁香六月婷| 亚洲日本韩国| 色五月激情| 五月天丁香六月综合| 开心六月婷| 97色五月天| 婷婷十月激情综合网| 天天更新天天亚洲| 九九在线这里只有精品视频 | 欧美日韩欧美| 97干在线播放| 99精品国产在热久久| 日本婷久久| 精品色情一区二区三区四区| 婷婷五月天另类网站| 99热在线观看精品免费| 婷婷久久综合| 91a片爽| 丁香婷婷五月天成人| 99干免费视频| 亚洲综合激情五月久久| 开心五月丁香综合久久| 91色噜噜狠狠狠狠色综合| 久久久久人妻网址| 春色激情| 九九九九大香蕉| 碰人人操| 激情综合五月激情| 无码区婷婷五月花开| 丰满人妻妇伦又伦精品国产| 激情五月综合色| 色婷五月天激情| 五月天激情婷婷久久| 婷婷综合在线| 无语停婷丁香网| 嫩草视频观看| 99热免费精品| 婷婷碰碰| 99re热久久| 美英法精品无码免费视频| 五月天婷a| 99精品国产热久久91色欲| 3p九色在线| 色5月婷婷| 日韩AV大全| 99性爱| 三级99热| 在线观看玖玖资源免费观看| 久久久久婷| 99色综合网| 激情综合五月丁香六月婷婷| 六月丁香婷婷在线波多| 日日天天干| 丁香久月| 五月天.com| 五月天播播| av网站免费在线| 激情婷婷内射| 丁香五月性| 操逼亚洲天堂| 色五开心五月五月深深爱| 丁香五月婷婷亚洲综合精品| 91狼友视频网页更新| 99久热| 婷婷久久五月天丁香| 婷婷九月丁香中文| 色五月五月婷婷| 亚洲传媒在线观看| 天天干天天日天天操| 婷婷综合天堂| 婷婷五月天综合久久| 五月天婷婷AV| 成人AV在线电影| 色五月婷婷在线| 亚洲天堂色色| 9久热视频| 精品51XX| 亚洲五月天婷婷| 色婷婷五月天激情综合| 久久五月综合| 思思热99在线视频| 久婷婷色| 国产肥白大熟妇BBBB视频| 色玖玖玖| 久久国产色| 开心五月婷婷五月| www.seqingwuyuetian| 国产精品噜噜在线视频| 日本三日本三级少妇三级66| 日日爽日日爽| 7超碰自拍| 五月天婷婷在线AN| 五月天婷婷色小说| 99在线视频免费| 中文字幕av久久爽一区| 丁香五月色综合色播五月| 国产69久久久欧美黑人A片| 亚洲五月天狠狠| 亚洲综合色网| 五月色丁香成人| 激情文学综合婷婷五月天丁香花| 狠狠久综合| 狼人伊人干| 六月丁香网| 日本3级片偷拍网站| 综合网色| 亚洲va在线∨a天堂va欧美va| 九九九九九九毛片| 农村熟妇高潮精品A片| 综合亚洲六月婷婷在线| 欧美人人草草| 天天做天天爽| 五月婷婷六月色| 99色热| 日韩av变天就操逼不卡区| 色五月天综合网| 在线观看中文字幕亚洲| 久99婷婷色综合| 久操97| 99热6这里只有精品6| 亚洲中文字幕在线电影| 激情综合五月| 久久色情| 天天天干夜夜夜操| 五月婷婷综合色啪首页| 激情四射五月天| 日碰日| 蜜臀av粉嫩av懂色av| 婷婷5月色| 色婷婷女优有码五月亭| 亚洲成人在线观看av| 97色热| 婷婷狠狠五月综合| caopeng超碰| 老师把我爽高潮了免费A片| 五月天激情综合网| 五月丁香啪啪啪啪| 欧美婷婷五月天| 久久五月天婷婷视频| 欧在线一区| 色婷网| 狠狠五月天| 色9色| 五月天停停日日| 97精品人人A片免费看| 精品99在线| 79成人网| 色欲五月天| 狠狠色丁香久久久婷| 青青999| 天天射综合网站| ss视频xx91| 成人婷婷色五月天| 99亚洲综合| 99ri在线播放| 日本高清久| 亚洲V国产V欧美V久久久久久| 丁香婷婷91在线观看视频| 久久久久久丁香五月| 国产五月天婷婷| 草榴成人影片| 丁香五月天亚洲综合| 午夜无码熟熟妇丰满人妻 | 丁香五月婷久久| 开心激情婷婷| 99精品无码| 亚洲精品国产精品乱码不99| 激情五月www| 在线色五月婷婷| 3p久久| 激情文学 综合 九月| 伊人九热| 国产精品成人网站| av最新在线| 五月香蕉网| 色九九九综合| 夜夜躁婷婷AV| 欧美丁香五月| yellow视频在线观看91| 婷婷香蕉| 九九久久99| 久久成人综合五月天| 天插天啪天啪天啪| 欧美天堂婷婷日韩| 九九九激情网| 日亚二欧美| 精品九九网| 色色色色区| 亚洲免费在线观看岛国| 婷婷五月丁香综合| 欧美色播综合在线观看| 久久99热在线观看| 丁香五月自拍| 被男人添B超爽视频| 极品人妻VIDEOSSS人妻 | www.91热久久| 色综合视频| 91丨九色丨白浆| 中文色婷婷| 五月丁香婷婷啪啪| 天天色天天噜| 美欧成人视频| 九热免费视频| 禁欲电影完整版在线播放| 国产五月视频| 久草狼人| 第四色婷婷色五月| www.日本91| 五月亭亭六月天| 免费视频WWW在线观看网站| 丁香婷婷九月在线| 激情久久久久久久久久久| 婷婷丁香五月麻豆| 91丨九色丨老熟女激情| 色99色| 亚州精品色情无码A片| 国产精品久久在线观看技巧| 99视频| WWW,五月| 天天综合91入口| 亚洲综合99| 六月婷婷狠狠做| 亚洲五月天激情| 日本99视频| 五月婷婷久久网| 99在线视频资源| 五月天播播综合| 激情五月婷婷五月| 97久久人人人干| 日本情色一区二区| www.十八禁不禁AV.com| 久久99综合| 天天草天天爽| 91打屁股视频网站| 丁香六月色婷婷| 丁香成人五月天| 久久天堂女人| 五月色俺婷婷| 丁香五月综合| 婷婷综合| 久久久久久综合88| 2015超碰| 五月丁香六月婷婷综合网站 | 色婷婷五月天久久| 99久操视频| 久久久九九视频精品18| 艾小青av| 国产69久久久欧美黑人A片| 99热天堂| 99激情| 九九草热在线观看| 天天操天天日天天操| 97碰碰视频在线观看| 日韩熟女啪啪视频| 五月丁香婷婷人体| 91人久| 婷婷五月在线免费| 久久丁香五月婷婷| 秋霞A V毛片| 五月亭亭直播| 五月婷婷黄色毛片| 亚洲成人五月天| 99原创自拍视频在线观看| 九九av| 婷婷激情在线| 婷婷月综合| 狠狠干夜夜干| 91人碰| 婷婷五月天无码| 夜色.cnm| 激情五月影院| 欧美、日韩、中文、制服、人妻| 欧美激情五月天| 97偷拍在线视频| 天天爽综合网| 男人天堂 久久| 思思热久久婷婷五月天| 丁香五月色激情| 五月天黄色激情小说| 亚洲乱码日产精品BD在线观看| 久久97| 99自拍视频在线观看| 9l视频自拍9l视频自拍九色学生| 超碰女人天堂| 狠狠色噜噜狠狠色噜噜噜999| 午夜天堂啪啪| AAAA亚洲| 色综合网页| 五月婷婷丁香瑟瑟视频| 97热九九| 亚洲成人免费电影| aa久久| 亚洲视频二区| 色噜噜伊人| 成人做爰高潮A片免费视频| 99热国产这里只有| 久久久久久99日本| 天天插天天插| 99热99成人| 99这里只有精品| 婷婷久久六月天| 97久久久久久久久久久| 五月天偷拍| 91大神操美女| 搡BBBB搡BBB搡18 | 色五月丁香五月| 超碰无码318604| 黄色五月婷婷| 亚洲五月丁| 色五月六月| 人人操人人看97干| 欧美精品999| 欧美天天干五月丁香| 激情五月婷婷综合网| 婷婷丁香成人五月天| 91视频人人做97| 99九九视频| 襙逼网| 五月天婷婷色情| 少妇高潮一区二区三区99欧美| 婷婷 久综合| 任你搞免费视频观看| 噜噜国产| 丁香亚洲婷婷五月| 大香蕉久| 97操碰日本女人| 婷婷四色五月| www.99成人视频| 亚洲AV网址| 丰满少妇猛烈A片免费看观看 | 色欲婷婷夜夜| 99热费观看| 国产精品美女| 丁香五月综合激情啪啪| 五月天激情婷婷小说| 亚洲AV网址| 在线播放人妻| 五月丁香综合激情| 互月天综合| 五月天婷婷爱| 久777| 丁香色婷婷| 久久99性爱视频| 激情丁香婷婷六月天| 亚洲色区17| 五月婷婷色色| 色五月婷婷丁香五月| 五月婷婷综合久久| 色婷五月天网站| 中文字幕不卡+婷婷五月| 在线不卡AC| 五月丁香啪啪网| 人妻久久婷婷| 激情五月影院| 婷婷夜夜操| 五月丁香婷婷六月| 激情五月激情综合俺也去婷婷小说| 久久五月婷| 东北婷婷五月天| 久热伊人| 91热在线| 五月婷婷丁香六月| 禁片二区| 中文AV网站| 97人人草| 91狠狠综合久久久| 六月激情网| 成人一级片| 丁香五月区| 亚洲精品久久久久久久久久吃药| 99热欧| 91精品久久久久久| 五月久熟女| 国产永久一黄| 久久精品日| 青青久久五月天丁香婷婷| 另类少妇人与禽zOZZ0性伦| 99热99极品观看| 26UUU欧美| www.色擼擼.com| 六月婷婷影院| 五月婷婷天| 五月天激情Av| 热这里| 思99热精品久久只有精品| site:esunnet.com| 久久99久久久| 99亚洲精品视频| 91久久国产综合久久| 亚洲av另类在线观看| AⅤ网站在线看| 久久五月婷6 9| www,婷婷,com| 午夜成人在线免费视频| AV操逼网| 五月丁香怕啪啪| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 色99欧洲色19| 九九热最新地址| 五月婷婷天天| 91日本在线观看| 色色色色色色网| 色吧综合网| 9精品久久999| 欧美激情伊人| 久久久人妻人伦| 九九热只有精品6| 狠狠操狠狠狠| 深爱五月婷婷| 天天激情站| 精品一二三区久久AAA片| 99re热视频这里只精品| 大香久久伊人网| 综激情网| 五月综亚洲| 天天色激情| 国产激情av| 日本99久久| 大香蕉久久视频久久视频 | 亚洲操操操| 色呦精品| 99热免费精品| 久热这里只有精品66| 色噜噜狠狠色综合日日| 色999五月色| 色婷婷色综合久久精品V| 午夜av网| 综合激情五月丁香9999久久精| 男女久久婷婷五月天| 99这里| 日日操日日撸| 中文字幕黄色电影网址| 国产日批视频| 先锋资源91| 无码日本精品XXXXXXXXX | 五月婷婷亚洲综合在线| 丁香五月综合色婷婷| 五月丁香婷婷激情澎湃四射| 五月天综合视频| 婷婷干| 狠狠色婷婷7777久| 丁香五月婷婷香| 亚洲精品亚洲人成人网| 亚洲免费观看高清完整版AV线| 开心亚洲久久开心| 97操视频| 久久38视频| 五月伊人综合| 大香蕉99| 99久热精品在线| 伊人天天色| 91在线日| 亚洲天堂大香蕉| 99re思思精品在线观看| 色婷婷久久| 99伊人性爱在线影院| 久久婷婷五月综合色播| 色综合天天综合成人网| 91黄操| 婷婷综合五月天亚洲综合| 久久久久久久人妻| 久久99热这里只有精品首| 深爱激情综合| 五月色婷婷夜色| 婷婷综合五月激情| www.超碰在线| 玖玖国产视频一区| 久久久18| aa久久| www.日本91| 大香蕉懂9| 伊人婷婷五月| 最近免费中文字幕大全高清大全1| 六月婷婷av| 开心激情站| 九九视频在线观看视频在线播放69| 五月婷婷色播网| 久热免费视频| 99热热九九| 五月丁香影视| 丁香婷婷人妻| 亚洲五月天激情| 六月色婷婷色| 亚洲精品99| 伊人婷婷五月天| 91丨九色丨高潮丰满日本| 久久久27操| 婷婷中文字幕网| 色五月大| 97视频久久| 丁香五月手机在线| 日日干天天爽| 热久久思思热思思| 专区无日本视频高清8| 日本色婷婷五月天成人电影| 国产人妻777人伦精品HD| 青青草a在线| 日本人妻伦在线中文字幕| 亚洲视频在线观看99| 久久婷婷五月天| 色五月丁香激情| 射婷婷中文字幕| 这里只有精品69| 91伦| 中文资源在线a| 91热99| www久| 停停色综合伊人| 色一色综合| 婷婷情色激情| 色婷婷成人网| 中文字幕日产A片在线看| 天天草天天日| 九九大香蕉黄色影院| 国产9色在线/日韩| 五月婷久久| 碰碰碰碰碰99| 欧美人妻一区二区| 婷婷丁香基地在线| 另类激情五| 五月激情天| 五月天婷婷丁香蜜桃91| www99xxxx五月丁| 操操国产| 天天综合天天玩夜夜玩天天玩夜夜玩 | 亚州综合色| 激情九月综合| 天天天摸夜夜夜玩| 九月丁香亭亭| WWW.亚洲无码| 综合色色婷婷| 九一99| 五月天堂色| 日韩在线看AV| 91精品久久久久久| anquye五月| 网色99| 婷婷丁香18| 91操片| 狠狠干五码| 精品99在线| 51精品国自产在线| 人人澡玖玖一| www激情com| 亚洲视频a| www.激情五月天.con| 欧美色频| 婷婷五月综合社区| 久久婷婷激情视频| 婷婷AV丁香| 9月色婷婷| 久久97久久99久久综合欧美| 色五月婷婷综合| 天天做天天爱天天玩夜夜爽| 久久久久久天天日天天爱| 国产精品A片在线| 亚洲激情综合| 草草视频91| 五月天色婷婷激情| 五月丁香婷中文字幕| 日本综合久久| 久久婷婷人人| 久久无意婷婷| 久久视9精| 五月丁香六月激情在线| 久久99久久99精品免观看粉嫩| 丁香网五月网| 丁香五月激情六月| 五月丁香久久网| 日本一级特黄大片AAAAA级| 日逼影音先锋男人资源站| www.色99| 九九热在线视频观看| 久久激情天堂| 日本色五月| 99热中文字幕久久| 五月丁香花激情综合网| 丁香六月天色婷婷| 天天综合永久| 婷婷五月精品在线| 五月丁香综合啪啪対白| 婷婷五月天国产手机在线视频观看| 婷婷色五月丁香六月欧美啪| 九九色播五月丁香| 五月丁香婷婷啪啪网| 色噜婷婷| 变态另类色图| 9 大屁股在线视频精品| 91婷婷丁香五月亚洲| 九月丁香婷婷基地| 婷婷六月偷拍| 91九色无码内射| 69人人操人人爽| 日韩av高清| 五月色丁香婷婷综合| 991自拍视频| 97碰碰免费.视频| 综合久久十三| 色九月丁香婷婷蜜桃在线观看| 五月天丁香色色| 99精品综合| 伊人影院久久网| 99久久.www| www.色九月| 99热大香蕉| 怕怕視頻| 激情五月婷婷在线区| 五月丁香六月婷婷a v| 五月婷婷色吧!| 99热在线观看免费| 99精品在线观看视频| 色日本综合| 99热精品在线| 国产精品美女久久久久AV超清 | 六月丁香婷婷五月天| 久久精品国产色| 99视频在线观看欧| 真实亲子乱子伦高清在线观看| 欧美性爱五月天| 在线成人网址| 久久香蕉网| 性爱激情五月| 婷婷五月丁香欧洲| 九九热这里有精品视频| 婷婷五月中文字幕| 色婷婷手机在线| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 九九色99| 五月婷婷干| 99热这里有精品| 五月丁香| 色欲久久99精品久久久久久| 婷婷97碰碰| 丁香六月视频| 婷婷色片| 欧美精品中文字幕亚洲专区| 九色地址91视频| 婷婷五月亚洲激情| 五月天婷婷丁香社区| 大香蕉网站,大香蕉综合| 国产亚洲成AV人片在线观黄桃| 国内久久婷婷| 久久婷婷激情五月天一区二区| 婷婷五月天a| 97影院一级片| 婷婷狠狠综合网入口| 天天肏高清在线| 亭亭色天香| 五月色婷婷影院| 婷婷五月色播天| 激情AV| 丁香久久| 热91久| 这里只有精品视频222| 国产日韩亚洲欧美在线观看| 婷婷亚洲综合| 91肏| 婷婷五月天激情基地| 91热爆在线| 影音先锋91| 国模淫穴色图| 国产 码在线成人网站| 国产综合久久久777777| 色色色.com| 婷婷五月天亚洲| 最新AV在线观看| 丁香五月激情六月综合| 五月天婷婷激情小说电影| 日韩啪图| 五月天黄色激情小说| 超碰99热| 色五月大香蕉| 黄网免费观看| 国产午夜精品一区二区| 婷婷五月天欧美图片在线播放电驴| 亚洲五月天激情| 久热91精品| 日韩啊啊啊| 操b视频在线观看一区二区| 激情伊人六| 伊人婷婷五月天| 9久精品视频| 丁香五月情| 91日韩美女被插视频| 亚洲日韩欧美综合VA| 色婷婷丁香花五月天| 亚洲俩性性爱图片久久第六页| 成人午夜无码视频| 97在线综合| 激情99| 久久精品五月天| 色五月中文网| 在线看黄色| 五月六月丁香激情| 国产操逼网站| 开心激情五月天网| 色月丁| 天天五月天综合网址| 婷婷五月综合中文字幕| 女人天堂 AV| 日韩有码一区| 五月亭亭直播| 婷婷五月天亚洲综合| 天天插天天干| 九九热99免费视频| 色五月首页| 九九热这里只有精品首页| 五月开心久久| 丁香六月婷婷综合麻豆| 少妇人妻偷人精品无码视频新浪 | 丁香五月欧美| 99国产小视频免费观看| 国产精品A成V人在线播放| 五月天色婷婷视频| 色五月婷婷丁香凹凸| 丁香五月婷老师| 91色吧网| 五月天综合色| 欧美天天性| 婷婷久久女人| 日本久热| 色久在| 91在线观看九区| 99视频| 在线播放中文字幕| 桃色成人网| 99热这里只有精品最新网址| 色五月婷婷AV| 久久这里只精品| 五月天成人手机在线视频| 香蕉久久五月| 欧美日韩成人在线观看| 婷婷色五月婷婷姐妹| 蜜乳av一级av| 亚洲综合另类| 在线,国产,色,热视频| 9视频在线成人网站| 少妇人妻人伦A片| 日本一级一级一级一级| 丁香五月婷婷欧美性爱| 99免费在线视频| 天天操夜夜爽天天操| 五月天操逼激情| 日本狠狠干| 99热在这里只有免费精品| 日韩AV在线免费| www.婷婷| 日韩精品无码99| 翔田千里 50岁 无码| 熟妇人妻中文字幕无码老熟妇| 丁香五月婷久久| 丁香五月精品视频| 中文字幕成人日韩| 99热97| 婷婷激情五月天激情| 九九九九国产| 五月天婷婷Av| 五月婷婷综合在线| 色 色 色综合com| 激情婷婷五月女| 丁香色影院| 人妻久久久| 大天天伊人| 丁香五月在线视频黑人| 五月天激情四射| 日本一区二区三区精品视频| 99爱爱| AV成人在线播放| site:ornaments52.com| 激情av| 一级性感毛片| 丁香五月花| 久久大香蕉| 五月天综合视频网| AⅤ色区| 婷婷精品| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 外国碰视频网站97| 9久热在线精品| 一二线视频 另类| 99激情视频| 人妻久热| 五月欧美丁香在线观看| 久久九九大香蕉电院| 美女亚洲五月丁香| 五月婷婷色综图片| 亚州激情九月| 4399在线观看免费高清毛片| 国产在线aaa片一区二区99| 99热精品中文字幕| 丁香狠狠色婷婷| 丁香婷婷影院| 激情婷婷五月天日本系列| 乱抡小BB| 夜夜操夜夜姧| 99久久这里只有精品免费官网| 丁香五月手机在线| 97色女人在线| 亚洲有码在线视频| 啪啪五月综合| www.九九婷婷| 五月婷综合| av婷婷丁香| 久草婷妨| 激情五月婷色| 综合久久综合五月天婷婷| 国产欧美熟妇另类久久久| 激情五月天网| 五月丁香五月综合欧美| 欧洲亚洲精品| www久久99| 99视频内射三四| 思思热在线观看| 婷婷久草| 国精产品一区一区三区免费视频| 亚洲V国产V欧美V久久久久久| 99re在线观看| 少妇AB又爽又紧无码网站 | 婷婷五月成年人| 婷婷五月天激情四射五月天激情| 九九精品热| 丁香五月天在线视频| 天天爽爽日日做做| 最新激情五月天| 26UUU精品一区二区c〇m| 久久五月婷天天干| 五月婷天天搞视频| 激情综合五月| 婷色五月| 激情99| 激情五月四色| 婷婷五月激情视频网| 五月停停色| 综合久久99| 无码中文一区二区三区| 天天xxxxxx天天日| 五月天色婷婷综合| 91操操| 538在线精品| av操B网站| 久久久五月天网站| 激情五月天视频| 五月丁香六月婷婷在线小说视频| 人人做人人看人人摸| 婷婷丁香五月亚洲| WWW久久久| 国产特级毛片AAAAAAA高清| 九九色网专区| 国产精品人妻在线网址| 亚洲一个色| 岛国av电影网站| 天堂综合久久 | 成人美女网| 狠狠综合久久综合| 久久香蕉网| 婷婷五月伦理| 婷婷丁香九月| 欧美成人精品A片免费一区99| 97超级碰碰碰久久久| 丁香六月激情四射| 色欲香综合网| 日韩色久| 人妻第九页| 97干视频在线| 操逼福利视频| 天天色图| 90色免费视频| 亚洲综合婷婷| 国产日韩亚洲欧美在线观看| 91精品综合久久久久久五月丁香| 香蕉97碰碰碰欧美| xxxx久| 中文网av| 丁香五月影院| 哇嘎成人久久| 99re思思热这里| 成人丁香五月| 国产免费av网站| 美女天天久久| 99久视频| 久久性综合| 狠狠色丁香久久久婷| 99热最新| 香蕉久久国产AV一区二区| 色色色在线| 性99网站| 国产亚洲精品久久久久久牛牛| www色婷婷com| 亚洲看av的网站| 亚洲成人综合在线| 五月婷婷色白丝| http://www.lingjunshare.com/| 狠狠综合久久| 激情五月瑟瑟| 久久久区区一久久久久久| 色色色色色色色色网站| 91天堂网综合| 五月丁香五月天现场视频| 色噜噜狠狠一区二区三区| 婷婷五月色惰| 丁香五月婷婷激情蜜桃| A片试看50分钟做受视频| 色久九| 色婷婷亚洲婷婷在线观看| 精品一区久热| 成人婷婷五月天| 色五月婷婷老师| 色婷婷操逼| 蜜臀av粉嫩av懂色av| 丁香伊人五月色婷婷五十路| 99热日本| 疯狂做受XXXX高潮A片| 异能之下短剧免费观看全集| 夜夜躁婷婷AV| 超级碰碰碰碰视频| 婷婷五月天久久| 97在线日韩| 国产精品婷婷午夜在线观看| 日本黄色一级| www.色婷婷.com| 影音先锋天天日| 国产成人精品一区二三区熟女在线| 五月Huangsewang| 天天舔天天摸天天透| 亚洲乱码日产精品BD| 思思精品久久艹 | 色狠狠综合入口| 91综合网| 夜夜爱伊人| 91热网址| 婷婷九月激情| 开心婷婷中文字慕| 激情内射人妻1区2区3区| 五月天俺去也| 九月色婷婷综合| 永久精品| 激情色中文| 性爱先锋AV| 五月天激情综合网| 天天干com| 六月激情综合| www.久9| 中文字幕婷婷| 九九色99| 五月天丁香花婷婷| 激情五月天色播| 人人玩人人橾| 密臀av无码人妻精品| 天天干夜晚夜操| 国产JK精品白丝AV在线观看| 丁香色播五月天| 亚洲性爱电影| 日本玖玖在线| 五月天综合| 色五月丁香婷婷久草| 色五月天网| 97亚洲色 torrent magnet| 色五月激情图片| 99综合视频一体| 丁香婷婷91在线观看视频| 色婷婷a三区麻| 中文字幕黄色片| 丁香久月| 婷婷综合av| 久久中文网| 丁香婷婷激情六月五月开心| 97激情五月天| 国产片天天爽夜夜爽| www.91婷婷| 超碰伊人碰婷婷五月| 久久久全国免费视频| 人妻熟人中文字幕一区二区 | 精品一区二区三区木瓜| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 久操福利| 色老久久| 91丨九色丨高潮丰满日本| 国外亚洲成AV人片在线观看 | 天天爽夜夜爽夜夜爽精品视频| 激情婷婷亚洲五月| 丁香五月色播中文在线播放| www久久五月com| 婷婷九月狠狠色| 色婷婷A| 人人爽欧美婷婷久久久五月丁香| 丁香五月手机在线| 精品一区二区三区免费毛片爱| 婷婷综合欧美| 99热日韩这里只有精品| 久热AⅤ| 色婷婷免费视频| Www99热| 色热久资源| 伊人深爱综合| 五月丁香中文| 五月丁香六月婷综合成人综合| 天天干天天日天天操| 精国产品一区二区三区A片| 在线伦子99热| 丁香五月很很肏| 五月丁香色婷婷色| 丁香五月天.com| 九九综合视频在线观看| 婷婷五月天深爱| 操丝袜视频影院导航| 深爱激情69热| 五月丁香天堂网| 97啪在线观看视频| 亚洲在线视频321| 久久精品99久久| 日日操夜夜爽天天天| 五月丁香六月欧美| 色9999日韩国产| 日日噜噜久久婷婷五月天| 激情六月丁香| 无码九九| 五月婷综合网| 日本va欧美va国产激情| 91丁香色五月| 久久99最新| 日日干天天射| 大香蕉在线观看9| AⅤ色区| 性爱久久| 国产高清视频91九九九久久久| 六月激情网| 国产免费一区二区在线A片视频| 天天爽夜夜爽夜夜爽精| 丁香激情网| 波多野结衣AV无码Porn| 婷婷六月花| 久久中文网| 天天插轮理| 亚洲成人网站在线播放| 精品夜夜澡人妻无码AV| 亚洲成人另类| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 丁香激情婷婷网| 77799热| 久久久噜噜噜久久人妻| AV操逼网| www.ywav| 六月丁香激情网| a免费在线| 色色哒五月婷婷六月丁香| 久在热99| 色婷婷六月激情| 九月丁香| 丁香色情五月天| 丰满老熟妇BBBBB搡BBB| 丁香五月色播中文在线播放| 青青草免费公开视频| 另类小说婷婷色| www九月婷婷| 亚洲精品激情| 99噜噜| 婷婷色六月| 六月丁香婷婷尤物| 伊人天堂婷婷| 99热综合网| 热中文字幕| www.99热国产| 蜜臀av在线成人电影| 天天揷综合网| 人人色婷婷| 激情五月深爱五月| 欧美韩国日本| 色五月婷婷一二| 99热综合色图| 熟女少妇内射日韩亚洲| 开心激情网五月天| 狠狠色噜噜狠狠色噜噜噜999| 97久久人人人干| 夜夜资源站| 丁香五月婷婷成人网| 三级毛片7979| 久久久久亚洲AV综合| 色欲婷婷五月天丁香| 九九热这里都是精品6| www.久久色.com| 综合久| 99精品无码网站| 青青.com| 99视频35精品视频在线观看| 99视频内射三四| 婷婷八月丁香激情综合| 涩五月婷婷| 色色狼人综合| 成人做爰高潮A片免费视频| 可以直接看的AV网站| 夜夜夜天天操| 久99久在线观看| caopeng97人人| 日本乱子人伦在线视频| 日本va欧美va国产激情| 色综合com| 亚洲AV网站在线观看| 婷婷婷婷婷开心无码播放| 婷婷五月天国产手机在线视频观看| 六月丁香六月婷婷欧美| 玖玖在线视频| 婷婷五月天狠狠搞干| 国产1区2区3区| 丰满人妻一区二区三区| 久久停停超碰| 五月婷在线| 色综合九九| 九九热在线视频观看| 九九無妻| 久久婷婷内射| 香蕉操亚洲| 26uuu精品国产| 成人狠狠成人狠狠成人狠狠成人狠狠 | 97人妻碰碰碰久| 狠狠xx| 激情网五月| 9精品在线| 六九色综合婷婷五月天| 婷婷亚洲五月| 色色五月天网站| 99在线免费观看| 亚洲视频在线观看| 精品综合网在线| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 丁香五月婷婷亚洲综合精品在线| 婷婷色五月激情| 婷婷丁香成人在线视频| 欧美日韓成人亚洲精品另类| 深爱开心激情网| 激情婷婷综合五月少妇| 99热这是里只有精品| 色婷婷伦理| 五月综合婷婷久久在线| 秋霞电影一级黄| www.婷婷五月天啪啪| 天天做天天爱天天综合| 99精品视频播放| 九九色院| 噜噜色天天开心| 色五月婷婷天天操夜夜操| 婷婷色片| 伊人久久丁香狠狠婷婷综合香蕉 | 五月丁香亚洲校园欧美| 欧美成人网婷婷综合在线| 久久五月丁香| 国产精产国品一二三在观看| sewuyuetingtingiii| 丁香狠狠| 色色色色五月天| 美女视频图片久久91| Se.婷婷五月天| 91成人电影| 久草 tingting| 精品久热69| 久这里只有精品99| 99爱视频免费| 色五月,com| 丁香五月图片| 人妻啪啪啪| 99热这里是精品| 成人日韩欧美| 成人五月丁香社区| 五月丁香久久丝袜啪啪| 五月的丁香六月的婷婷| 天天日天天干天天操| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 欧美操人| 九九99九九99| 五月天色五月| 艹天天射| 精品久热69| 婷婷不卡基地| 欧美啄木乌丝袜人妻系列| 成人亚洲精品久久久久| 五月色无码| 日本二级毛片二级毛片| 激情五月六月婷婷综合啪啪| 成人短视频在线| 99ri视频| 五月激情天| 五月丁香婷婷五月色| 成人免费120分钟啪啪| 激情小说五月天| 国产精品大香蕉| 久久久久综合激动五月天| 五月天另类小说| 天天网站天天爽| 99操网站| 大香蕉久艹| 青青五月天婷婷|