我正在使用
进行初始化SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_DOUBLEBUF);
然后在循环中调用sleep之间的调用,只需
SDL_LockSurface(screen);
// Will eventually twiddle pixels here...but not yet
SDL_UnlockSurface(screen);
SDL_Flip(screen);
对翻转的调用花费了不同的时间,但是大约10毫秒,这是无用的。
所以这让我想知道我是否会造成从视频内存到系统内存的副本等等,我应该以不同的方式创建表面。另外,screen->flags
总是等于SDL_ASYNCBLIT
,并且没有设置其他位,无论我传递给SDL_SetVideoMode
的标志如何。所以我无论如何都不能制造任何其他类型的表面。
我应该创建另一个屏幕外表面,渲染到那个,然后将其blitting到屏幕上吗?我做错了什么?
编辑:删除SDL_Lock和SDL_Unlock对没有什么可以加快速度。 SDL_Flip很慢。
答案 0 :(得分:0)
为了那两天或两个人,有一天可能会看到这个问题,我认为SDL_Flip需要这么长时间的原因是它等待vsync,所以调用SDL_Flip的繁忙循环必然受到vsync的限制率。
如果这是正确的,SDL_Flip需要这么长的事实并不是一个实际问题,因为如果我正在做渲染工作,那么等待vsync的时间会更短。
答案 1 :(得分:0)
我使用Win7,Codeblocks / MingW,SDL 1.2.14。格鲁德里格说:
不,有些事情是错的。我的程序直到最近一直表现良好,我今天花了一段时间寻找自己瓶颈的原因,结果就像你的SDL_Flip(),这引导我通过谷歌搜索你的问题。有趣的是,在我的旧版WinXP单核上性能更好,所以我的猜测是问题是由友好的Win7自动更新引起的。也许微软无意中取消了对GDI的优化!为了那两三个人,有一天可能会看到这一点 问题,我认为SDL_Flip需要这么长时间的原因是它 等待vsync,所以调用SDL_Flip的繁忙循环必然是 受vsync率限制。
如果这是正确的,那么SDL_Flip需要这么长时间的事实并非如此 实际问题,因为如果我正在做工作来渲染事物,那么 没有时间等待vsync。
在任何情况下,SDL_Flip都不应该花这么长时间来解决它自己,如果有人想知道,我把Uint32 SDL_Getticks()定时器放在SDL_Flip()之上,并在超过5 ms时输出下面的长度。结果是不时有27,59和88毫秒的数字,这是不好的。当然,无论我使用SWSURFACE还是HWSURFACE作为SetVideoMode的标志,问题都是一样的。
在我对SDL网站发表评论之前,我可能会尝试使用SDL 1.2.15进行重建,尽管这可能需要重建SpriG,所以我并不急于求成。但总的来说,我支持我所说的:如果那是你的操作系统,那么机会是,它是Win7的东西。
附录美国东部时间下午5:17:我刚编译并运行了一个使用SDL 1.2.15的小型无关项目,问题是相同的:正常的平滑运动,偶尔会出现混乱。仅在SDL_Flip()花费超过5毫秒时进行测试,输出包括从30到超过60毫秒的值,这大约每秒或每两秒发生一次。
附录5-8-12:在5-4-12有一个很大的雷暴,我不得不关闭并拔掉电脑,结果第二天SDL_Flip()总是在5ms以下,所以问题现在解决了。