SDL2常用函数:SDL_Surface 数据结构及使用介绍
SDL_Surface 介绍
SDL_Surface 是 Simple DirectMedia Layer (SDL) 库中的一个核心数据结构,用于表示软件中的图像或表面。它是 SDL 1.x 版本中处理 2D 图形的主要方式,在 SDL 2.x 中仍然被支持,但通常推荐使用更高效的 SDL_Texture 结合硬件加速渲染。
主要特性
-
软件渲染:SDL_Surface 主要在 CPU 上进行操作,不直接利用 GPU 加速
-
像素数据存储:包含图像的原始像素数据
-
格式信息:存储像素格式、宽度、高度等信息
-
跨平台:在不同平台上提供一致的接口
数据结构成员
Uint32 | flags | (internal use) |
---|---|---|
SDL_PixelFormat* | format | 存储在surface中的像素的格式; 有关详细信息,请参阅SDL_PixelFormat(只读) |
int | w, h | 宽度和高度(以像素为单位)(只读) |
int | pitch | 一行像素的长度(以字节为单位)(只读) |
void* | pixels | 指向实际像素数据的指针; 有关详细信息(读写) |
void* | userdata | 你可以设置的任意指针(读写) |
int | locked | 用于需要锁定的表面(内部使用) |
void* | lock_data | 用于需要锁定的表面(内部使用) |
SDL_Rect | clip_rect | 一个SDL_Rect结构,用于将blits剪切到表面,可以通过SDL_SetClipRect()设置(只读) |
SDL_BlitMap* | map | 快速blit映射到其他表面的信息(内部使用) |
int | refcount | 引用计数可以由应用程序递增 |
常用操作
创建 Surface
// 创建一个新的 Surface
SDL_Surface* SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth,Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);// 从文件加载图像创建 Surface
SDL_Surface* SDL_LoadBMP(const char *file);
SDL_Surface* IMG_Load(const char *file); // 使用 SDL_image 库
释放 Surface
void SDL_FreeSurface(SDL_Surface* surface);
绘制操作
// 在目标 Surface 上绘制另一个 Surface
int SDL_BlitSurface(SDL_Surface* src, const SDL_Rect* srcrect,SDL_Surface* dst, SDL_Rect* dstrect);// 填充 Surface
int SDL_FillRect(SDL_Surface* dst, const SDL_Rect* rect, Uint32 color);
使用示例
#include <SDL2/SDL.h>int main() {SDL_Init(SDL_INIT_VIDEO);// 创建一个 640x480 的 32 位 RGB SurfaceSDL_Surface* screen = SDL_CreateRGBSurface(0, 640, 480, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);// 加载图像SDL_Surface* image = SDL_LoadBMP("example.bmp");// 绘制图像SDL_Rect dest = {100, 100, 0, 0};SDL_BlitSurface(image, NULL, screen, &dest);// 保存结果SDL_SaveBMP(screen, "output.bmp");// 释放资源SDL_FreeSurface(image);SDL_FreeSurface(screen);SDL_Quit();return 0;
}
SDL_Surface 与 SDL_Texture 的比较
特性 | SDL_Surface | SDL_Texture |
---|---|---|
渲染方式 | 软件渲染 (CPU) | 硬件加速 (GPU) |
性能 | 较慢 | 更快 |
修改灵活性 | 可直接访问像素 | 需要通过渲染目标或更新纹理 |
适用场景 | 图像处理、像素级操作 | 游戏渲染、频繁更新的图形 |
内存位置 | 系统内存 | 显存 |
在现代 SDL 2.x 应用中,通常建议将 SDL_Surface 用于加载和处理图像,然后将其转换为 SDL_Texture 用于高效渲染。