久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

從Electron到自研C# UI引擎:200KB內(nèi)核實(shí)現(xiàn)0.2秒啟動(dòng) 寫這篇文章的起因是我這段時(shí)間把一個(gè)基于 Electron 的桌面工具徹底推翻重寫用一套自研的 C# UI 引擎 XchyUI 換掉了原來的 Web 套殼方案。內(nèi)核壓縮到 200KB 級(jí)別啟動(dòng)耗時(shí)從 3 秒壓到 0.2 秒以內(nèi)內(nèi)存占用從 300MB 掉到 50MB 上下。整個(gè)過程踩了不少坑也積累了一些能直接復(fù)用的經(jīng)驗(yàn)今天就是想把這套東西的來龍去脈、設(shè)計(jì)取舍、核心實(shí)現(xiàn)和實(shí)測數(shù)據(jù)攤開聊一聊。想在桌面端擺脫 Electron 體積和性能包袱、對(duì) UI 渲染底層原理感興趣的 C# 開發(fā)者應(yīng)該能從里面找到自己需要的東西。1. 先把賬算明白200KB 和 Electron 的差距到底在哪1.1 Electron 體積與內(nèi)存的真實(shí)賬單Electron 的本質(zhì)是一個(gè)把 Chromium 瀏覽器內(nèi)核、Node.js 運(yùn)行時(shí)和你的應(yīng)用代碼打包在一起的發(fā)行方式。Chromium 本身就是個(gè)上億行的龐然大物它的多進(jìn)程架構(gòu)決定了每開一個(gè)窗口至少要拉起一個(gè) GPU 進(jìn)程、一個(gè)渲染進(jìn)程再加若干輔助進(jìn)程。我原來的應(yīng)用僅僅是一個(gè)內(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 之后整個(gè)應(yīng)用的 UI 層程序集大小只有 180KB 左右加上輔助類庫也穩(wěn)定在 200KB 級(jí)別。這里的 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ī)器硬對(duì)比出來的而是在同一臺(tái)機(jī)器上反復(fù)測量的結(jié)果。1.2 Web 套殼方案被忽略的隱性成本很多人選擇 Electron 或者類似的 Web 套殼方案理由是寫起來快、樣式好調(diào)、前端生態(tài)豐富。這幾句話在原型階段沒問題但放到真實(shí)產(chǎn)品里隱性成本會(huì)一點(diǎn)點(diǎn)顯現(xiàn)出來。首先是啟動(dòng)鏈路過長。Electron 要依次完成加載 Chromium 內(nèi)核、初始化 V8、啟動(dòng) 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 對(duì)象、CSS 樣式和圖片解碼數(shù)據(jù)都堆在渲染進(jìn)程的堆里而 Node.js 和 Chromium 各自維護(hù)獨(dú)立的運(yùn)行時(shí)狀態(tài)兩邊通過 IPC 反復(fù)拷貝數(shù)據(jù)。哪怕頁面本身很簡單瀏覽器內(nèi)核的基礎(chǔ)開銷也省不掉。我遇到過僅僅打開一個(gè)主窗口、沒有任何復(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)存、啟動(dòng)速度問題但它也要求你具備對(duì)渲染底層機(jī)制的基本理解同時(shí)意味著你不再擁有前端生態(tài)里那些開箱即用的圖表庫、富文本編輯器、UI 組件庫。我的判斷標(biāo)準(zhǔn)是如果應(yīng)用界面復(fù)雜度一般交互密度高對(duì)資源占用有硬性要求且團(tuán)隊(duì)本身有 C# 功底那么就非常適合走自研路線。反過來如果你的應(yīng)用重度依賴網(wǎng)頁生態(tài)里那些復(fù)雜組件界面每天都要換皮膚、調(diào)樣式又或者迭代速度要求極高那還是繼續(xù)用 Electron 或者考慮 Avalonia 這類成熟框架更穩(wěn)妥。XchyUI 的定位就是夠用且可控。它不做你根本用不上的各種瀏覽器特性不做通用 DOM 解析不做復(fù)雜的 CSS 盒模型而是聚焦桌面應(yīng)用真正高頻需要的按鈕、輸入框、列表、樹、表格、簡單的自定義繪圖面板。這個(gè)邊界決定了它能夠做到很小也決定了它能夠快。2. 200KB 內(nèi)核是怎么做到的XchyUI 的核心架構(gòu)2.1 剝離 Chromium 后一個(gè) UI 引擎剩下什么很多人聽到自研 UI 引擎會(huì)下意識(shí)覺得這是個(gè)大工程動(dòng)輒要寫幾萬行代碼。實(shí)際上如果暫時(shí)放下瀏覽器那套巨獸體量一個(gè)面向桌面應(yīng)用的 UI 引擎只需要解決六個(gè)子問題窗口創(chuàng)建和消息循環(huán)——調(diào)用操作系統(tǒng)提供的原生窗口機(jī)制繪制圖元——在窗口客戶區(qū)輸出文字、矩形、線條、圖片輸入事件——把鼠標(biāo)、鍵盤、觸摸事件分發(fā)到具體控件布局計(jì)算——按規(guī)則算出每個(gè)控件的位置與尺寸控件樹與生命周期——組織界面結(jié)構(gòu)并管理重繪樣式與主題——讓控件長得不那么原生且保持一致性Electron 為了兼容所有網(wǎng)頁技術(shù)把每個(gè)子問題都做成了通用抽象代價(jià)就是體量爆炸。XchyUI 的做法恰恰相反按照桌面應(yīng)用的實(shí)際情況做最強(qiáng)約束??丶涫瞧胀ǖ?C# 對(duì)象樹布局只支持垂直流式、水平流式、絕對(duì)定位和表格定位樣式只有純色背景、邊框、字體、間距這些有限屬性。約束越多實(shí)現(xiàn)越簡單越容易做到極致體量。2.2 渲染層的選擇為什么不直接上 SkiaSharp做 C# UI 引擎第一個(gè)選型難題就是渲染后端。備選項(xiàng)無非幾個(gè)GDI、SkiaSharp、SharpDX/Direct2D、OpenGL。SkiaSharp 功能強(qiáng)大跨平臺(tái)文字渲染質(zhì)量高但它本身是一個(gè)相當(dāng)龐大的圖形庫原生部分加載進(jìn)進(jìn)程就占不少內(nèi)存包裝層也不小。再疊加微軟的字體管理系統(tǒng)和圖像解碼庫內(nèi)核體積很難保持在 200KB 量級(jí)。SharpDX/Direct2D 性能更好但它是原生 COM 接口的薄封裝使用難度大對(duì)象生命周期管理要非常小心哪怕一個(gè) COM 引用釋放遺漏都可能引發(fā)直接的地址訪問錯(cuò)誤比如 C# 調(diào)用 C 層時(shí)常見的 access violation c0000005。對(duì)于一個(gè)小內(nèi)核的項(xiàng)目引入這么厚的底層依賴性價(jià)比不高。XchyUI 最終選擇了 GDI 作為第一代渲染后端。理由很直接它吃內(nèi)存少調(diào)用鏈短C# 里用 System.Drawing 就能穩(wěn)定輸出文字和圖形。雖然 GDI 的渲染性能上限不如 Direct2D但是對(duì)于一個(gè)界面層操作遠(yuǎn)多于高頻動(dòng)畫的桌面應(yīng)用來說60fps 的需求是一定滿足得了的——我后面會(huì)給出實(shí)測數(shù)據(jù)。提示這里有個(gè)常見誤區(qū)。很多人覺得 GDI 慢是因?yàn)槟盟ヤ秩菊敛粩嘧兓母邘视螒虍嬅?。?duì)于普通表單和業(yè)務(wù)界面GDI 的真正瓶頸并不在繪制速度而在無腦整窗重繪。做好局部失效重繪之后性能完全夠用。2.3 消息循環(huán)與事件分發(fā)的最小實(shí)現(xiàn)Windows 應(yīng)用程序的窗口系統(tǒng)是一個(gè)消息驅(qū)動(dòng)模型。鼠標(biāo)點(diǎn)擊、鍵盤輸入、窗口移動(dòng)、尺寸變化Windows 都會(huì)把行為封裝成消息投遞到目標(biāo)窗口的消息隊(duì)列里。你的 UI 框架只要持續(xù)循環(huán)接收這些消息再轉(zhuǎn)成自己的事件就完成了事件分發(fā)。XchyUI 的消息循環(huán)是所有控件的心臟。它的基本結(jié)構(gòu)是一個(gè) while 循環(huán)調(diào)用 Win32 的 GetMessage 取出消息TranslateMessage 做鍵盤按鍵翻譯再 DispatchMessage 把消息交還給窗口過程函數(shù)。窗口過程里XchyUI 收到 WM_PAINT 就觸發(fā)整體重繪收到鼠標(biāo)移動(dòng)消息就把坐標(biāo)換算后交給命中測試邏輯從而找到這個(gè)點(diǎn)落在哪個(gè)控件上再把對(duì)應(yīng)的鼠標(biāo)事件派發(fā)給它。這里要強(qiáng)調(diào)的是消息循環(huán)和渲染循環(huán)的關(guān)系。XchyUI 并不是拿一個(gè)獨(dú)立的死循環(huán)去不斷刷幀。沒有界面變化時(shí)消息循環(huán)會(huì)阻塞在 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ì)成了一套極簡的測量-安排兩階段布局流程。測量階段每個(gè)控件根據(jù)自己的內(nèi)容、字體和尺寸策略計(jì)算出理想大小。安排階段容器控件按照自己的布局規(guī)則把子控件逐個(gè)擺放到具體位置。最核心的容器是 StackLayout參數(shù)只有方向垂直或水平和間距Spacing沒有百分比、沒有媒體查詢。另一個(gè)是 GridLayout把可用區(qū)域按行和列切分對(duì)表格類界面特別實(shí)用。這兩下子看起來樸素的過分但實(shí)際用下來會(huì)發(fā)現(xiàn)桌面應(yīng)用 90% 的界面布局就是一行一行往下排加一個(gè)二維表格。自研引擎的最大好處就是你可以按照實(shí)際需求去砍功能而不必被通用方案拖累。3. 手把手構(gòu)建 XchyUI 跑道渲染循環(huán)、事件系統(tǒng)與組件封裝3.1 第一個(gè)可用的渲染循環(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); } }這里用了一個(gè) 內(nèi)存位圖 一次性拷貝 的雙緩沖思路。先在內(nèi)存里畫好整幀再一次性拷貝到窗口顯示區(qū)避免用戶看到撕裂的繪制過程。邏輯上整個(gè)渲染循環(huán)不就兩件事消息來了處理界面臟了重畫。消息循環(huán)負(fù)責(zé)響應(yīng)動(dòng)作渲染循環(huán)負(fù)責(zé)呈現(xiàn)結(jié)果二者通過 _dirty 標(biāo)志位解耦不會(huì)出現(xiàn)事件處理時(shí)強(qiáng)插一個(gè)繪制的混亂局面。3.2 控件樹與命中測試的完整實(shí)現(xiàn)控件樹是 XchyUI 結(jié)構(gòu)上最重要的數(shù)據(jù)結(jié)構(gòu)。每個(gè)控件要么是葉子節(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)走誰的面積覆蓋了這個(gè)點(diǎn)就把事件給誰。因?yàn)樽詈罄L制的控件視覺上在最前面所以按子控件列表的倒序去檢查第一個(gè)命中的就是用戶真正想點(diǎn)的那個(gè)控件。這套機(jī)制雖然樸素但已經(jīng)足夠在按鈕、列表項(xiàng)、樹節(jié)點(diǎn)之間做出正確的事件路由。3.3 組件庫封裝Button、TextBox、List 的設(shè)計(jì)思路有了控件樹和事件路由接下來就是封裝具體控件。以一個(gè)最簡單的 Button 為例它需要處理三種視覺狀態(tài)普通、懸停、按下每種狀態(tài)對(duì)應(yīng)不同的背景色。繪制時(shí)根據(jù)狀態(tài)填充圓角矩形再居中繪制文字。XchyUI 中按鈕的實(shí)現(xiàn)大概只有 100 行但它完整覆蓋了外觀表現(xiàn)和交互反饋。TextBox 復(fù)雜一些。它要管理插入符位置、支持響應(yīng)鍵盤輸入、處理光標(biāo)閃爍、支持選中區(qū)域的反白顯示。早期版本我直接在控件內(nèi)部用一個(gè)普通的 TextBox 成員變量去承接輸入后來發(fā)現(xiàn)這會(huì)造成 WinForms 控件的全權(quán)耦合最后改用純 GDI 繪制文本和插入符自己實(shí)現(xiàn)鍵盤字符替換邏輯。這樣既減少了外部依賴也讓控件體積和渲染可控性更好。List 是另一個(gè)高頻組件。我最初實(shí)現(xiàn)的是全部可見項(xiàng)逐一繪制的樸素版本。支持 10 個(gè)、20 個(gè)條目沒問題但條目一旦達(dá)到幾千個(gè)逐一繪制就會(huì)拖慢每幀速度。最終采用了虛擬化方案只繪制出現(xiàn)在可視區(qū)域內(nèi)的那幾十個(gè)條目。這個(gè)優(yōu)化屬于 UI 引擎常見的基礎(chǔ)設(shè)計(jì)但對(duì)性能的提升是立竿見影的。3.4 局部失效區(qū)域優(yōu)化不做無腦全窗重繪自研引擎最容易被忽視的一個(gè)細(xì)節(jié)是哪些區(qū)域需要重繪。一開始我也是最簡單的辦法控件 Event 觸發(fā)任何變化就設(shè) _dirtytrue然后整窗口重畫。這在控件少時(shí)無所謂窗口大了或者控件多了無謂的整窗繪制會(huì)直接影響幀率。XchyUI 最終實(shí)現(xiàn)了區(qū)域失效機(jī)制。每個(gè)控件維護(hù)一個(gè) IsDirty 標(biāo)記父容器負(fù)責(zé)把子控件的臟區(qū)域合并成一個(gè)或多個(gè)矩形區(qū)域記錄到 _invalidRegions 集合。RenderFrame 時(shí)只對(duì)這些矩形區(qū)域做裁剪繪制最后用 DrawImageUnscaled 配合 Graphics 的 SetClip 把對(duì)應(yīng)部分拷貝到窗口上。這樣高頻改動(dòng)的小控件不會(huì)再拖累整個(gè)窗口的重繪。提示實(shí)現(xiàn)局部失效的復(fù)雜度會(huì)明顯上升因?yàn)椴眉魠^(qū)域、控件交疊、縮放變換都要處理。如果項(xiàng)目第一版趕進(jìn)度建議還是先整窗重繪把功能跑通之后再用特性分支去升級(jí)局部失效。性能優(yōu)化永遠(yuǎn)不要發(fā)生在需求還沒穩(wěn)定的階段。4. 性能驗(yàn)證與真實(shí)數(shù)據(jù)怎樣才算秒殺4.1 1000 控件壓力測試的實(shí)測數(shù)據(jù)我拿一個(gè)真實(shí)場景做了壓力測試窗體里有 1000 個(gè)自定義卡片控件每個(gè)卡片包含一個(gè)標(biāo)題、一行描述、一個(gè)圖標(biāo)區(qū)域。分別測量了靜態(tài)界面無交互時(shí)的幀率、滾動(dòng)列表時(shí)的事件處理吞吐量、以及內(nèi)存占用。用 XchyUI 跑這套界面靜態(tài)幀率穩(wěn)定在 60fps觸發(fā)滾動(dòng)和點(diǎn)擊時(shí)幀耗時(shí)幾乎恒定在 14ms 左右CPU 占用率在無交互時(shí)是 0.4% 以下持續(xù)滾動(dòng)的峰值也只有 15%。同樣的界面我用 Electron 做了一版對(duì)照靜態(tài)內(nèi)存大約 260MB高速滾動(dòng)時(shí)幀率會(huì)出現(xiàn)明顯下降到 40fps 以下CPU 峰值可達(dá) 45%。差距的主要來源是 Electron 每一次滾動(dòng)都要經(jīng)過 DOM 樹更新、樣式重算和瀏覽器合成而 XchyUI 只是在畫布上把卡片新位置繪制一遍。4.2 內(nèi)存與啟動(dòng)時(shí)間的可復(fù)現(xiàn)測試方法性能對(duì)比不能只憑體感要有一套可復(fù)現(xiàn)的測量方法。在 XchyUI 里我做了這樣三個(gè)測試步驟任何人都可以直接抄走啟動(dòng)耗時(shí)從進(jìn)程啟動(dòng)開始計(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ù)。滾動(dòng)流暢度維護(hù)一個(gè)固定長度的幀耗時(shí)隊(duì)列在滾動(dòng)循環(huán)里每次 SwapBuffer 后記錄耗時(shí)統(tǒng)計(jì) P9595 分位值。如果 P95 低于 16ms基本可以認(rèn)定在普通 60Hz 屏幕上是流暢的。按照這套方法實(shí)測下來的結(jié)果前面已經(jīng)列了這里再補(bǔ)一個(gè)最有說服力的對(duì)比同一個(gè)業(yè)務(wù)流程從點(diǎn)擊按鈕到界面完成刷新XchyUI 的平均時(shí)間是 9msElectron 大約是 87ms。這個(gè)差異在業(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 起啟動(dòng)到首幀時(shí)間0.1~0.2s1.5~3s0.2~0.4s靜態(tài)內(nèi)存占用簡單窗口40~60MB150~300MB80~120MB渲染原理GDI可選后端升級(jí)Chromium 合成器DirectX 合成器跨平臺(tái)計(jì)劃中三平臺(tái)全覆蓋僅 Windows前端生態(tài)可用性無完整極弱這張表格不是為了貶低 Electron 和 WPF而是想說明不同技術(shù)棧的本質(zhì)差異Electron 用一個(gè)完整的瀏覽器內(nèi)核來解決通用問題WPF 用一個(gè)龐大的框架體系來解決富媒體表現(xiàn)問題而 XchyUI 是定義問題邊界之后做減法的產(chǎn)物。三種方案適合三種不同訴求關(guān)鍵是看清楚你的訴求是什么。4.4 高 DPI、字體渲染、線程調(diào)度等細(xì)節(jié)坑在測試和真實(shí)使用中有幾個(gè)細(xì)節(jié)會(huì)讓結(jié)果出現(xiàn)劇烈波動(dòng)必須單獨(dú)說。高 DPI 是第一大坑。如果進(jìn)程沒有正確聲明 DPI 感知Windows 會(huì)把你的窗口自動(dòng)縮放導(dǎo)致所有坐標(biāo)比例錯(cuò)亂畫面模糊點(diǎn)擊區(qū)域?qū)Σ簧稀N易罱K把清單里的 dpiAwareness 設(shè)成了 PerMonitorV2再用 QueryDpiAwareness 做運(yùn)行時(shí)檢測。這套處理做完在 125%、150% 縮放環(huán)境下窗口和對(duì)齊才是正確的。字體是第二大坑。GDI 的文本渲染在默認(rèn)字體下會(huì)有明顯的鋸齒中文尤其容易發(fā)虛。我的經(jīng)驗(yàn)是優(yōu)先使用微軟雅黑并開啟 TextRenderingHint.ClearTypeGridFit同時(shí)對(duì)字體做一次 Fallback 鏈——微軟雅黑 → 宋體 → 系統(tǒng)默認(rèn)字體。這樣即便目標(biāo)機(jī)器沒有安裝微軟雅黑中文也不會(huì)變成方塊。線程調(diào)度是第三大坑。所有 UI 相關(guān)的繪制和控件屬性更新必須發(fā)生在創(chuàng)建窗口的同一個(gè)線程上。如果在后臺(tái)線程直接改控件坐標(biāo)或者觸發(fā)重繪輕則閃爍重則直接崩潰典型的 access violation c0000005 就是這么來的C# 層訪問了已被釋放的 GDI 對(duì)象。XchyUI 內(nèi)部做了一個(gè)簡單的 Dispatcher 封裝所有外部更新請(qǐng)求統(tǒng)一通過 PostMessage 投遞到 UI 線程執(zhí)行。5. 實(shí)戰(zhàn)記錄從 Web 套殼遷移到 XchyUI 的完整過程5.1 遷移前的架構(gòu)評(píng)估與組件盤點(diǎn)如果你現(xiàn)在也想做類似的遷移第一個(gè)建議是不要急著寫代碼先盤需求。我把原有應(yīng)用里的界面元素逐個(gè)列成清單按鈕、輸入框、下拉框、表格、樹、彈窗、消息條、自定義繪圖面板、右鍵菜單。然后逐個(gè)評(píng)估XchyUI 現(xiàn)成有沒有、需要新寫、需要改設(shè)計(jì)。最終結(jié)論是 60% 的控件可以直接復(fù)用25% 需要少量定制15% 需要重寫思路。這個(gè)評(píng)估過程還有個(gè)額外收益它會(huì)逼著你去砍那些看起來挺炫但沒人用的界面裝飾。脫離 Web 生態(tài)后很多花里胡哨的動(dòng)效自然就不做了產(chǎn)品反而更聚焦。另一個(gè)重要決策是數(shù)據(jù)綁定。Web 套殼的前端框架都有響應(yīng)式綁定XchyUI 一開始沒有設(shè)計(jì)這套東西。我的過渡方案是控件數(shù)據(jù)源 刷新接口每個(gè)復(fù)雜控件持有一個(gè)數(shù)據(jù)源列表數(shù)據(jù)變化時(shí)調(diào)用控件的 Refresh()控件在內(nèi)部重新讀取數(shù)據(jù)并標(biāo)記臟區(qū)域。這個(gè)模式寫起來比響應(yīng)式綁定繁瑣但邏輯鏈路很短排查問題很容易。數(shù)據(jù)頻率不高的場景下這種寫法完全夠了。數(shù)據(jù)綁定決策還影響了一個(gè)核心數(shù)據(jù)結(jié)構(gòu)。從 Web 套殼遷移到一個(gè)內(nèi)聚框架最大的區(qū)別就是所有狀態(tài)有且僅有一個(gè)權(quán)威來源。Web 時(shí)代可能 Model 一套、DOM 一套、狀態(tài)管理再存一份XchyUI 只認(rèn) C# 對(duì)象里的字段。別小看這個(gè)約束它直接解決了大量數(shù)據(jù)不同步的舊 Bug。5.2 自定義主題系統(tǒng)與樣式處理Web 套殼里改樣式是頻率很高的操作。自研引擎如果讓每個(gè)控件把顏色、字體寫死團(tuán)隊(duì)迭代起來會(huì)非常痛苦。我做了一個(gè)極簡主題系統(tǒng)主題是一個(gè) Theme 對(duì)象里面有背景色、前景色、邊框色、按鈕不同狀態(tài)的顏色、字體名稱和尺寸、間距常量等若干字段。所有控件在繪制時(shí)只從當(dāng)前主題讀取顏色不硬編碼。切換主題只需要換一個(gè) Theme 實(shí)例然后全窗標(biāo)記重繪。因?yàn)?GDI 里繪制矩形和文字的成本極低哪怕是整窗重繪也能在幾毫秒內(nèi)完成主題切換這個(gè)平時(shí)最容易卡出掉幀的操作反而成了 XchyUI 最具表現(xiàn)力的功能之一。5.3 常見問題排查速查表現(xiàn)象可能原因排查思路與解決動(dòng)作窗口渲染為空白重繪時(shí)機(jī)被漏掉WM_PAINT 沒有觸發(fā)布爾標(biāo)記檢查 Invalidate 是否真的調(diào)用了確認(rèn)渲染代碼是否在 UI 線程執(zhí)行點(diǎn)擊控件沒有反應(yīng)消息循環(huán)被阻塞或者命中測試順序錯(cuò)誤檢查事件處理里是否有 Sleep/耗時(shí)操作打印鼠標(biāo)坐標(biāo)和控件 Bounds 對(duì)比文字發(fā)虛、有鋸齒GDI 默認(rèn)渲染模式不對(duì)設(shè)置 Graphics.TextRenderingHint ClearTypeGridFit中文顯示方塊字體 Fallback 缺失配置字體鏈優(yōu)先用系統(tǒng)自帶的微軟雅黑高 DPI 下坐標(biāo)全亂進(jìn)程沒聲明 DPI 感知修改 manifest 設(shè)置 PerMonitorV2并動(dòng)態(tài)查詢 DPI內(nèi)存緩慢上漲每次繪制創(chuàng)建了 Bitmap 未釋放或者事件沒有解綁用 Dispose 模式管理 Bitmap檢查控件樹移除時(shí)是否清理事件引用后臺(tái)線程 Crash跨線程操作 UI 控件統(tǒng)一走 Dispatcher不要直接訪問控件屬性5.4 打包發(fā)布與裁剪策略XchyUI 項(xiàng)目的目標(biāo)是小打包環(huán)節(jié)也要堅(jiān)持這個(gè)思路。首先確保所有用不到的程序集不進(jìn)發(fā)布目錄。然后使用 .NET 的 single-file publish 把所有托管程序集打成一個(gè)文件這是最直觀的體積削減。之后經(jīng)過 ILLink 裁剪把沒有被引用的框架代碼從最后的產(chǎn)物里移除。這里有個(gè)值得注意的細(xì)節(jié)ILLink 裁剪雖然能縮小體積但它對(duì)反射破壞非常敏感。如果代碼里用了 Type.GetType 或者反射調(diào)用必須給對(duì)應(yīng)的程序集標(biāo)記 DynamicDependency否則運(yùn)行時(shí)會(huì)直接 TypeNotFound。我在 XchyUI 的早期版本就踩過這個(gè)坑上線測試時(shí)控件創(chuàng)建報(bào)了一大堆反射錯(cuò)誤最后是把加載邏輯改成顯式注冊表才繞開反射機(jī)制的不確定性。發(fā)布時(shí)還要保留 PDB 文件。自研引擎沒有成熟的崩潰上報(bào)體系如果你連符號(hào)文件都沒有用戶那邊報(bào)一個(gè) access violation 你根本沒法定位。PDB 加上 Windows 事件日志里捕獲到的異常堆棧是排查崩潰類問題最重要的兩張底牌。6. 下一步值得探索的方向6.1 跨平臺(tái)與國產(chǎn)化適配XchyUI 目前以 Windows 為主但架構(gòu)上沒有把非 Windows 的路堵死。核心的控件樹、布局引擎、事件路由邏輯全部用純 C# 實(shí)現(xiàn)不依賴任何 Windows 程序集。只有最底層的創(chuàng)建窗口 消息循環(huán) 圖形上下文這一層與平臺(tái)相關(guān)我把它隔離成了 IPlatformBackend 接口。如果后續(xù)要支持 Linux可以在 XLib/Wayland 上實(shí)現(xiàn)這個(gè)接口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 引擎就能在這些平臺(tái)上跑起來。這條路我還沒有完整走通現(xiàn)階段只能算一個(gè)方向但它讓 XchyUI 擁有一個(gè)比 Electron 輕量得多的跨平臺(tái)想象空間。6.2 渲染后端升級(jí)路線SkiaSharp、SharpDX 都只是備選GDI 作為第一代渲染后端確實(shí)簡單穩(wěn)定但它的抗鋸齒質(zhì)量、圖形變換能力、復(fù)雜路徑填充效果都存在上限。后續(xù)如果要支持更細(xì)膩的圓角陰影、漸變、變換動(dòng)畫就需要考慮更強(qiáng)大的渲染后端。我的規(guī)劃不是立刻替換而是先把渲染層抽象成 ICanvas 接口GDI 只是其中一個(gè)實(shí)現(xiàn)。然后可以逐步添加 SkiaSharpCanvas、SharpDXCanvas 這些實(shí)現(xiàn)并且針對(duì)不同后端去做性能對(duì)比。這里的關(guān)鍵是渲染后端可以換但控件樹結(jié)構(gòu)、布局引擎、事件系統(tǒng)絕不能因?yàn)閾Q后端而重寫。接口隔離的意義就在于讓變化局限在最小范圍內(nèi)。注意追加渲染后端要考慮的不僅是代碼工作量還有體量變化。SkiaSharp 的原生庫會(huì)拉高內(nèi)核體積SharpDX 的 COM 對(duì)象生命周期也要投入不少精力。收益與代價(jià)需要反復(fù)權(quán)衡別為了營造技術(shù)很牛的感覺去堆疊依賴。6.3 開源計(jì)劃與社區(qū)共建XchyUI 現(xiàn)在處于自用順手、開源需整理的狀態(tài)。如果要開源許可證我會(huì)選 MIT 或者 Apache-2.0并且會(huì)整理出三類倉庫內(nèi)容核心引擎、組件庫、示例模板。社區(qū)共建的價(jià)值在于可以讓更多從業(yè)者幫忙補(bǔ)齊真實(shí)場景里的邊界情況——不同輸入法、不同顯卡驅(qū)動(dòng)、不同企業(yè)安全軟件的兼容性這些問題永遠(yuǎn)只能靠足夠多的真實(shí)場景暴露出來。我還沒有確定開源的具體時(shí)間表但可以確定的是即使不開源我也會(huì)持續(xù)把 XchyUI 用于自己的實(shí)際項(xiàng)目讓它保持小而鋒利的特點(diǎn)而不是膨脹成一個(gè)誰都不需要的通用框架。最后分享一點(diǎn)個(gè)人體會(huì)。整個(gè)遷移過程中我最深的感受不是Electron 不好而是技術(shù)選型要對(duì)齊真實(shí)約束。如果你的產(chǎn)品身處資源受限環(huán)境或者用戶對(duì)啟動(dòng)速度和內(nèi)存占用極其敏感那 Electron 這套技術(shù)棧的底層代價(jià)就會(huì)壓得你很難受。自研引擎的價(jià)值不在于標(biāo)榜我不用 Electron而在于它逼著你去理解 UI 是怎么工作的——一個(gè)按鈕從點(diǎn)擊到屏幕反饋經(jīng)歷哪些環(huán)節(jié)、一次滾動(dòng)如何保證不卡、一個(gè)窗體如何做到秒開。這些理解在任何技術(shù)棧里都不會(huì)浪費(fèi)。不要被性能焦慮綁架更不要被工具路徑綁架——輕量自有輕量的價(jià)值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产青青美女玩逼视频| 日韩无码三级影院| 色牛牛AV| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚洲第一黄色av网站| 国产AB视频| 天天躁狠狠躁av| 久久成人网站| 中文字幕大片三级狠狠干| 九九碰九九爱97超| 国产亚洲欧洲在线观看| 日本精品国产视频| 伊人久久亚洲色欲综合网站 | 成人精品一区二区91毛片不卡| 四虎免费在线观看| 2018天天日天天日| 日本高清视频xxxx| 免费伦费视频在线观看| 婷婷丁香六月| 欧美韩国你懂得在线| 97操综合| 亚洲成人激情小说视频| 一区二区三区黄色片a| 曰韩无码777| 亚洲AV无码| 美女网站黄页| 国内偷自视频区视频综合| 乱伦系列一区二区| 免费9 1久久| 国产精品一区二区三| 无码逼| 丁香五月社区| 日韩不卡一二三四| 嫩草美女久久| 无码一区二区三区四区五区六区七区八区九区十区视频 | 99色在线| 国产乱伦一二三区| 一本色道久久综合熟妇| 中文字幕性感少妇av| 深夜激情 | 黄色工厂这里只有精品| 日本熟女不卡视频| 午夜福利合集| 欧美另类精品xxxx| 免费看欧美美女黄色大片| 99re6久热只有精品6在线直播 | 99热18这里只有精品| www.超碰| 人妻一区二区三区| 91网站在线播放| 国产视频97| 校园春色亚洲| 婷婷午夜成人色中色| 日本护士高潮| 欧美精品双插| 精品人妻视频一区二区在线播放 | 男人天堂免费| 欧美激情内射| 亚洲高清在线| 日本最新免费韩国1区2区视频播放| 婷婷情色五月天| 成人精品欧洲亚洲| 3PAV乱伦视频| 99色色网| 超碰九九| 国产精品久久久久无码A√| 亚洲日韩精品一区视频在线| 怡红院怡春院| 热热色91| 欧美成人都市人妻| 巨乳特殊服务按摩| 亚洲一区二区性爱电影| 久久久久久久91| 无码精品一区二区三区潘金莲| 91色艳| 大香蕉中文网| 亚洲 欧美 中文 日韩超碰| 少妇人妻在线| 久久天天艹| 成人熟女视频一区二区三区| 操屄日韩| 九九九九九九九九九五码| 欧美色综合网| 免费看污网址| 太久视频| 日本加勒比无码专区| 自拍偷拍2025在线观看| 日韩在线电影| 久久久com| 韩国三级一线观看久| 日韩紧密久久| 人妻乱仑一区二区三区| 极品人妻少妇综合| 极品五月天噜噜| 亚洲中文字幕在线视频一区二区| 日韩精品9999| 韩国一级做A片免费的| 中文字幕色AV| 热天堂一区二区| av天堂天堂av日韩| 青青草啪啪网| 久久五月婷| 人摸人人操人| 多毛小伙内射老太婆| 亚洲亚洲亚洲天堂天堂| 精品射1999| 人人操人人操人人人操| 色性欧美| 国产伦精品免编号公布| 蜜乳AV一区| 奶水 人妻 哺乳 在线| 青青草吊丝| 小情侣高清国产在线视频| 青草精品视频-日本久久久久网站| 亚洲综合影片| 中文字幕成人| 东京热亚洲一区二区| av网页一区二区三区| 九九热九九| 1024午夜激情男人的天堂| 素人播放一区| 九九在线视频| 9久久精品| 国岛片视频| 日本免费人成视频播放120秒| 91久久精品美女高潮喷水| 色 亚洲 91| 国产精品九9| 丁香激情五月| 性欧美另类高清| 激情五月天色播| 人妻熟女av国产网站| 性久久| 91精品久久久久五月天精品| 亚洲激情天堂网| 老司机免费视频在线91| 亚洲图片视频小说| 色哟哟av| 热热色中文无码| 亚洲成成熟女人综合一区二区| 色婷婷综合网| 91中出在线| 亚欧美综合网| 国产精品久久久久无码A√| 51一区二区三区| 91人妻PORNY九色大屁股| 天天躁日日躁AAAXX| 天天看少妇| 伊人96在线| 天天综合网亚洲综合网| 狠狠爱综合网| 亚洲欧洲精品视频发布| 丁香激情五月天| 欧美性爱一区| 99999国产精品| 日va操| 久久人妻丝袜一区二区三| 激情终合网| 91欧美综合| 九月激情婷婷| 久草婷婷| 国产熟女精品一区二区| 99在线免费公开视频| 五月天综合网| 亚洲天天影视色综合| 日曰骚久久精品| 啪啪视频亚洲第一| 亚洲精品天天影视综合网 | 九九黄色网| 日日AV加勒比| 日韩精品人妻一区二区| 熟女突然公开看18禁影片| 99丝袜福利在线播放| av一区二区三区四区五区久草臀| 精品久久97观看在线视频| 强奸乱伦大香蕉| 欧美 亚洲 制服 精品| 精品一区二区三区蜜桃| 亚洲夜夜欢无码一区二区 | 色女女女导航| 日本天天干天天操一区| av婷婷色网| 操一对老熟妇爽上天视频| 3571色综合一区二区二区| 色综合一本| 蜜桃传媒视频第一区入口在线看| 91视频观看网站| 婷婷综合久久| 国产高清MV操逼视频| 白丝AV网站| 翔田千里无码中出中文字幕| 日韩精品第3页| 免费看日本操逼视频| AV乱伦专区| 午夜美女诱惑电源网| 日韩欧美资源| 亚洲熟女一区| 国产视频小说| 中国熟女91| 综合网久久| 国产精品久久久视频| 国产精品老师| 婷婷六月色| 欧美刺激色黄片免费看| 国产高清成人传媒影视| 亚洲欧洲网站免费观看| 欧亚乱色熟女一区二区| blacked精品一区国产| 69视频入口| av三级电影在线播放| 色噜噜国产精品视频一区二区| 青青草原成人| 精品免费囯产一区二区三区| 天天综合亚洲综合| 久久这里只精品免费福利| 乱欲视频| 日本黄大片在线观看视频| 99re超碰| 人人 操人人 操人人| 69av一区二区三区| 亚洲第一精品在线视频| 黄色在线网站| 天天天天操| 丰满人妻一区二区三区| 强上我不卡卡| 亚洲日韩欧美一区二区| 欧美宗合色| 男人天堂2017| 国产野战露脸在线播放| 中文字幕日本久久| av在线人气| 成人日本精品九区| 在线中文AV| 日韩有码中文字幕女同性恋| 亚洲一区二区三区婷婷| 日本国产亚洲一区在线观看| 国产对白刺激视频| 日韩欧美视频青青| 中国黑人三级片网站上区| 好屌色综合| 中文欧丝袜诱惑| 久久内射| 国产成人自拍视频视频| 欧美男女午夜啪啪| 亚洲综合草草| 高清有码一区二区| 久久一二三四五六七八九区区区 | 无码精品久久久久久亚洲| 色综合国产在线观看| 最新亚洲人成网站在线影院| 六月激情网| 天天综合影院91| 97人人色| 欧美不卡在线一区二区| 俺去俺来也在线www| 中日无幕一二三四区| 久久鲁夜| 日韩一区二区精彩视频| 激情五月天网站| 美腿丝袜偷拍亚洲欧美| 精人妻一区二区三区| 欧美片第一页| 天天做天天爱| 九九人妻| 欧美一级久久久久久久大片动画| 日韩精品 资源| 丝袜美女诱惑 91 视频| 久久久久久精| 色色色欧美| 色网综合网| 夜草网站| 91在线免费观看处女| 免看60秒涩涩视频| 成全在线观看免费观看| 求求你操操我| 成 人 A V免费视频在线观看| 男人的天堂一区三区| 少妇人妻精品| 精品国产一区探花在线观看| 99色在线| 97亚洲色图| 国内精品伊人久久久久影院会| 美女的肌被草喷水视频| 岛国黄| 啪啪91| 欧美日韩1234| 日韩素人无码一区二区三区三州| 2017天天操天天日| 精品一二三区久久AAA片| 2000亚洲男人天堂| 免费精品中文字幕| 四虎在线免费视频| 亚洲一本色道中文无码aV天美| 亚洲熟女综合| 国产中文字幕在线点播| 天天综合影院91| 激情婷婷综合久久| 91色黑人少妇| 久久精品国产AV一区二区三区| 国产精品肉丝自拍| 91精品人妻偷情| 日本一区二区三区精品| 日韩中文字幕国产| 嗯嗯啊啊视频一区二区三区| 日逼视频日本| 黄色一区三区| 婷婷色导航| 久9爱精品| 日韩欧美经典在线观看| 极品肉射| 红桃视频高潮| 日本东京热加勒比久久| 超碰久在线天天做| 福利色色| 91亚洲人| 久久av色| 男人的天堂一区三区| 清纯唯美综合亚洲| 玖玖97综合| 国产精品分类在线观看| 色综合久久夜色精品国产天堂| 国产av强奸美女| 久久久久久久久国产| 亚洲砖码砖专无区2023| 26uuu最新| 99色婷婷中文字幕乱色| 激情综合网五月婷婷五月天| 免费视频观看60秒| 精品国产乱码久久久兰草影视| 国产51色综合久久免费| 强免费黄色网址| 欧美美逼| 亚洲精品蜜桃久久久久久久| 亚洲国产日韩欧美熟妇在线| 九九碰九九爱97超碰| 97爱爱影院| 韩日无码在线观看| 天天躁日日躁狠狠躁| 国产黄色动态精品| 五月丁香综合啪啪| 国产亚洲精品激情| 免费a v| 加勒比久久av| 青青色综合| 色五月综合网| 国产超碰人人爽人人做| 国产内射爽爽大片| 国产一区二区精品久久久不卡蜜臀| 青青草视频久久| 亚一综合久久久久久久久久| 日本一区不卡| 天天影视综合色| 91在线限制级| 欧美色图中文字幕| 丁香五月偷拍| 97欧美性爱| 亚洲精品久久久久毛片A片拉屎| 97精品久久久久中文字幕| 日本狠狠干| 国产精品无套内谢| 国产一级不卡在线观看| 天天看夜夜看日日干| 亚洲 欧美 综合 91| 日韩在线AB| 人人色人人操在线| 韩国黄片aaaa| 国产黄色影片在线观看| 国产毛片久久久久久久| 国产精品人人爽人人做可爱福利| 久久专区| 亚洲成人在线高清| 波多野结衣之双飞调教在线播放| 青青草一区二区高清无码视频 | 国产福利精品98视频| 精久久久| 亚洲色欲天天天堂色欲网女| 天天拍夜夜| 91蜜桃传媒精品久久久一区二区| 亚洲drav色图| 日韩视频小说在线观看| 欧美日韩精品国产91| 啊啊啊啊啊在线观看网址 | 超碰97网址| 亚洲 图片 综合91| 天天综合91在线| 欧美色五月| 色爱三区| 色丁香久久| 国产精品自在线发布| 黄色av网站在线播放| 一级片视频啪啪| 高清孕妇孕交| 成年人网站在线免费观看| 久久精品黄色| 国产精品又黄又猛又粗| 精品国产三级av韩国在线| 精品亚洲天堂| 97在线观看免费视频| 日本阿v天堂在线观看| 青草精品视频-日本久久久久网站| 欧美色干| 青娱乐淫乱1314| 成人精品水蜜桃久久久久久久| 99精品丰满人妻无码| 精品二区久久| 综合久久97| a一区二区三区乱码在线| 天天色天天干天天爱| 国产午夜无码片在线观看影视| 色香色欲天天综合网天天来吧| 欧美日韩成人在线| 97色97好| 东京热AV男人的天堂| 夜夜欧美| 岛国黄| 国产AV久久久蜜爱影集| 超碰97欧美在线 | 中文字幕一区二区免费在线| 欧美黄色片AAAAA| 91视频国品一二三区| 天天综和| 欧美色图99| 久久久久亚洲Av无码专区老牛影视| 黄色成人网久久久久久| 强歼乱伦资源网| 噜噜在线| 色眯眯av| 精品欧美老熟女一二区| 中国一区二区亚洲人妻| 一区二区久久天天干狠狠| 亚洲性感丝袜诱惑在线观看| 日本二三四区| 婷婷丁香五月天综合东京热| av在线浏览| 综合网亚洲1| 亚洲春色一区二区三区| www.超碰在线| 日日干夜夜欢| 无码操逼视频一下| 大香交伊人网| 久久9精品网站| 国产一区二区二区按摩精品啪视频| 欧美日韩日产免费网站看| 99成人| 激情综合网一盗摄| 懂色中文一区二区三区| 夜夜嗨一区二区| 国产精品69久久久久孕妇欧美| 成人精品在线免费视频| 狠狠五月天| 天天天操天天天爱| 偷拍三区| 大香蕉天天看妹子| 中文乱码字幕观看| 99激情视频| 亚洲在线A| 综合五月婷婷亚洲一区| 操B久久| 91香蕉国产尤物视频| 免费观看啪视频| 肉丝无码中文高清| 特级毛片特黄久久免费看| 青青操少妇| 超碰免费人妻人人| 岛国小电影| 国产色产精品在线观看| 狠狠操夜夜操蜜桃视频三区| 久久丝袜| 视频二区美腿丝袜制服人妻欧美| 欧美碰碰综合色| 第一高清av中文字幕| 五十路人妻在线| 日韩精品在线观看观看| 国产青视频| 国产无码三级视频在线观看| 一区麻豆 高清中文字幕| 99在线精品视频| 99re视频在线观看这里只有精品| 激情小说激情视频| 激情综合97| 9久久久久| 国产伊人自拍| 超碰免费人妻人人| 九九九九九九九九九五码| 免费观看性欧美一级| 吉川爱美亚洲二区在线| 国产精品久久久久久片| 91久久婷婷| 天美传媒国产原创中文字幕亚洲欧美另类 | 日韩操p| 伊人精品视频| 欧美劲爆视频一区二区| 激情综合 婷婷五月 红杏 | 蜜臀久久99精品久久久久久无删减 | 在线观看啊啊啊啊啊| 乱老女人一区二区视频| 国产一级高清免费观看| 国产25页| 九月婷婷| 爽极品影院| 日本ZZ高免费A级视频| 九九av| 亚洲国产成人精品999| 欧美日韩另类字幕中文| 精品人妻伦一二三区久久| 亚洲中字幕日本一区二区三区| 大香蕉伊在线久草麻豆天堂故事| 青娱乐久久艹| 中文字幕三四区| 欧美亚洲涩涩| 久久婷婷国产一区二区色| 一区不卡在线观看av| 中出20p| 殴美牲| 美女操逼福利视频| 大香蕉一级黄色片久久| 男人天堂久久精品不卡| AV一二区| 国产精品电影| 久久av一级av少妇av高潮 | 久久欧美1卡2卡3| 欧美人妻一区| 我要去看2个日本美女.com曹逼| 久久超碰98| 夜色五月天| 亚洲国产精品无码AV在线| 久久啊啊| 91大香蕉伊人| 加勒比伊人综合| 97亚洲国产影视| 亚洲AV无码国产成人| 精品日韩人妻精品一二三区| 日逼97| 人妻激情在线视频| 欧美色图成人网一区二区 | 国产偷人伦激情在线观看| 青青久久久| 久9久9精品| 国产精品经典一卡久久久 | 妇女乱色二区| 日韩精品国模| 久啪| 亚洲欧美精品久| 中日韩久久人妻一区二区| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 91啪啪| 青娱乐黄色录像| 久久久少妇诱惑精品视频| 1区2区3区中文字幕日韩| 天综合中文| 日日日日日| 91美女视频在线| 91亚洲人电影| 神马精品视频| 97亚洲国产影视| AV天天在线观看| 久久午夜伦| 五月天激情四射| 亚洲欧美经典一区二区| 欧美综合区| 国产av美女被艹的乱叫| 人妻在线视频| av凤凰久久久| 99精品久久| 激情综合五月| 日本久久久久久久久| 亚州宗合另类| 男人的天堂在线2| 歐美一級亂黃99在綫精品| 欧美少妇第一页| 欧美激情片一区二区| 四季AV综合网址| 亚州中文字幕超碰97| 后入式在线免费观看60秒| 亚洲在高跟鞋自慰久久在色线| 婷婷美人网| 精品中文一区二区| 殴美色网| 成人羞羞视频国产| 蜜乳AV.COM| 国产一级黄色片在线观看| 岛国片在线观看视频亚洲| 婷婷五月影院| 欧美亚洲国产自久久| 久久久久网站-538在线视频-欧美永久乱码 | 黄色欧美性爱视频| www.夜夜| 欧亚久久偷拍视频| 淫穴高潮色图| 久热一区二区| 国产Aα| 无码国产精品午夜不卡(| 亚洲麻豆精品二区三区| 97香蕉人人乳| 精品国产乱码久久久久久久久久毛片| 嗯嗯啊好爽| 超碰国产精品久| 中日高清无码操逼视频| 日本美女性生活久久久久久久| 天美一二三在线观看Av| 女上位精品在线| 色婷婷一区二区三区久久| 无码精品久久| 丁香六月婷婷久久综合| 91熟女综合| 成人无码欧美一级A片狼牙直播| 小说区 图片区色 综合区| 午夜寂寞欧美| 欧美色图私拍91| 97伊人超碰| 亚洲好看强奸乱伦| 婷婷亚洲中文字幕在线| 午夜AV污污污| 日欧操屄| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 亚洲一二三四区机械| 好舒服视频| 国产精品一区二区三区在线| 岛国激情视频软件| 久久久久久亚洲精品不卡人乳| 日本淫穴在线| 起碰97| 麻豆国产96在线| 一区二区三区日韩欧美 | 亚洲一欧洲中文字幕在线| av草草在线电影| 97久久网| 在线不卡视频| 日本一久是| 欧美乱伦专区| 狠狠色色| 五十路成人在线视频二区三区| 操b在线观看| 狠狠狠狠狠| 人妻大香蕉| 91丨九色丨国产丨人妻在线| 天天综合网一91网| 骚货操死你| 欧美性爱视频免费一区一A| 国产白嫩精品久久| 天天澡天天爽日日AV| 六月天婷婷| 熟妇人妻精品一区二区| 极品极品色影院| 91超碰丝袜制服| 色情乱伦AV| 麻豆精品三区视频| 国产精品无码av嫩草| 国产青视频| 国产精品永久免费10000| 热天堂一区二区| 综合网亚洲| 精品国产丝袜一区二区三区乱码 | 美国日韩黄片| 欧美一区二区三区大综合| 天天看天天日天天操| 91美女在线精品视频| 久久久一区二区三区四区五区| 日韩婷婷| 天天做天天爱| 中文字幕一区 二 区 三 四 五 区日 日 骚| 亚洲天堂资源在线| 五月婷婷综合网| 久久久久久久9| 亚洲人成色9999精品久久 | 九九久久国产精品| av在线免费一区二区| 黄色av播放免不| 婷婷午夜| 超碰在线人妻中文字幕| 牛牛久久国产精品视频一二三| 久久人人爽爽人人爽人人片αV| x97av| 色五月大香蕉| 国产午夜福利专区综合| 后入式在线免费观看60秒| 91艹B视频| 91熟女视频网| 精品国产乱码久久久久久久久1 | 欧美自拍偷拍综合图片| 亚洲污污网站| 久久激情网| 久久大黄片| 亚洲第91页| 亚洲AV永久无码一区仙野| 欧美亚洲丝袜人妻制服中文99| Av色五月| 高跟丝袜AV专区国产| 91欧| 九X超碰| 麻豆啪啪啪视频| 蜜臀在线视频| 东北操逼| 亚洲国产剧情少妇激情| 色噜噜精品一区二区三| 九七色图| 热热色色综合| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 人人插人人搞人人操| 日韩在线观看三级电影| 欧美丝袜美女电影一二三四区| 亚洲人妻一区二区三区| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 中文字幕精品一区二| 少妇熟女视频一区二区三区| 抽查国产福利主播| 操操碰| 黄片免费看的| a'v在线资源| 欧美成人四级在线播放| 欧美亚洲首页| 在线电影亚洲色图| 熟女欧美日韩综合婷婷| 五月丁香综合| 久久欧美性爱视频| 国产网红精品| 人人操,人人插| 亚洲黑人在线| 天天久久久久久| 亚洲日韩乱码中文无码蜜桃臀网站| 亚州色交| 五月天开心网| 超碰九色| av天堂5| 婷婷午夜成人色中色| 1769一区| 亚洲啪啪综合?v一区综合精品区| 欧美激情 亚洲色图| 伊人少妇久久久| 精品人妻一区二区三区视频| 国产传媒一区日韩| 人人污日韩一区二区| 91狠婷| 六月婷婷综合| 色噜噜婷婷| 91性高潮久久久久久久久| 911粉嫩人妻| 亚洲午夜福利在线影院| 欧美,日韩综合久久| 日本性爱欧美性爱| 黄片qw| 国产一区二区三区白丝| 国产Av超碰| 亚洲日韩视频二区| 岛国大片国产| 日韩一级特黄av毛片| 一类av片在线看| 精品成人动漫一区二区| 黄页视频网站野外| 亚洲精品aa久久伊人| 韩国三级理论在线| 亚洲午夜AV| 天天日天天爽| 亚洲情色五月天 | 天天射天天操天天干天天吃2018| 婷婷色色五月天福利| 欧州一区二区三区四区| 久久av无码| 国产免a费看黄片在线| 日韩欧美tv一区二区在线观看| 国产精品干干干| 国产超碰人人爽人人做| 五月婷婷性爱| 在线啊啊啊啊| 久偷拍欧美日韩三区| 天天爽入口| 亚洲成人贴图| 中国一级操逼视频| 91狼人| 人妻天天操天天爽视频免费| 国产一区麻豆免费观看| 久久精品中文| 粉嫩av一区二区三区天美传媒 | 一二三四日本视频高清| 国产成人AV麻豆| 欧美手机在线综合| 五月亭亭六月丁香| 人人插人人摸人人| 综合色图亚洲欧美| 大香蕉之青青草原| 人爽不卡视频| 三级特黄60分钟播放| 嫖老熟女A片一二三区| 亚洲精品 大香蕉| 亚洲少妇在线影音| 综合五月天| 美国精品国产精品| 丁香五月激情网| 精品性爱久久视频| 国产精品第一页国产大屁股视频免费区| 91福利网在线观看| 婷婷色影院| 四虎免费看黄| 亚洲熟妇A V黑人| 日本不卡高清视频| 青青草自拍视频在线播放| 啊啊啊啊啊好舒服视频| 又粗又长又大国产不卡| 91小视频| 99xav| 亚州综合色| 国产自偷自拍一区| 97国产天堂岛| 试看日韩黄片| 91精品国产麻豆国产自产在| 国产美女激情| www国产无码| 东京热免费视频| 狠狠2050在线观看| 2023天天操夜夜操| 99色视频| 一本大道久| 鸡巴插逼视频| 91色伦综合| 秋霞网无码| 91久久久久久久久久久| 久九九九九九九九热| 日韩乱中文| 国产精品色哟哟| 啊啊啊好想要| 天天爽天天爽| 久久9久久| 国产成人无码网站在线视频| 亚洲高清少妇| 久操网视频| 美女91| 九九内射在线| 黄色成年| 色99视频| 国产精品久久久亚洲第一牛牛_在线观看 | 中文字幕精品探花视频| 99综合免费视频| 久久99干一本高清| 久久性爱大全| 女人18精品一区二区三区| 在线强奷到舒服的无码视频| 超碰97欧美日韩| 福利视频一区二区微拍| 东北女人操比视频| 国产自产自拍| 欧美少妇一区二区三区| 九七毛片九九毛片 | 久久精品99久久久久久| 黄色小视频日本txt| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日韩 女同 综合| 老司机老司机午夜影院| 伊人在线大香蕉二。| 久久香蕉国产线看观看猫咪av| 久久超碰av在线| 爱做久久久久久| 99久久久| 97超碰jingpin| 国产家庭乱伦表演| 日韩欧美偷拍美女视频| 人人妻人人狠人人| 高清无码91| 夜夜嗨AV一区天天| 欧美福利视频啊啊啊啊| 欧美日韩少妇色情| 人人操人人叉人人插人人| 青青草综合在线| 欧美制服网站美腿丝袜| 国产无码高清操逼视频| AV久日| 国产玖玖| 国产亚洲日韩欧| 人妻无码视频一区二区三区久久| 中文字幕在线免费观看视频| 97香蕉网| 天天插天天操天天摸天天射天天看| 亚欧国产无码精品在线| 综合 亚洲 欧美| 少妇人妻精品| 睡产熟女乱伦| 久久永久无码人妻视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 四虎在线观看视频| 伊人国产视频| 久久五月综合| 另类小说综合网| 熟女熟妇一区二区三区视频| 东京太热久久久| 青娱乐国产精品| 综合久久97| 91国产伊人大香蕉| 97国伦国色| 午夜一区| 亚洲人妻在线一区| 亚洲97| 久久成人东京热人妻| 青青草亚洲一区| 色爱综合网| WWW啪啪的com| 97日韩| 91九色丰满高潮| 综合网亚| 天天日B狠狠操| 操逼逼无码| 日逼逼免费看| 人人操人人色网| 密臀成人视频久久久| 青青草五月天| 九九热九九热| 五月丁香激情啪啪| 黄片aaaaa一区| 国产兽交视频在线播放| 99热在线播放| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | rivers-china.com| AV99热18这里只有精品| 九一亚洲国产免费| 亚洲精品丝袜-不卡成人免费…… 久久久久成人蜜桃精品 | 日本午夜操逼| 精品国产无码中文| 亚洲国产另类在线中文| 久操国产在线| 日产精品久久久一区二区| 亚洲精品白丝| 精品久久大胆人体| 超硑97精品| 精品国产网站| 嗯嗯嗯嗯啊啊啊好紧好大| 五月丁香综合网| 青青草天天亲夜夜操网| 免费操逼视频下载| 凹凸视频在线观看伊人| 密乳AV免费观看| 乱操乱伦AV| 国产福利一区二| 思思热在线视频免费| 婷婷色综合欧美日韩| 久久专区| 东京热一区二区中文字幕| 日韩97P| 国产在线播放成人免费| 亚洲天堂男人的天堂| 东京热综合久久一区二区| 久久久久熟女| 天美传媒AV在线| 91欧美在线| 色99999| 青青操网| 26uuu偷拍亚洲欧洲综合| 小视频国产| 日韩欧美中文日韩欧美色| 秋霞蝌科网日本一区| 亚洲啪啪视频一区二区| 日本人人操人人操| 欧美性爱另类综合| 成人 日韩欧美一区| 精品四五区| 久久中文色图| 校园春色宗合网| 一级免费精品| 久久超碰日韩精品| 一区AV| 欧美性爱中文字幕无线码| 欧美三级中文字幕hd| 亚洲AV免费在线| 99久久久无码| 天美传媒AV国产在线| 97国产精品久久久久| 高清无码91| 好爽视频在线观看视频 | www.99中文字幕| 999岛国大片| 久久久999日本大片| 亚洲蜜臀懂色| 亚洲情色综合网| 婷婷五月天激情四射| 亚洲乱色熟女一区| 无码抄逼网| 高清不卡一二三区视频......| 加勒比日本在线| 九九九草| 亚洲综合91| 国产福利在线视频网站| 97人人射| 伊人国产视频| 欧美se综合| 欧美日韩色综合网| 深爱激情五月天| 欧美A√综合网 | 中文熟女五十乱码在线| 欧美在线天堂| 强奸国产在线| 久久国产三区| 精品视频久久区| 熟妇乱伦一区二区| 人、人、摸,人、人、草| 色一射色一射| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 天堂射| 亚洲加勒比| 日韩亚洲Av人人夜夜澡人人爽| 国产精品天美传媒| 亚洲成人帖图| 人人贴人人摸| 东京热激情视频一二三区| 久久宗合亚洲| 黄色香蕉视频网站一区| 婷婷爱五月| 91精品少妇搡搡搡| 无遮挡一级毛片视频免费的| 男人夜色天堂ss| 九九久精品| 美女写真| 欧美中文狠| 国产乱伦视频污| 这里只有精品久久| 33044男人的天堂深夜备| 国产精品国产自产高清AV| 日韩中字av一区| 天天狂操夜夜狂日| 国产乱伦一二三区| 99re6国产精品99re| 天天躁日日躁成人字幕aⅴ| 青青11操操操操操操操操| 大香蕉99re| 日韩激情啪啪| 91 国产丝袜在线播放-百度| 国产成人自拍视频视频| 日本丝袜美腿人妻九九| 久操电影| 俺去久久| 白丝一区| 狠狠久久四虎| 男人天堂电影院| www鬼畜国产男人的天堂| 欧美色图亚洲色| 六九九九| 国产60页| 内射中出日韩在线观看视频| 97综合网| 尤物av网站| 91AV入口| 亚洲欧美性生活| 51国产午夜精品视频| 久久国产视频专区一二三| 97在线视频免费观看| 中亚精品极乱| 在线视频97| 色女网日韩| 午夜国产成人精品视频| 亚洲国产一级中文综合久久天堂在线免费观看 | 亚洲丝袜二区在线| 91超级碰| 狠狠超| 欧美大码在线视频| 操逼无码操逼| 久久精品夜色国产亚洲AV| 性影在线视频| 18禁久久| 志村玲子视频一区二区| 97免费视频在线观看| 精品久久久九九九孕妇| 国产在线观看一区二区三区| 欧美永久激情一区二区| 操人妻丝袜高跟| 农村女一级毛卡片| 色五月第四色| 五月天玖玖资源站| 日韩91网站| 成人无码专区精品视频| 亚洲激情综合另类男同| 亚洲国产中文字幕| 色情成人五月天| 视频一区二区三区精品| 成人欧美日超碰| 国产99 中文字幕日韩小视频| 91熟女丨91老女人| 久久超碰97中文字幕| 成人午夜小视频手机在线看| 亚洲中文丝袜美腿诱惑字幕| 日本熟妇熟色97一本在线观看| 中文字幕高清精品一区| 99re在线视频这里只有精品| 大香蕉亚洲中文| 黄色大片免费在线| rivers-china.com| 久久这里精品国产99丫e6| 亚洲成人日韩小说| 狠狠爱大香蕉| 亚州高清色综合| 中文字幕 码 自拍 视频 区| 青青青国产手线观看视频2| 乱操9999| 日韩懂色网| av九九| 国产女人和拘做爰视频| 亚洲欧洲日韩中文字幕一区| 欧美 日韩 国产传媒| 丁香五月激情综合国产| 91视频伊人| 熟女熟妇一区二区三四区| 亚洲揄拍网| 欧美综合骚| 精品性爱无码在线播放| 四虎国产精品永久入口| 中文字幕AV中出| 成人精品欧洲亚洲| 国产大片精久久久久久| 九九性爱网| 久久精品中文字幕观看| 国产精品久久| 91精品国| 免费超碰97久久| 日韩精品高清资源在线| 五月天激情小说| 日本五十路熟女一区二区| 视频国产欧美在线播放| 天天干天天拍| 91亚洲欧美色图| 久久久一区二区三区四曲免费听 | 国产剧情一区在线观看| 亚欧高清在线| 天天操天天干一区二区 | 中文字幕高清精品一区| 欧美色乱| 操久久久久| 国产AV天美传媒一区二区三区| 久久欧洲| 欧美一区二区在线资源| 91碰碰| av一区二区三区 中文| 性在久久久久久| 俄罗斯一区二区视频在线观看| 中文字幕欧美丝袜07资源| 国产嫩草精品A88AV| 人妻天天爽夜夜爽2| 国产亚洲日本| 亚洲限制级| 性色av一区二区| 78久久久| 欧美精品第四五页中文字幕在线观看| 啊啊啊 在线观看| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 亚洲限制级| 日韩午夜国产| 色欲人妻一区二区在线| 男人的天堂色偷偷青青草视频婷婷网| 91 丝袜在线| 高树玛利亚无码流出| 嫩草 人人网精品| 久久久久久久久久久久久久久乱码| 旡码电影特区| 蜜桃臀 后入 一区 二区 三区 在线| 精品夜夜澡人妻无码| 天无日色综合| 啪啪91| 天天爽夜夜欢视| 精品亚洲俞拍视频一区| 亚洲青色欧美| 久久机热| 国产999精品久久久| 青青草毛片| 強姦亂倫a| 最新的亚洲无吗| 亚洲天堂 视频你懂的|