有人可以解释为什么SDL窗口几秒钟后变成灰色吗?

时间:2018-08-09 14:16:39

标签: performance infinite-loop sdl-2

我找到了解决问题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);
    }
}

1 个答案:

答案 0 :(得分:0)

SDL_PollEvent()(通过SDL_PumpEvents())为您的窗口注入系统事件循环,让操作系统知道您的进程是否正常运行(...或至少响应Windows中的窗口事件)及时)。