gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:11:38 26 4
gpt4 key购买 nike

如果我没记错的话,我以前遇到过这个问题,但是我不记得是怎么解决的了。这是我的程序:

#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);
}
}

黑色背景中有一个白色像素,当您按下鼠标左键时,它会移动到鼠标光标的位置。问题是,在像素出现在新位置之前需要很长时间。仅仅那个像素不是问题。当我尝试移动程序窗口时,它也没有立即响应。如果我将它放在 while(SDL_PollEvent(&event)) 循环中的某处,函数 printf 也不会。另一方面,如果我对 SDL_SetVideoMode 做同样的事情,它会在事件发生的那一刻做出响应。此外,只有当 FPS 和分辨率足够高时才会发生这种情况。如果我将视频模式设置为 320x200 而不是 640x480,或者限制 FPS,一切都会按时发生。顺便说一句,我使用带有 Mesa 图形驱动程序的 Ubuntu 11.10。那么这个问题是SDL或其他软件的错误还是我的错?

最佳答案

它在我的电脑上也能正常工作 (windows7),执行时间在 while (1) 内不到 1 毫秒。

当您将视频模式设置为较低分辨率时,一切都会按时发生,这会导致您的计算机资源不足和/或 Ubuntu 11.10 with Mesa graphics drivers 上的功能未优化| .

您需要分析每个函数使用的 CPU 时间,以便找到瓶颈。

一些想法:

  • 将您的绘图/更新函数放在 if (mstate & SDL_BUTTON(1))
  • 更新更改的像素 -> SDL_UpdateRect(screen,x,y,1,1);
  • 将旧的白色像素更新为黑色,而不是将整个屏幕填充为黑色。
  • 添加SDL_Delay(10);就在 while(1) 循环结束之前。

关于SDL 中具有显着延迟的视频更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com