音視頻開發_SDL事件處理

今天我為大家介紹一下SDL的事件處理。這里所指的事件處理就是我們通常所說的,鍵盤事件,鼠標事件,窗口事件等。

SDL對這些事件都做了封裝,提供了統一的API,下面我們就來詳細的看一下。

SDL中的事件處理

要想了解 SDL 的事件處理,我們必須要知道的一個原理是,SDL將所有事件都存放在一個隊列中。所有對事件的操作,其實就是對隊列的操作。了解了這個原理后,我們再來說SDL提供的 API 就很容易理解了。

  • SDL_PollEvent: 將隊列頭中的事件拋出來。
  • SDL_WaitEvent: 當隊列中有事件時,拋出事件。否則處于阻塞狀態,釋放 CPU。
  • SDL_WaitEventTimeout: 與SDL_WaitEvent的區別時,當到達超時時間后,退出阻塞狀態。
  • SDL_PeekEvent: 從隊列中取出事件,但該事件不從隊列中刪除。
  • SDL_PushEvent: 向隊列中插入事件。

SDL只提供了這樣幾個簡單的API,下面們來介紹幾個常見的事件:

  • SDL_WindowEvent : Window窗口相關的事件。
  • SDL_KeyboardEvent : 鍵盤相關的事件。
  • SDL_MouseMotionEvent : 鼠標移動相關的事件。
  • SDL_QuitEvent : 退出事件。
  • SDL_UserEvent : 用戶自定義事件。

關于事件更加詳的信息可以到 SDL Wiki 上進行查詢。現在我們來看一個使用的例子吧。

例子

在我們之前文章的例子中,大家已經發現一個問題,那就是窗口只顯示了 3 秒鐘,之后就自動消失了。

有的同學可以會通過修改代碼最后面的 SDL_Delay 函數,增加它的等待時間讓窗口多活一段時間。

但這樣的體驗實在是太糟糕了。有沒有一種好的辦法可以解決這個問題呢?能不能窗口一直顯示,直到檢測到用戶按了ctrl+c 或 使用鼠標點擊關閉按鈕后才關閉呢?

當然是可以的。我們只需要在之前的程序的末尾增加下面這段代碼即可。它會一直檢測用戶是否按下了退出按鈕。如果檢測到了,則直接退出,否則保持顯示狀態。

while(!quit){SDL_Event event;while(SDL_PollEvent(&event)){switch(event.type){case SDL_QUIT:quit = 1;break;default:SDL_Log(".");}}
}

SDL_PollEvent 與 SDL_WaitEvent

增加了上面的代碼,我們的實驗程序似乎也顯的很正規了。但有一個問題不知你發現沒有
?當我們打開任務管理器時,發現我們的程序居然占了 100% 的 CPU。My GOD!這個的結果是決對不能接受的。

是什么原因造成的呢?我們來仔細看一下我們增加的代碼吧。它由兩層 while 循環組成,最里面的while循環的意思是,當隊列中一直能取出事件,那就讓他一直做下去,直到事件隊列為空。外面的while循環的意思是,當隊列為空的時候,重新執行內部的while循環。

也就是說,這段代碼一直在工作,從不休息。所以導致cpu占到了100%。即然找到了問題的原因,我們就好處理了,只要在外層循環的最后 delay一下,讓CPU休息一下就好了。

當然,SDL還為我們提供了 SDL_WaitEvent方法,使用這個API,你的CPU就不會跑到 100%了,因為當它發現隊列為空時,它會阻塞在那里,并將CPU釋放掉。

即然有 SDL_WaitEvent了,為什么還要有SDL_PollEvent呢?這主要是由于使用的場景不同。對于游戲來說,它要求事件的實時處理; 而對于一些其它實時性不高的case來說,則可以使用 SDL_WaitEvent了。

小結

到此,本文的內容就介紹完了。在本文中主要介紹了SDL是如何處理事件的,SDL為我們提供了非常簡單的API,這大大減少了我們的開發成本。

另外,我在文章的最后,介紹了SDL_PollEvent 與 SDL_WaitEvent兩個 API的區別。這也是使用 SDL 事件處理中最容易引起困惑的地方。

