在 SDL 開發中,視訊子系統是最常用也是最基礎的模組。這裡的「視訊」並非指影片播放,而是指螢幕上的圖形顯示功能——無論是繪製圖片、文字還是圖形介面,都必須透過視訊子系統實現。它提供了視訊模式設定、視窗建立、影像幀緩衝、Alpha 混合、硬體加速的 Blit 位塊傳輸、視窗管理以及圖形渲染等完整功能。
使用視訊子系統的第一步是建立 SDL 視窗或設定顯示模式,核心函數為 SDL_SetVideoMode:
SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
參數說明:width/height 為視窗寬高(像素),bpp 為色深(0 表使用預設值),flags 為特性旗標。函數成功返回 SDL_Surface* 指標,失敗返回 NULL。
只有透過 SDL_SetVideoMode 建立的表面(即顯示表面)能直接顯示在螢幕上。 其他透過載入圖片、渲染文字產生的表面,必須「貼」到顯示表面上才能顯示。這就像白板(顯示表面)與貼紙(普通表面)的關係——後貼上的會覆蓋先前的內容。
推薦組合:SDL_HWSURFACE | SDL_DOUBLEBUF,若失敗可嘗試 SDL_SWSURFACE。全螢幕模式通常搭配雙緩衝使用。
/* 建立 SDL 顯示視窗 */
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
SDL_Surface *gpScreen = NULL; // 全域顯示表面指標
int main(int argc, char *argv[]) {
// 初始化視訊子系統
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
printf("Unable to init SDL: %s\n", SDL_GetError());
exit(-1);
}
atexit(SDL_Quit); // 註冊結束時自動清理
// 建立 600x480、32 位元、硬體表面+雙緩衝視窗
gpScreen = SDL_SetVideoMode(600, 480, 32,
SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF);
if (!gpScreen) {
exit(1);
}
SDL_Delay(3000); // 暫停 3 秒觀察視窗
SDL_FreeSurface(gpScreen); // 釋放資源
system("pause");
return 0;
}
SDL_SetVideoMode 後必須檢查回傳值是否為 NULLSDL_FreeSurface 釋放顯示表面資源SDL_Surface 結構體詳細說明請參考視訊子系統基礎概念文件