0

我正在初始化

SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_DOUBLEBUF);

然后在调用睡眠之间循环调用,只是

SDL_LockSurface(screen);
// Will eventually twiddle pixels here...but not yet
SDL_UnlockSurface(screen);
SDL_Flip(screen);

并且调用翻转需要不同的时间,但大约 10 毫秒,这是很多白费。

所以这让我想知道我是否正在导致从视频内存复制到系统内存或其他东西,我应该以不同的方式创建表面。但是,另外,无论我传递给什么标志,screen->flags它总是等于SDL_ASYNCBLIT并且没有设置其他位SDL_SetVideoMode。所以无论如何我都无法制作任何其他类型的表面。

我是否应该创建另一个屏幕外表面,渲染到该表面,然后将其传送到屏幕上?我究竟做错了什么?

编辑:删除 SDL_Lock 和 SDL_Unlock 对并不能加快速度。SDL_Flip 很慢。

4

2 回答 2

0

我使用 Win7、Codeblocks/MingW、SDL 1.2.14。格鲁姆德里格 说:

为了有一天可能会看到这个问题的两三个人,我认为 SDL_Flip 需要这么长时间的原因是它等待 vsync,因此调用 SDL_Flip 的繁忙循环必然会受到 vsync 速率的限制。

如果这是正确的,那么 SDL_Flip 需要这么长时间的事实并不是一个实际问题,因为如果我正在努力渲染事物,那么等待 vsync 的时间就会更少。

不,有什么不对劲。我的程序直到最近才运行良好,今天我自己花了一段时间寻找自己的瓶颈的原因,结果是 SDL_Flip() 和你的一样,这让我通过谷歌搜索找到了你的问题。有趣的是,在我的旧版 WinXP 单核上性能更好,所以我猜测问题是由友好的 Win7 自动更新引起的。也许微软无意中对 GDI 进行了去优化!

无论如何,SDL_Flip 不应该花这么长时间来解决自己,如果有人想知道,我在 SDL_Flip() 上方放置了一个 Uint32 SDL_Getticks() 计时器,如果超过 5 毫秒,则输出下面的长度。结果是不时出现像 27、59 和 88 毫秒这样的数字,这并不好。当然,无论我使用 SWSURFACE 还是 HWSURFACE 作为 SetVideoMode 的标志,问题都是一样的。

在我在 SDL 网站上发表评论之前,我可能会尝试使用 SDL 1.2.15 进行重建,尽管这可能需要重建 SpriG,所以我并不着急。但总的来说,我坚持我所说的:很可能,这是 Win7 的东西,如果那是你的操作系统的话。

附录 5:17 PM EST:我刚刚编译并运行了一个使用 SDL 1.2.15 的较小的、不相关的项目,但问题是一样的:正常的平滑运动,然后偶尔出现抖动。仅在 SDL_Flip() 花费超过 5 毫秒时进行测试,输出包括从 30 到超过 60 毫秒的值,大约每两秒发生一次。

附录 5-8-12:5-4-12 有大雷雨,我不得不关闭并拔下电脑,结果第二天 SDL_Flip() 总是不到 5ms,所以现在问题解决了.

于 2012-05-03T20:42:49.260 回答
0

为了有一天可能会看到这个问题的两三个人,我认为 SDL_Flip 需要这么长时间的原因是它等待 vsync,因此调用 SDL_Flip 的繁忙循环必然会受到 vsync 速率的限制。

如果这是正确的,那么 SDL_Flip 需要这么长时间的事实并不是一个实际问题,因为如果我正在努力渲染事物,那么等待 vsync 的时间就会更少。

于 2012-04-30T03:42:23.283 回答