【问题标题】:SDL_SetVideoMode ignores flags & SDL_Flip is slowSDL_SetVideoMode 忽略标志 & SDL_Flip 很慢
【发布时间】:2015-04-28 18:09:07
【问题描述】:

我正在初始化

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 很慢。

【问题讨论】:

  • 某处,一只狗在吠叫。

标签: sdl sdl-1.2


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我使用 Win7、Codeblocks/MingW、SDL 1.2.14。 Grumdrig 说:

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

    如果这是正确的,那么 SDL_Flip 需要这么长时间的事实并不是 实际问题,因为如果我正在渲染东西,那么 等待垂直同步的时间会更少。

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

    无论如何,SDL_Flip 不应该花这么长时间来解决自己,如果有人想知道,我在 SDL_Flip() 上方放置了一个 Uint32 SDL_Getticks() 计时器,如果超过 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,所以问题现在解决了。

    【讨论】:

    • Windows 对我来说不是一个因素,因为我使用的是 Mac。听起来您也看到了与我不同的东西,因为我的 SDL_Flips 每次都在 10 毫秒的几毫秒内。
    • 我的印象是,Apple 将所有精力都放在了硬件表面上,因为操作系统 GUI 是在硬件表面上运行的,因此可能要归咎于优化程度较低的软件表面。感谢您的帖子,无论如何它对我很有用,并且我确实解决了我的问题版本,如您在上面看到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多