zoukankan      html  css  js  c++  java
  • 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详细资料在视频子系统基本概念里做了详细的说明。 

  • 相关阅读:
    交通部道路运输车辆卫星定位系统部标JTT808、809、796标准大全
    linux下如何源码编译安装vim
    Ubuntu如何重新启动tftp服务
    Ubuntu如何自定义tftp服务根目录
    git如何撤销git add操作?
    如何使两台主机间的不同网段互通?
    debian下如何源码安装tmux
    mysql插入数据自动生成主键uuid
    mysql的 UUID的生成方式
    MySQL SQL语句 生成32位 UUID
  • 原文地址:https://www.cnblogs.com/landmark/p/2476213.html
Copyright © 2011-2022 走看看