作者:星隕
來源:
音視訊開發進階建立 SDL 視窗
通過 SDL 中的
SDL_CreateWindow
函數就能夠建立了,
extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(
const char *title,
int x, int y, int w,
int h, Uint32 flags);
其中,
title
就是視窗的标題,
x
,
y
width
height
就是視窗的左上角坐标點和寬高值。
最後的
flags
參數有很多類型,不同的類型對應不同的視窗功能,比如視窗全屏、是否可見等,具體可以在 SDL 源碼中找到。
這裡簡單設定成如下:
int width = 400;
int height = 400;
SDL_Window *window = SDL_CreateWindow("Hello SDL",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
width,height,
SDL_WINDOW_ALLOW_HIGHDPI);
對于視窗的左上角坐标點使用 SDL 預設的宏
SDL_WINDOWPOS_CENTERED
讓它居中顯示就好了,
flags
使用
SDL_WINDOW_ALLOW_HIGHDPI
。
展示 SDL 視窗
SDL_Window 并沒有什麼
show
的方法,看到網上的文章應該一建立就可以顯示出來了,如果出現随着程式退出,視窗一閃而過的情況加個
SDL_Delay
延時一段時間也行。
不過可能是由于 MAC 系統或者 SDL 版本的問題,實際上并沒有視窗彈出來,倒是在工作列中确實能看到有個程式在運作。
後來在建立視窗之後,加上如下的代碼就好了:
SDL_Event windowEvent;
while (true){
if (SDL_PollEvent(&windowEvent)){
if (SDL_QUIT == windowEvent.type){
break;
}
}
}
在程式中建立一個死循環,當做消息循環機制,隻有當滿足特定條件時才退出循環結束程式。
添加這段代碼之後在運作,就能看到視窗了。
渲染 SDL 視窗
現在還是一個黑漆漆的視窗,那是因為還沒有給它渲染上顔色。
渲染視窗,首先要建立一個渲染器,并設定渲染顔色,然後開始渲染。
如下代碼所示:
SDL_Renderer* pRenderer = NULL;
// 建立渲染器
pRenderer = SDL_CreateRenderer(window, -1, 0);
// 指定渲染顔色
SDL_SetRenderDrawColor(pRenderer,0,255,0,255);
// 清空目前視窗的顔色
SDL_RenderClear(pRenderer);
// 執行渲染操作,更新視窗
SDL_RenderPresent(pRenderer);
調用
SDL_CreateRenderer
方法來建立渲染器,并通過
SDL_SetRenderDrawColor
來指定顔色,顔色參數都是
red
、
green
blue
alpha
四個,這裡指定了渲染為綠色。
然後通過
SDL_RenderClear
方法清空一下目前視窗上的顔色,避免和要渲染的顔色混在一起了,最後就可以執行渲染了。
這個流程和 OpenGL 的渲染操作有點類似了:
glClearColor()
glClear()
glDrawArrays()
也是先清空後渲染,實際效果如下:
這樣就建立了一個視窗,并且顯示指定顔色。
銷毀 SDL 視窗
最後,當退出循環時,要執行銷毀操作,把建立的 SDL_Window 和 SDL_Renderer 都釋放了。
SDL_DestroyWindow(window);
SDL_DestroyRenderer(pRenderer);
SDL_Quit();
這樣就完成了整個程式。
總結
以上就是音視訊基礎學習連載的
002
篇。
具體代碼見倉庫:
https://github.com/glumes/av-beginner本篇文章對應的送出
tag
為
av-beginner-002
,可切換至對應源碼檢視。
能力有限,文中有不對之處,歡迎加我微信 ezgluems 進行交流~~
SDL 系列文章「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。