Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video SDL中具有显著延迟的视频更新_Video_Sdl_Latency - Fatal编程技术网

Video SDL中具有显著延迟的视频更新

Video SDL中具有显著延迟的视频更新,video,sdl,latency,Video,Sdl,Latency,如果我没记错的话,我以前遇到过这个问题,但我不记得我是如何解决的。 这是我的节目: #include "SDL.h" SDL_Surface *screen; SDL_Event event; int main(int argc,char *argv[]) { SDL_Init(SDL_INIT_VIDEO); atexit(SDL_Quit); screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE); int

如果我没记错的话,我以前遇到过这个问题,但我不记得我是如何解决的。 这是我的节目:

#include "SDL.h"

SDL_Surface *screen;
SDL_Event event;

int main(int argc,char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    atexit(SDL_Quit);
    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
    int x = 10,y = 10;
    while (1)
    {
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
                exit(0);
        }
        int mx,my;
        Uint8 mstate = SDL_GetMouseState(&mx,&my);
        if (mstate & SDL_BUTTON(1)) x = mx,y = my;
        SDL_FillRect(screen,NULL,0);
        *(Uint32*)((Uint8*)screen->pixels+screen->pitch*y+x*sizeof(Uint32)) = 0xFFFFFFFF;
        SDL_UpdateRect(screen,0,0,0,0);
    }
}
黑色背景中有一个白色像素,当您按下鼠标左键时,它会移动到鼠标光标的位置。问题是,在像素出现在新位置之前,需要很长一段时间。这不是一个问题,只是像素。当我尝试移动程序窗口时,它也不会立即响应。如果我将函数printf放在while(SDL_polleevent(&event))循环中的某个地方,它也不会打印。另一方面,如果我对SDL_SetVideoMode执行相同的操作,它会在事件发生时做出响应。 而且,只有当FPS和分辨率足够高时,才会发生这种情况。如果我将视频模式设置为320x200而不是640x480,或者限制FPS,那么一切都会准时进行。 顺便说一下,我使用Ubuntu11.10和Mesa图形驱动程序。
那么,这个问题是SDL或其他软件的错误还是我的错?

它在我的计算机上也能正常工作(windows7),而(1)在
中的执行时间在1ms以下

当您将视频模式设置为较低分辨率时,一切都会准时发生,这一事实导致您的计算机资源不足和/或使用Mesa图形驱动程序的Ubuntu 11.10上未优化的功能

为了找到瓶颈,您需要分析每个函数使用的cpu时间

一些想法:

  • 将绘图/更新功能放在
    if(mstate&SDL\u按钮(1))内
  • 更新更改后的像素->
    SDL\u Update(屏幕,x,y,1,1)
  • 将旧的白色像素更新为黑色,而不是填充整个屏幕的黑色
  • 添加
    SDL\u延迟(10)就在while(1)循环结束之前
它在我的机器(windows7)上运行良好。你试过双重缓冲吗?您也不需要每次迭代都执行
SDL_FillRect()
,只需单击鼠标即可(即使这样,您也可以更改单个像素)。