SDL2嵌入控件播放导致崩溃,系统锁屏触锁后不刷新

现象:

 使用MFC及C#控件进行视频流或录像文件的播放app,

问题:

1.对控件进行放大缩小后,界面不刷新。

2.当对运行APP的系统进行锁屏再解锁后或远程连接或切换用户后,相应的图像控件界面不刷新。-严重

方法:

问题1:控件缩放刷新问题,SDL_SetWindowPosition函数不起作用,是窗口渲染器和纹理后不再匹配,此时需要重新创建再进行绘制更新。SDL_CreateRenderer(),SDL_CreateTexture()再次创建。

问题2: 

  • 复杂方法。修改的地方较多,最重要的是对相应的渲染器及纹理创建时的参数进行理解

修改参数后,总是报内存访问冲突,有些什么D3D11.PDB ,D3D9.pdb 什么文件的无法打开冲突的总是,头都的了,查看了锁没有问题,偶尔查看到  https://www.jianshu.com/p/18c2f9f8716a里面有说SDL图像在指定的控件上进行播放,此时相应的SDL是Window的消息映射到SDL。此时两个地方均接收到消息,此时怀疑是两个消息的原因。通过消息进行相应的屏蔽一个,不在报冲突。但是在对图像显示的时候偶尔会有总是,恼火,(半路进入SDL的我头都大了)。

此时情况为在刷新图像线程中每次重新创建渲染器和纹理进行图像更新,因为考虑是界面刷新的问题,所以每次重新创建。

但是 m_sdlRenderer = SDL_CreateRenderer(m_psdlscreen, -1, 0);很大概率会在此位置出现冲突异常。

用日志文件printf("SDL: could not create window - exiting:%s\n", SDL_GetError());打出错误消息,结果有时会出现不能找到渲染器的问题。特别是在系统解屏幕锁后第一次为创建m_sdlRenderer失败,后面一次有时会成功。

思考排查,查看SDL_CreateRenderer(),第三个参数的意思,都没有说的特别清楚,挨个试,还是会出现,但是SDL_RENDERER_ACCELERATED和SDL_RENDERER_SOFTWARE效果明显,也试了两个一起,也不行,但是SDL_RENDERER_SOFTWARE效果好些。结果还不行,

继续向下排查SDL_CreateTexture(),各参数的意思,第三个参数有三种:

typedef enum
{
    SDL_TEXTUREACCESS_STATIC,    /**< Changes rarely, not lockable */
    SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */
    SDL_TEXTUREACCESS_TARGET     /**< Texture can be used as a render target */
} SDL_TextureAccess;

常用的均为第二种,SDL_TEXTUREACCESS_STREAMING,也没有查到具体怎样选择,试试第三个SDL_TEXTUREACCESS_TARGET做为一个整体,

结果OK啦。

最终版本修改位置:

①改变窗口大小时重新创建Renderer和exture,且参数注意第三个参数的选择。

②更新线程只做SDL_UpdateTexture(m_sdlTexture, NULL, cashFrame, nWidthStep);//设置纹理数据,将图像显示到窗口
        SDL_RenderClear(m_sdlRenderer);//清空渲染器
        SDL_RenderCopy(m_sdlRenderer, m_sdlTexture, NULL, NULL);//纹理复制给渲染器

③创建窗口时,注意屏蔽部分消息。SDL_EventState(SDL_WINDOWEVENT, SDL_IGNORE);

缺点:针对MFC控件可以实现实时各状态显示,但是对于C#控件偶尔会有失败的状态。

总结:创建renderer时,参数软件刷新和硬件加速刷新两种时各消息响应也不同,软件可同步更新控件大小,刷新显示图像大小,但对于C#偶尔会有控件失效不显示的状态;硬件加速在控件放大时,图像显示的模糊,不能自主刷新, 对于锁屏此类操作不能自动更新。

  • 简单的方法:监听解锁后的消息,调用 控件缩放接口进行刷新,但由于监听此消息不容易,所以没有进行相应的测试。

监听当前是否锁屏,是连续判断是否状态更改,更改则强制重新创建渲染器及纹理。如果每次绘图时重新创建渲染器和纹理会偶尔有冲突。

此方法有效,但是刷新时会有一闪而过的黑屏,待后续解决。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值