採用四緩衝提高自繪介面的效率
做過自繪的朋友都知道,如果直接畫到視窗DC上,頻繁更新會導致視窗比較閃。所以大家都喜歡使用雙緩衝解決這個問題。(即先畫到記憶體DC,全部畫完了再一次複製到視窗DC上)。
在編寫DirectUI介面時,子控制元件並不是真實存在的視窗,只是直接畫到同一個視窗上的一些子區域。如果每一個子控制元件更新狀態(比如獲取焦點、滑鼠熱點及按下等狀態)都重畫所有子控制元件,那效率就低了,採用GDIPlus時這個效率的區別更明顯,CPU佔用率特別高。
為解決這個問題,我在編寫“彗星小助手”時採用了更多的快取。只根據需要更新某一控制元件的狀態。
快取A->儲存整個視窗的背景(只在視窗尺寸改變時更新)
快取B->在A的基礎上,畫出所有子控制元件
快取C->複製B,複製當前重畫子控制元件(比如“正則除錯”這個子控制元件)所佔區域的背景(即A),再畫出子控制元件(正則除錯)的最新狀態,最後複製到視窗DC(假設為D)。
這樣做,儲存了更多GDI物件,記憶體佔用會稍高,但是CPU佔用大幅度降低,不會因為子控制元件過多而導致“卡”一下的現象。子控制元件越多越明顯。
在這裡,包括視窗DC在內,一共採用了四個DC,或許應該叫四緩衝吧,呵呵。
示意圖如下:
相關文章
- Debian 12採用 Ubuntu三重緩衝Ubuntu
- MFC雙緩衝繪圖例項繪圖
- 自媒體素材網站,採集素材,提高創作效率網站
- 提高採購流程效率的方法
- 用緩衝技術OSCache 提高JSP應用的效能和穩定性JS
- 自動處理管理駕駛艙衝緩衝
- android View 繪圖雙緩衝技術AndroidView繪圖
- 採購管理系統方案:提高採購效率,降低採購成本
- 用自動ftp提高工作效率(轉)FTP
- 如何提高爬取爬蟲採集的效率?爬蟲
- PHP 輸出緩衝區應用PHP
- 用apache JCS實現物件緩衝Apache物件
- 測試C#GDI+雙緩衝高效繪圖--BufferedGraphicsContextC#繪圖Context
- 用 FutureBuilder 提高開發效率Rebuild
- 電子採購軟體如何提高企業效率?
- Libevent應用 (三) 資料緩衝
- C語言檔案與目錄(四)緩衝區C語言
- 緩衝區分析
- Java™ 教程(緩衝流)Java
- JavaScript 緩衝運動JavaScript
- MySQL InnoDB緩衝池MySql
- Java NIO:緩衝區Java
- 快取與緩衝快取
- C 呼叫redis緩衝Redis
- getchar緩衝區
- 雙緩衝學習
- 開關電源緩衝吸收電路:拓撲吸收、RC吸收、RCD吸收、鉗位吸收、無損吸收、LD緩衝、LR緩衝、飽和電感緩衝、濾波緩衝、振鈴_rc吸收和rcd吸收
- 你真的會用PostGIS中的buffer緩衝嗎?
- 物件緩衝池--採用最近最久未使用策略(LRUCache )管理物件,同時帶有事件監聽功能物件事件
- Golang併發程式設計有緩衝通道和無緩衝通道(channel)Golang程式設計
- C 標準庫IO緩衝區和核心緩衝區的區別
- 如何提高工作效率 - 自動化篇
- 提高 MongoDB 運維效率的實用技巧MongoDB運維
- Java NIO 之緩衝區Java
- Unity深度緩衝區指令Unity
- Go 緩衝通道(bufchan)用法Go
- Java整數緩衝區Java
- 【NIO】Java NIO之緩衝Java