雙緩衝(Double Buffer)原理和使用

来源:https://www.cnblogs.com/linhaostudy/archive/2020/02/22/12344771.html
-Advertisement-
Play Games

原文出自: "http://blog.csdn.net/xiaohui_hubei/article/details/16319249" 一、雙緩衝作用 雙緩衝甚至是多緩衝,在許多情況下都很有用。一般需要使用雙緩衝區的地方都是由於“生產者”和“消費者”供需不一致所造成的。這樣的情況在很多地方後可能會發 ...


原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249

一、雙緩衝作用

雙緩衝甚至是多緩衝,在許多情況下都很有用。一般需要使用雙緩衝區的地方都是由於“生產者”和“消費者”供需不一致所造成的。這樣的情況在很多地方後可能會發生,使用多緩衝可以很好的解決。我舉幾個常見的例子:
例 1. 在網路傳輸過程中數據的接收,有時可能數據來的太快來不及接收導致數據丟失。這是由於“發送者”和“接收者”速度不一致所致,在他們之間安排一個或多個緩衝區來存放來不及接收的數據,讓速度較慢的“接收者”可以慢慢地取完數據不至於丟失。

例2. 再如,電腦中的三級緩存結構:外存(硬碟)、記憶體、高速緩存(介於CPU和記憶體之間,可能由多級)。從左到右他們的存儲容量不斷減小,但速度不斷提升,當然價格也是越來越貴。作為“生產者”的 CPU 處理速度很快,而記憶體存取速度相對CPU較慢,如果直接在記憶體中存取數據,他們的速度不一致會導致 CPU 能力下降。因此在他們之間又增加的高速緩存來作為緩衝區平衡二者速度上的差異。

例3. 在圖形圖像顯示過程中,電腦從顯示緩衝區取數據然後顯示,很多圖形的操作都很複雜需要大量的計算,很難訪問一次顯示緩衝區就能寫入待顯示的完整圖形數據,通常需要多次訪問顯示緩衝區,每次訪問時寫入最新計算的圖形數據。而這樣造成的後果是一個需要複雜計算的圖形,你看到的效果可能是一部分一部分地顯示出來的,造成很大的閃爍不連貫。而使用雙緩衝,可以使你先將計算的中間結果存放在另一個緩衝區中,但全部的計算結束,該緩衝區已經存儲了完整的圖形之後,再將該緩衝區的圖形數據一次性複製到顯示緩衝區。

例1 中使用雙緩衝是為了防止數據丟失,例2 中使用雙緩衝是為了提高 CPU 的處理效率,而例3使用雙緩衝是為了防止顯示圖形時的閃爍延遲等不良體驗。

二、雙緩衝原理

這裡,主要以雙緩衝在圖形圖像顯示中的應用做說明。

上面例3中提到了雙緩衝的主要原理,這裡通過一個圖再次理解一下:

image

註意,顯示緩衝區是和顯示器一起的,顯示器只負責從顯示緩衝區取數據顯示。我們通常所說的在顯示器上畫一條直線,其實就是往該顯示緩衝區中寫入數據。顯示器通過不斷的刷新(從顯示緩衝區取數據),從而使顯示緩衝區中數據的改變及時的反映到顯示器上。

這也是顯示覆雜圖形時造成閃爍的原因,比如你現在要顯示從屏幕中心向外發射的一簇射線,你開始編寫代碼用一個迴圈從0度開始到360度,每隔一定角度畫一條從圓心開始向外的直線。你每次畫線其實是往顯示緩衝區寫入數據,如果你還沒有畫完,顯示器就從顯示緩衝區取數據顯示圖形,此時你看到的是一個不完整的圖形,然後你繼續畫線,等到顯示器再次取顯示緩衝區數據顯示時,圖形比上次完整了一些,依次下去直到顯示完整的圖形。你看到圖形不是一次性完整地顯示出來,而是每次顯示一部分,從而造成閃爍。

原理懂了,看下 demo 就知道怎麼用了。下麵先介紹 Win32 API 和 C# 中如何使用雙緩衝,其他環境下由於沒有用到所以沒寫,等用到了再在下麵補充,不過其他環境下過程也基本相似。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 抗疫時期,想到弄個微信程式用於社區出入和復工復產人員流動登記,老早就買的盛派的書和視頻,一直沒時間看,趁這個需求,下載盛派weixinDSK開始學習,先是打開盛派的網站陸續無法打開, 幫助文檔也沒能搶救性下載,估計是盛派在遷移啥東西。項目生成工具也不能用了 試著把GitHub上下載的sample部署 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7966240.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第五個模式--中介者模式,先從名字上來看。中介者模式可以理解為在兩個或多個對象中間增加一個“中間對象”,由增加 的“ ...
  • SecureCRT的下載、安裝( 過程非常詳細!!值得查看) 簡單介紹下SecureCRT 一、SecureCRT的下載 二、SecureCRT的安裝 簡單介紹下SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的終端模擬程式,簡單地說是Windows下登錄UNIX或Lin ...
  • grub:GRand Unified Bootloader grub 0.x:grub legacy(centos5,6) grub 1.x:grub2(centos7) grub legacy(grub 0.x) stage1:mbr stage1_5:mbr之後的扇區,讓stage1中的boot ...
  • 今天首先學習Vim編輯器的使用,通過它可以對Linux系統的文件進行編寫和修改。在Linux系統中一切都是文件,所以熟練掌握Vim編輯器的使用十分重要。最後通過配置主機網卡的實驗,來加深Vim編輯器中諸多命令、快捷鍵、模式切換方法的理解。 一、Vim文本編輯器 Vim編輯器設置了三種模式,每種模式分 ...
  • 存儲器管理了 存儲器管理的主要模式 邏輯地址:又稱相對地址,即用戶編程所使用的地址空間,邏輯地址從0開始編號,有兩種形式:一維邏輯地址(地址),二維邏輯地址(段號:段內地址) 段式程式設計:把一個程式設計成多個段,代碼段、數據段、堆棧段、等等,用戶可以自己應用段覆蓋技術擴充記憶體空間使用量這一技術是程 ...
  • Linux發行版的兩大系列 debian:代表的比如Ubuntu,軟體包管理工具apt、apt-get、dpkg,軟體包名.deb redhat:代表的比如CentOS(所以在VMware上安裝CentOS8時選擇的版本是red hat),軟體包管理工具yum,軟體包名.rpm Ubuntu要下載. ...
  • [TOC] 重裝系統的那些事兒 話說這次寒假在家實在閑得無聊,就根據自己專業的特點,瘋狂的在電腦上安裝以後可能用得到的軟體,比如:PyChrome、DW、MATLAB、MySQL、Tomcat... 在這裡就不一一列舉了。雖然都裝上了,但哪裡用的著呢?無非就是打發打發時間罷了。正式開課之前,各科老師 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...