SDL1.3支持多个窗口

SDL多窗口多线程渲染技术解析 尽管在特定环境(如Linux + 特定驱动组合)下多线程Present可能暂时正常工作,但这种行为违背了SDL的跨平台设计哲学,可能在未来更新或更换硬件时引发难以调试的问题。对于高性能多线程渲染需求,更安全的做法是将**渲染命令录制与Present提交分离**,**规避窗口系统协议和图形驱动的线程安全隐患**,通过主线程协调实现帧同步。 建议仅在以下场景使用此架构: - 纯 Linux 部署环境- 窗口数量较少(≤8) - 无需跨窗口资源共享 对于跨平台或大规模窗口场景,尤其生产环境下,仍建议采用主 阅读详情

   笔者这段时间在研究SDL,发现很多人在问如何让SDL支持视频双窗口或者创建多个视频窗口,而baidu和google上居然没有详细介绍的相关文档,故在此作一个简单介绍。 

   根据笔者的理解,在SDL1.2中是不支持多窗口的,而还没有正式发布的、非稳定状态下的SDL1.3是完全支持多窗口的。  

   下面是笔者写的一个简单的程序,其中创建2个视频窗口并在每一个窗口中显示不同位图:

 

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <tchar.h>
#include "SDL.h"
#include "SDL_shape.h"

 

void renderBlue(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture_dimensions)
{
    //Clear render-target to blue.
    SDL_SetRenderDrawColor(renderer,0x00,0x00,0xff,0xff);
    SDL_RenderClear(renderer);

    //Render the texture.
    SDL_RenderCopy(renderer,texture,&texture_dimensions,&texture_dimensions);

    SDL_RenderPresent(renderer);
}

void renderRed(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture_dimensions)
{
    //Clear render-target to red.
    SDL_SetRenderDrawColor(renderer,0xff,0x00,0x00,0xff);
    SDL_RenderClear(renderer);

    //Render the texture.
    SDL_RenderCopy(renderer,texture,&texture_dimensions,&texture_dimensions);

    SDL_RenderPresent(renderer);
}