粉絲福利,費領取Qt開發學習資料包、技術視頻,內容包括(Qt實戰項目視頻教程+代碼,C++語言基礎,C++設計模式,Qt編程入門,Qt信號與槽機制,Qt界面開發-圖像繪制,Qt網絡,Qt數據庫編程,Qt項目實戰教程,QSS,OpenCV,Quick模塊,面試題等等)↓↓↓↓↓↓見下面↓↓文章底部點擊費領取↓↓

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20595.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VB.net進行CAD二次開發(四)

netload不能彈出對話框&#xff0c;參考文獻2 參考文獻1說明了自定義菜單的問題&#xff0c;用的是cad的系統命令 只要加載了dll&#xff0c;自定義的命令與cad的命令同等地位。 這時&#xff0c;可以將自定義菜單的系統命令替換為自定義命令。 <CommandMethod("Add…

STL-queue的使用及其模擬實現

在C標準庫中&#xff0c;隊列(queue)是一種容器適配器&#xff0c;它以先進先出的方式組織數據&#xff0c;其中從容器一端插入元素&#xff0c;另一端取出元素。 queue的使用 queue的構造函數 queue的成員函數 empty&#xff1a;檢測隊列是否為空size&#xff1a;返回隊列中有…

代碼隨想錄算法訓練營 day23| ● 669. 修剪二叉搜索樹 ● 108.將有序數組轉換為二叉搜索樹 ● 538.把二叉搜索樹轉換為累加樹

文章目錄 前言669. 修剪二叉搜索樹思路方法一 遞歸法方法二 迭代法 108.將有序數組轉換為二叉搜索樹思路方法一 遞歸法方法二 迭代法 538.把二叉搜索樹轉換為累加樹思路方法一方法二 總結 前言 迭代法都沒看主要是669和538【538很簡單】 669. 修剪二叉搜索樹 思路 不用看教程…

【C++刷題】優選算法——位運算

常見位運算操作總結&#xff1a; 基礎位運算 &&#xff1a;有0則為0 |&#xff1a;有1則為1 ^&#xff1a;相同為0&#xff0c;相異為1 / 無進位相加運算符的優先級 管它什么優先級&#xff0c;加括號就完事兒了給一個數 n&#xff0c;確定它的二進制表示中的第 i (默認是從…

【基本數據結構】平衡二叉樹

文章目錄 前言平衡二叉樹1 簡介2 旋轉2.1 左旋2.2 右旋2.3 何時旋轉 3 插入節點4 刪除節點5 代碼 參考資料寫在最后 前言 本系列專注更新基本數據結構&#xff0c;現有以下文章&#xff1a; 【算法與數據結構】數組. 【算法與數據結構】鏈表. 【算法與數據結構】哈希表. 【…

【斯坦福因果推斷課程全集】1_隨機對照試驗1

目錄 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 隨機對照試驗&#xff08;RCT&#xff09;是統計因果推論的基礎。如果有的話&#…

關于FPGA 使用SPI FLASH固化時如何配置固化參數

關于FPGA 使用SPI FLASH固化時如何配置固化參數 EDA工具&#xff1a;Vivado 關于FPGA 使用SPI FLASH固化時如何配置固化參數一、引言二、如何設置固化參數&#xff1a;使用50M的速度 &#xff0c;SPI為X4 &#xff0c;以及bit壓縮第一&#xff1a;點open implenment design第二…

Android之onMeasure的三種模式

Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}在 Android 中&#xff0c;onMeasure() 方法是 View 或 ViewGroup 中的一個重要方法&#xff0c;用于測量視圖的大小。在 onMeasure(…

安裝軟件缺少dll文件怎么辦,分享多種解決dll問題的方法

在計算機使用過程中&#xff0c;我們經常會遇到安裝軟件時提示缺少dll文件的問題。這種情況通常會導致軟件無法正常運行或啟動。為了解決這個問題&#xff0c;我總結了以下五種方法&#xff0c;希望對大家有所幫助。 一&#xff0c;了解DLL文件是什么 動態鏈接庫&#xff08;D…

簡單說說我對集成學習算法的一點理解

