FFmpeg06:SDL渲染

SDL介绍

  • SDL(Simple DirectMedia Layer)
  • 由C语言实现的跨平台的媒体开源库
  • 多用于游戏、模拟器、媒体播放器等多媒体应用领域

SDL编译与安装

  • 拉取源码
  • 先切换分支为SDL2
  • 执行autogen.sh生成configure (可不执行)
  • 生成Makefile: configure --prefix=/usr/local
  • 安装sudo make -j 8 && sudo make install

SDL使用

  • 头文件#include<SDL.h>
  • 初始化SDL
  • 退出SDL

渲染窗口

  • SDL_Init/SDL_Quit()
  • SDL_CreateWindow()/ SDL_DestoryWindow()
  • SDL_CreateRender()/SDL_DestoryRender()
  • SDL_RenderClear
  • SDL_RenderPresent
#include <SDL.h>

int main(int argc, char* argv[]) {
   
   
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow("hello sdl", 200, 200, 640, 470, SDL_WINDOW_SHOWN);
    SDL_Renderer* render;
    SDL_Event event;
    if (!window) {
   
   
        printf("Failed to create window: %s\n", SDL_GetError());
        goto __EXIT;
    }

    render = SDL_CreateRenderer(window, -1, 0);
    if (!render) {
   
   
        printf("Failed to create renderer: %s\n", SDL_GetError());
        goto __EXIT;
    }
      
    SDL_PollEvent(&event); // 没有事件处理就不会显示窗口

    SDL_SetRenderDrawColor(render, 255, 10, 0, 255); // 必须在RenderClear之前设置颜色

    SDL_RenderClear(render);

    SDL_RenderPresent(render);  // 显示

    SDL_Delay(300000);


__EXIT:
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

事件基本原理

  • SDL将所有事件都存放在一个队列中
  • 所有对事件的操作,其实就是对队列的操作

事件种类

  • SDL_WindowEvent:窗口事件
  • SDL_KeyboardEvent:键盘事件
  • SDL_MouseMotionEvent:鼠标事件

事件处理

  • SDL_PollEvent:轮询检测队列
  • SDL_WaitEvent:事件触发机制
#include <SDL.h>

int main(int argc, char* argv[]) {
   
   
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow("hello sdl", 200, 200, 640, 470, SDL_WINDOW_SHOWN);
    SDL_Renderer* render;
    SDL_Event event;
    int quit = 1;
    if (!window) {
   
   
        printf("Failed to create window: %s\n", SDL_GetError());
        goto __EXIT;
    }

    render = SDL_CreateRenderer(window, -1, 0);
    if (!render) {
   
   
        printf("Failed to create renderer: %s\n", SDL_GetError());
        goto __EXIT;
    }
      
    // SDL_PollEvent(&event); // 没有事件处理就不会显示窗口

    SDL_SetRenderDrawColor(render, 255, 10, 0, 255); // 必须在RenderClear之前设置颜色

    SDL_RenderClear(render);

    SDL_RenderPresent(render);  // 显示

    do {
   
   
        SDL_WaitEvent(&event);
        switch (event.type)
        {
   
   
        case SDL_QUIT:
            quit = 0;
            break;
        
        default:
            SDL_Log("event type: %d", event.type);
            break;
        }
        
    } while(quit);

    // SDL_Delay(300000);


__EXIT:
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

纹理渲染

为什么要使用纹理:假设不使用纹理显示内容,则需要将整个YUV或者RGB数据在CPU计算好,然后传给GPU显示;
而使用纹理则只需要将从哪到哪怎么显示这些信息在CPU准备好,传给GPU进行实际的计算和显示

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值