我找到了解决问题here的方法,但是我想知道它是如何工作的?我尝试使用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);
}
}
答案 0 :(得分:0)
SDL_PollEvent()
(通过SDL_PumpEvents()
)为您的窗口注入系统事件循环,让操作系统知道您的进程是否正常运行(...或至少响应Windows中的窗口事件)及时)。