概要 集成學習&#xff08;Ensemble Learning&#xff09;是一種機器學習技術框架&#xff0c;它通過構建并結合多個學習器&#xff08;也稱為個體學習器或基學習器&#xff09;來完成學習任務。 集成學習旨在通過組合多個基學習器的預測結果來提高整體模型的性能。每個基學習…

常見儀表盤指示燈的含義,這次夠全了!

汽車是當前主要的交通工具之一&#xff0c;給人們的工作、生活提供了便利。大家在學會開車的同時&#xff0c;也得了解一些基本的汽車常識&#xff0c;可以及時的發現車輛的問題&#xff0c;并作出正確的判斷&#xff0c;以此降低車輛的損耗和維修成本。其中最基本的&#xff0…

房產證上加名?手把手教你操作,省錢又省心!

隨著《民法典》的實施&#xff0c;房產的權屬問題愈發受到重視。夫妻雙方及其親屬常希望能在房產證上增添自己的名字&#xff0c;以保障各自的權益。那么&#xff0c;房產證上到底能寫幾個名字呢&#xff1f;以下是對這一問題的詳細解答。 一、房產證命名無固定限制 在購房時&…

準確-K8s系列文章-修改containerd 默認數據目錄

修改 Kubernetes 集群中 containerd 默認數據目錄為 /data/containerd 前言 本文檔適用于 Kubernetes 1.24 及以上版本的集群,介紹如何將 containerd 默認的數據目錄從 /var/lib/containerd 修改為 /data/containerd。 步驟 1. 停止 containerd 服務(慎重!!!需評估風險!…

iOS中的UIScene和UISceneDelegate

目錄 ???????前言 一、AppDelegate和SceneDelegate的關系 1.AppDelegate 2.SceneDelegate 3.info.plist配置 4.生命周期方法對比 1.應用啟動 2.進入前臺 3.進入后臺 5.何時使用AppDelegate和SceneDelegate 1.AppDelegate 2.SceneDelegate 前言 在iOS 13及之…

Linux內核編程入門:深度探索與實戰挑戰

Linux內核編程入門&#xff1a;深度探索與實戰挑戰 在操作系統的心臟地帶&#xff0c;Linux內核以其強大、靈活和開源的特性吸引著眾多程序員。對于那些渴望深入了解系統底層機制并親手塑造操作系統的勇士們&#xff0c;Linux內核編程無疑是一個極具挑戰性和吸引力的領域。本文…

民國漫畫雜志《時代漫畫》第39期.PDF

時代漫畫39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Qt for Android : 使用libusb做CH340x串口傳輸的底層USB庫

簡介 Qt for Android自帶的串口方案并沒有適用在高的API版本中&#xff0c; 會出現permission denied的訪問問題&#xff0c; 所以就需要使用Android API&#xff0c; 也就是在CPP中使用JNI方式進行調用&#xff0c; 為了開發的方便&#xff0c; 使用libusb庫作為替代的底層usb…

SpringBoot注解--10--@Bean,對象注入的三種方法

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Bean一、如何使用方法注解注意Bean 的命名規則&#xff0c;當沒有設置 name 屬性時&#xff0c;那么 bean 默認的名稱就是方法名&#xff0c;當設置了 name 屬性之后…

解析Java中1000個常用類:Runnable 類,你學會了嗎?

在 Java 編程中,處理并發和多線程是一個重要的主題。為了簡化多線程編程,Java 提供了多種工具和類,其中最基本的一個工具就是 Runnable 接口。 Runnable 接口為創建和管理線程提供了一種標準的方式。本文將詳細介紹 Runnable 接口的定義、實現原理、應用場景,并通過示例展…

33【Aseprite 作圖】樹——拆解

1 樹葉 畫樹葉真累啊&#xff0c;可以先畫一個輪廓&#xff0c;細節一點點修 2 1 2 &#xff1b;2 2 2 &#xff08;橫著橫&#xff09;&#xff0c;這樣一點點畫樹葉 填充顏色&#xff0c;用了噴霧工具 2 樹干部分 輪廓部分&#xff0c;左邊的是3 3 3 &#xff1b;上下都是…