首页 > 解决方案 > 有人可以解释为什么 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);
    }
}

标签: performanceinfinite-loopsdl-2

解决方案


SDL_PollEvent()为您的窗口(通过SDL_PumpEvents())泵送系统事件循环,让操作系统知道您的进程还活着并且运行良好(...或至少及时响应窗口事件)。


推荐阅读