int _tmain(int argc,TCHAR** argv)
{
    SDL_Color black = {0,0,0,0xff};
    Uint32 pixelFormat = 0;
    int access = 0;
    SDL_Rect texture_dimensions;;
    char *szAnsiFile="e://hello.bmp";
    char *szAnsiFile2="e://hello2.bmp";

    if(SDL_VideoInit(NULL) == -1) {
        printf("Could not initialize SDL video./n");
        exit(-2);
    }
   
    SDL_PixelFormat* pixformat = NULL;
    SDL_Window * win1 = SDL_CreateWindow("TEST1", 10, 10, 640,480, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    SDL_Renderer *render1 = SDL_CreateRenderer(win1,-1,0);
    SDL_Surface *imgSurface1 = SDL_LoadBMP(szAnsiFile);
    SDL_Texture *texture1 = SDL_CreateTextureFromSurface(render1,imgSurface1);
    SDL_QueryTexture(texture1,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
    SDL_SetWindowSize(win1,texture_dimensions.w,texture_dimensions.h);
    SDL_WindowShapeMode shapeMode1;
    pixformat = imgSurface1->format;
    if(pixformat->Amask != 0) {
        shapeMode1.mode = ShapeModeBinarizeAlpha;
        shapeMode1.parameters.binarizationCutoff = 255;
    }
    else {
        shapeMode1.mode = ShapeModeColorKey;
        shapeMode1.parameters.colorKey = black;
    }
    SDL_SetWindowShape(win1,imgSurface1,&shapeMode1);

    texture_dimensions.x = 0;
    texture_dimensions.y = 0;
    texture_dimensions.w = 640;
    texture_dimensions.h = 480;
    renderBlue(render1,texture1,texture_dimensions);    

    SDL_Window * win2 = SDL_CreateWindow("TEST2", 650, 10, 640,480, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    SDL_Renderer *render2 = SDL_CreateRenderer(win2,-1,0);
    SDL_Surface *imgSurface2 = SDL_LoadBMP(szAnsiFile2);
    SDL_Texture *texture2 = SDL_CreateTextureFromSurface(render2,imgSurface2);
    SDL_QueryTexture(texture2,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
    SDL_SetWindowSize(win2,texture_dimensions.w,texture_dimensions.h);
    SDL_WindowShapeMode shapeMode2;
   
    pixformat = imgSurface2->format;
    if(pixformat->Amask != 0) {
        shapeMode2.mode = ShapeModeBinarizeAlpha;
        shapeMode2.parameters.binarizationCutoff = 255;
    }
    else {
        shapeMode2.mode = ShapeModeColorKey;
        shapeMode2.parameters.colorKey = black;
    }
    SDL_SetWindowShape(win2,imgSurface2,&shapeMode2);

    texture_dimensions.x = 0;
    texture_dimensions.y = 0;
    texture_dimensions.w = 640;
    texture_dimensions.h = 480;
    renderRed(render2,texture2,texture_dimensions);       
    
    SDL_Delay(5000);

    SDL_DestroyTexture(texture1);
    SDL_DestroyRenderer(render1);
    SDL_DestroyWindow(win1);
    SDL_FreeSurface(imgSurface1);

    SDL_DestroyTexture(texture2);
    SDL_DestroyRenderer(render2);
    SDL_DestroyWindow(win2);
    SDL_FreeSurface(imgSurface2);

    //Call SDL_VideoQuit() before quitting.
    SDL_VideoQuit();

    return 0;
}


要编译上面这段代码,需要下载最新的SDL1.3源码,然后编译生成SDL.lib和SDL.dll,然后将SDL.lib导入库加入到VS2005的工程中即可。

1/0 SDL创建窗口及颜色填充 SDL是什么? SDL实就是-个便于游戏开发的函数库。SDL提供 了数种控制图像、声音,输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、 Windows、 Mac OS X等)的应用软件。 学习SDL有什么用? 目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。 SDL学习的难点是什么? 使用vs软件我们需要将SDL库函数引进,SDL作为-种编写工具,我们的目的就是灵活掌握SDL函数的使用方法,包括:传递的参数的类型,个数及其代表的含义;函数返回值得类型及其含义 阅读详情

相关推荐

我的SDL3入门:从零构建首个图形窗口与理解核心回调

本文详细介绍了SDL3的入门指南,从零开始构建首个图形窗口并深入解析其核心回调机制。通过对比传统C语言程序与现代回调模型,重点讲解了SDL_AppInit、SDL_AppEvent、SDL_AppIterate和SDL_AppQuit四大核心回调函数的使用方法与优化技巧,帮助开发者快速掌握SDL3的图形编程基础。

weixin_27676369的博客 344

SDL 开发实战(四): SDL 事件处理

在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端。 那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关闭按钮后才关闭呢? 答:显然可以! 下面就来介绍一下SDL的事件处理机制。 1. SDL 事件处理机制原理 SDL事件就是键盘事件,鼠标事件,窗口事件等。SDL将所有事件都存放在一个...

weixin_30405421的博客 578

SDL3踩坑实录:从‘SDL_AppInit’报错到成功显示窗口,我解决了这三个问题

本文详细解析了SDL3开发中的三大核心问题:SDL_MAIN_USE_CALLBACKS宏定义遗漏导致的链接错误、窗口创建参数设置不当以及渲染循环中的颜色处理误区。通过具体代码示例和解决方案,帮助开发者快速掌握SDL3的SDL_AppInit和SDL_AppIterate等关键回调函数的使用技巧,实现成功窗口显示。

weixin_30897233的博客 384

QT使用SDL多窗口显示视频(linux,ubuntu)

为了实现一份资源的多次复制(将一个视频投射到多个窗口),降低cpu占用率,取代传统的setpixmap或者qpainter,不使用复杂的qopengl类也能调用显卡资源,那么选择SDL2是非常好的。本人使用qmediaplayer配合qabstractvideosurface获取了QVideoFrame。首先linux编译安装SDL2,包含头文件和链接库文件。1.创建SDL相关资源。

weixin_44789033的博客 948

S-function入门及案例详解(3)——S-function进阶案例

目录1.案例描述2.案例详解3.输出波形4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度、质量、离地面高度。 2.案例详解 步骤1.可以修改sfuntmpl函数的名称(这里修改为bengji),并在括号内增加输入参数 参数len,weight,dist分别表示长度、质量、离地面高度;长度用来初始化x0,质量用来初始化m,离地面高度用来初始化h。 function [sys,x0,str,ts,simStateCompliance] = bengji(t,x,u

Wendy的博客 1万+

提高机器学习模型准确率的八大方法

原文连接:http://www.techweb.com.cn/network/system/2016-01-27/2269274.shtml 此文仅是一个小品文,详细理论请读论文,参考书籍。 前言:我的概述 机器学习面对的是一个受限有穷空间 到 一个扩大的有穷空间 的泛化问题。若假设空间足以覆盖真实的数据空间,机器学习方法可以弃之不...

alppkk4545的博客 1301

记录使用《MFC中如何利用ffmpeg和SDL2.0多线程多窗口播放摄像头的视频》这篇文章的代码,遇到的一些问题

最近在研究如如何播放多个摄像头数据,在查找资料的过程中发现了这篇文章《<a href="http://blog.csdn.net/marising/article/details/52145316">MFC中如何利用ffmpeg和SDL2.0多线程多窗口播放摄像头的视频</a>》,使用这篇文章的代码。博主对每个部分介绍还是比较清楚的,中间省略了一些代码,还得需要自己调整。本文主要记录在调试过程中遇到的一些问题。 ...

qq_38883139的博客 517

解密Android相机框架:从HAL到应用层的全链路解析

本文深入解析Android相机框架的全链路架构,从应用层到硬件抽象层(HAL)再到驱动层,详细介绍了CamX-CHI架构的设计哲学与实战应用。通过HAL3接口、V4L2交互机制及Camera2 API的最佳实践,帮助开发者优化相机性能,解决多摄切换、预览卡顿等常见问题,提升成像效率与稳定性。

weixin_29238147的博客 408

SDL2源代码分析2:窗口(SDL_Window)

上一篇文章分析了SDL的初始化函数SDL_Init()。这篇文章继续分析SDL的源代码。本文分析SDL的窗口(Window)。

雷霄骅(leixiaohua1020)的专栏 4万+

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2478

信捷PLC XD5系列运动控制(10轴)编程应用篇

项目PLC采用XD5-60T10-E,36DI 24DO 晶体管输出,支持10路脉冲输出功能。TMR指令定时器时基可以自己设定,这点比其他品牌PLC方便。ZRN指令我们需要上升沿指令触发。 5、变址寻址 该说不说这个变址寻址是真的强,比西门子指针、三菱的变址寄存器Z 、V都要更加灵活。 7、特殊寄存器:时钟 8、如何建立PLC通讯...............

RXXW_Dor的博客 1万+

SDL1.3支持多个窗口 .

http://blog.csdn.net/happyweb/article/details/6201655 在SDL1.2中是不支持多窗口的,而还没有正式发布的、非稳定状态下的SDL1.3是完全支持多窗口的。      下面是笔者写的一个简单的程序,其中创建2个视频窗口并在每一个窗口中显示不同位图:   #include #include #include #include

dkqiang的专栏 1698

在 Android Studio 中接入 DeepSeek:加速 Android 开发进程

通过在 Android Studio 中接入 DeepSeek,Android 开发者能够充分利用人工智能技术带来的强大优势,显著提升开发效率和代码质量。从前期的安装准备,到具体的接入步骤,再到使用过程中的技巧和注意事项,每一个环节都为打造高效、智能的开发环境提供了有力支持。希望本文能帮助你顺利将 DeepSeek 融入到 Android Studio 的开发工作流程中,让你在 Android 开发的道路上更加得心应手,创造出更优质的 Android 应用。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4174

(转)SDL 1.2 to 2.0 Migration Guide--SDL1.2更新到SDL2.0指南

SDL 1.2 to 2.0 Migration Guide 目录 SDL 1.2 to 2.0 Migration Guide Translations Introduction Overview of new features Looking for more information Moving from SDL 1.2 to 2.0 Some g...

dianchixian5277的博客 324

BUG调试案例六:RK3568+国产YT8531网络PING调试案例

这次调试过程让我对后续类似问题的应对更加有信心。如果芯片在其他项目中已被验证可用,那么在我们的设计中原则上也应该能够正常工作。如果出现异常,就必须坚持追根溯源,找出具体原因和根本问题。每一次问题的解决,都是一次深入理解系统和提升能力的机会 —— 在不断探索和学习中,也在持续成长。

案例文章,高速信号 2332

基于OpenCV和Dlib的头部姿态估计详细教程

本文详细介绍了基于OpenCV和Dlib的头部姿态估计方法。通过分析2D人脸特征点与3D头部模型的对应关系,利用PnP(Perspective-n-Point)算法求解头部在三维空间中的姿态。文章首先阐述了坐标系统转换原理,包括世界坐标系、相机坐标系和图像坐标系的转换关系,随后深入讲解了PnP问题的数学表述及求解步骤,并提供了使用Dlib检测68个面部特征点的代码示例。最后介绍了3D通用头部模型的构建方法,包括6点和14点模型的选择,为计算机视觉中的头部姿态估计提供了完整的技术实现方案。

FJN110的博客 337

SDL支持视频双窗口或者创建多个视频窗口

出处:http://blog.csdn.net/happyweb/article/details/6201655   笔者这段时间在研究SDL,发现很多人在问如何让SDL支持视频双窗口或者创建多个视频窗口,而baidu和google上居然没有详细介绍的相关文档,故在此作一个简单介绍。     根据笔者的理解,在SDL1.2中是不支持多窗口的,而还没有正式发布的、非稳定状态下的SDL1.3

matthew0618band的专栏 5966

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SDL3 GPU编程探索

也许你依然觉得SDL3GPU很复杂,那你之前可能是写OpenGL的,因为这点代码对于Vulkan来说连渲染管线都不一定创建得完(doge)。非常好API,使我的Vulkan旋转!

m0_73087695的博客 3495

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SDL 入门指南:了解 SDL,快速上手 SDL 的安装和配置——VS2022

“SDL 入门指南:了解 SDL,快速上手 SDL 的安装和配置”——VS2022

热爱编程的小K的博客 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SDL编程入门(1)Hello SDL

Hello SDL 你的第一个图形窗口 所以你学会了C++的基础知识,但你厌倦了制作基于文本的小程序。为了使用诸如图形、声音、键盘、操纵杆等东西,你需要一个API(应用程序员接口),将所有这些硬件功能转化为C++可以交互的东西。 这就是SDL所做的事情。它将Windows/Linux/Mac/Android/iOS等工具包装起来,让你可以用SDL编写代码,然后编译到它所支持的任何平台。为了使用它,你需要安装它。 SDL作为一个动态链接库。一个动态链接库有3个部分。 头文件(Library.h) 库文件 (

编程之路的专栏 2350

SDL下设置窗口背景图片

SDL下C++编译,在窗口添加我们想要的背景图片

weixin_73918008的博客 1410

SDL下渲染窗口

SDL库下c++编译,进行窗口渲染操作,对窗口进行初始化

weixin_73918008的博客 1479

实现在Qt窗口中嵌套SDL

在现代软件开发中,多媒体处理和交互性成为应用程序不可或缺的一部分。Qt作为一个强大的GUI框架,为开发者提供了丰富的图形、界面和事件处理工具。然而,有时候,我们可能需要更多的多媒体功能和更高的性能,而这就是SDL(Simple DirectMedia Layer)的用武之地。在本文中,我们将探讨如何在Qt窗口中嵌套SDL,以便在应用程序中拓展多媒体体验和性能。本文福利,莬。

m0_73443478的博客 1182

SDL3 学习笔记

SDL3是跨平台开源多媒体开发库SDL的最新版本(2025年发布),在SDL2基础上进行了架构重构和功能升级。它提供统一API接口,支持OpenGL/Direct3D/Metal/Vulkan等现代图形渲染,新增相机API、笔输入支持,并改进音频处理和高DPI适配。SDL3采用zlib许可证,允许商业使用且无需开源代码。相比SDL2,它具有更规范的API设计、更丰富的功能支持和更简单的错误处理机制。开发环境可通过包管理器或源码编译安装,官方提供详细文档、示例代码和SDL2迁移工具。适合游戏开发、多媒体应用等

acsdnrb的博客 1036
上一篇: MPC中是如何显示字幕文件的?
下一篇: VS2005开发CUDA3.2环境配置
丹宇码农
博客等级 码龄22年 93粉丝 53原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值