天天看點

【音視訊連載-002】基礎學習篇-SDL 建立視窗并顯示顔色建立 SDL 視窗展示 SDL 視窗渲染 SDL 視窗銷毀 SDL 視窗總結

作者:星隕

來源:

音視訊開發進階

建立 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;
            }
        }
    }           

在程式中建立一個死循環,當做消息循環機制,隻有當滿足特定條件時才退出循環結束程式。

添加這段代碼之後在運作,就能看到視窗了。

【音視訊連載-002】基礎學習篇-SDL 建立視窗并顯示顔色建立 SDL 視窗展示 SDL 視窗渲染 SDL 視窗銷毀 SDL 視窗總結

渲染 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()           

也是先清空後渲染,實際效果如下:

【音視訊連載-002】基礎學習篇-SDL 建立視窗并顯示顔色建立 SDL 視窗展示 SDL 視窗渲染 SDL 視窗銷毀 SDL 視窗總結

這樣就建立了一個視窗,并且顯示指定顔色。

銷毀 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 系列文章
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
【音視訊連載-002】基礎學習篇-SDL 建立視窗并顯示顔色建立 SDL 視窗展示 SDL 視窗渲染 SDL 視窗銷毀 SDL 視窗總結

繼續閱讀