performance - 有人可以解释为什么 SDL 窗口在几秒钟后变灰吗?
问题描述
我在这里找到了解决问题的方法,但我想知道它是如何工作的?我尝试使用 sleep() 但它不起作用。使用 SDL_PollEvent(NULL) 之前和使用之后的 CPU 使用率相同(在 htop 中查看)。那么是什么导致了这种行为呢?这是我的代码的 sdl 部分。
代码:
void* video_stream()
{
int bytes_per_pixel;
bytes_per_pixel=(s_format.fmt.pix.sizeimage)/(s_format.fmt.pix.width*s_format.fmt.pix.height);
SDL_Window *window=NULL;
SDL_Renderer *renderer=NULL;
SDL_Texture* texture=NULL;
SDL_Init(SDL_INIT_EVERYTHING);
window=SDL_CreateWindow("Stream UYVY",0,0,s_format.fmt.pix.width,s_format.fmt.pix.height,SDL_WINDOW_SHOWN);
if(window==NULL)
{
printf("window creatin failed\n");
}
renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
if(renderer==NULL)
{
printf("renderer not created\n");
}
SDL_RenderSetLogicalSize(renderer,s_format.fmt.pix.width,s_format.fmt.pix.height);
SDL_SetRenderDrawColor(renderer,100,100,100,255);
SDL_RenderClear(renderer);
texture= SDL_CreateTexture(renderer,SDL_PIXELFORMAT_UYVY,SDL_TEXTUREACCESS_STREAMING,s_format.fmt.pix.width,s_format.fmt.pix.height);
if(texture==NULL)
{
printf("Create texture failed\n");
exit(1);
}
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_USERPTR;
gettimeofday(&strt,NULL);
while(stop==0)
{
if(ioctl(fd,VIDIOC_DQBUF,&buf)<0)
{
perror("VIDIOC_DQBUF");
exit(1);
}
frame_count++;
if(SDL_UpdateTexture(texture,NULL,buffer[buf.index].start,bytes_per_pixel*s_format.fmt.pix.width)<0)
{
printf("Update texture failed\n");
}
buf.index=buf.index;
buf.m.userptr=(unsigned long)buffer[buf.index].start;
buf.length=buffer[buf.index].length;
if(ioctl(fd,VIDIOC_QBUF,&buf)<0)
{
perror("VIDIOC_QBUF");
}
SDL_RenderCopy(renderer,texture,NULL,NULL);
SDL_RenderPresent(renderer);
SDL_PollEvent(NULL);
}
if(stop==1)
{
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
++stop;
pthread_exit(NULL);
}
}
解决方案
SDL_PollEvent()
为您的窗口(通过SDL_PumpEvents()
)泵送系统事件循环,让操作系统知道您的进程还活着并且运行良好(...或至少及时响应窗口事件)。
推荐阅读
- python - Python(def)函数参数谁切换 IF NOT 或只是 IF 关键字
- python - 从 Spotify API 的 track 的 preview_url 获取 30 秒是如何定义的?
- python - 平滑线图:修复 interpolator1D y_axis 的 TypeError
- reactjs - 如何在 React 中渲染不稳定的父属性
- python-3.x - 使Integrate.quad 函数只返回解析值
- python - 如何使用python从一组点中选择等距离点
- javascript - 作为 React 组件的 Mapbox 示例
- mongodb - 猫鼬选择查询与其他集合的计数
- nuxt.js - 当页面刷新状态在nuxt js中为空时
- firebase-cloud-messaging - FCM 通过机器人框架获取注册令牌