SDL的視頻子系統


  SDL視頻子系統

  在SDL中最為常用子系統就是視頻子系統。這里說的視頻不是指我們平常播放的電影等,而是指在屏幕上顯示出來的東西,你需要在屏幕上顯示圖片、文字等那就必須使用視頻子系統,否則什么都看不到,視頻子系統支持:設置視頻模式或者說創建視頻窗口;支持直接的圖像幀緩沖;支持Alpha像素混合;支持Blit位塊傳輸(可以硬件加速);支持窗口管理;支持圖形渲染。

  要使用視頻子系統首先要創建一個SDL窗口(或者說設置SDL的顯示模式),我們可以使用:

      /*
    功能:建立SDL顯示表面
   參數:int width 窗口寬度  單位象素
            int height 窗口高度  單位象素
                int bpp 窗口象素位數,如果為0,則取當前窗口默認象素數
                Unit32  flags  位標,標示窗口特性
     返回值:SDL_Surface *,成功返回窗口指針,失敗返回NULL
      */

  SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);

  來創建一個窗口,以后所有東西都必須刷到這個窗口才能顯示。函數的返回值是SDL_Surface *,SDL_Surface也稱表面(或者說蒙皮),是需要顯示的東西,可能是一張圖片,也可能是一個字符串。我們的應用中可能需要顯示很多的東西,所以可能創建很多的表面,但請記住無論有多少個表面,但只有使用SDL_SetVideoMode函數產生的表面(或窗口)才能顯示,其他任何表面必須刷到這個窗口上才可以顯示,這一點很重要。打個比方這個窗口就像是一塊白板,你需要顯示的東西必須貼在白板上才能顯示,並且后貼上的東西會覆蓋以前的東西。下面是建立顯示窗口的代碼: 

 1 /*
 2   功能:建立SDL顯示窗口
 3   作者:csl
 4   日期:2012-5-4
 5 */
 6 #include <stdio.h> 
 7 #include <stdlib.h> 
 8 #include "SDL.h"
 9 
10 SDL_Surface *gpScreen;//顯示表面
11 
12 int main(int argc,char *argv[])
13 {
14     if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化視頻子系統
15     {
16         printf("Unable to init SDL: %s\n", SDL_GetError());
17         exit(-1);
18     }
19     atexit(SDL_Quit);// 注冊SDL_Quit,當退出時調用,使得退出時程序自動清理
20 
21     //創建32位600*480窗口
22     gpScreen = SDL_SetVideoMode(600,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF );
23     if(!gpScreen) 
24     { 
25         exit(1);
26     }
27 
28     SDL_Delay(3000); //暫停3秒
29     SDL_FreeSurface(gpScreen);//退出程序前必須釋放 
30 
31     system("pause"); 
32     return 0; 
33 }

  gpScreen是顯示窗口的指針,全局變量。第22行建立顯示窗口,flags是位標,標示窗口特性,常用標示已經粗體顯示:

SDL_SWSURFACE

在系統內存創建表面

SDL_HWSURFACE

在顯內存創建表面

SDL_ASYNCBLIT

顯示表面的異步更新,這回降低但cpu機器的性能,但在多處理器機子上會增加速度

SDL_ANYFORMAT

通常如果表面的像素深度不可用(比如你指定64,但你的機器不支持),則SDL將模擬一個影子表面。這個標志禁止這種做法。這將使SDL使用該表面不考慮bpp

SDL_DOUBLEBUF

使用雙緩沖

SDL_FULLSCREEN

全屏模式

SDL_OPENGL

創建一個OpenGL渲染環境

SDL_RESIZABLE

創建一個可變尺寸的窗口

SDL_NOFRAME

創建一個無邊框和標題的窗口。

  這些常量可以組合使用,比如SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE,表示在顯存里創建一個全屏窗口,使用雙緩沖。注意:一般使用全屏模式也會使用雙緩沖;如果使用在顯存創建表面也會使用雙緩沖。建議使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出現錯誤可以嘗試使用SDL_SWSURFACE。

   調用函數后應該檢測gpScreen是否為空,為空則應結束程序。在程序退出前,必須調用SDL_FreeSurface釋放gpScreen所指的窗口資源。

  關於SDL_Surface詳細資料在視頻子系統基本概念里做了詳細的說明。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM