游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7308|回复: 5

关于opengl刷新和双缓冲的问题

[复制链接]

13

主题

113

帖子

123

积分

注册会员

Rank: 2

积分
123
QQ
发表于 2008-6-23 23:47:00 | 显示全部楼层 |阅读模式
1,windows系统,opengl,使用双缓冲,我在主循环中这样写:
    while(1) {
        // do something
        if(计时器超过20毫秒) {
            刷新所有对象
            渲染当前帧
        }
        ::SwapBuffers(m_hdc);
    }
    程式运行良好。但如果这样写:
    while(1) {
        // do something
        if(计时器超过20毫秒) {
            刷新所有对象
            渲染当前帧
            ::SwapBuffers(m_hdc);
        }
    }
  CPU就会占用超高,这是为什么?照说第二种写法应该执行效率更高?

2,双缓冲下,我在back buffer中绘制了一幅图像,只绘制一次,再也不刷新,主循环中照常swap buffer,我发现图像会一直存在。按我原先的理解,由于只有一个buffer上绘制了图像,当两个buffer来回切换的时候,图像应该会时有时无,但事实上并非如此。这是为什么?记得之前在opengl.org上看到过,当前back buffer中的内容是未定义的,每次都应该glClear一下

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2008-6-25 12:01:00 | 显示全部楼层

Re:关于opengl刷新和双缓冲的问题

OpenGL的双缓冲是后台复制到前台

13

主题

113

帖子

123

积分

注册会员

Rank: 2

积分
123
QQ
 楼主| 发表于 2008-6-26 02:08:00 | 显示全部楼层

Re:关于opengl刷新和双缓冲的问题

回LS,对于双缓冲,这是跟各家的实现有关吗?(估计不会有这么诡异的标准吧...)如果是的话,具体哪些系统使用哪些实现?

事实上我在考虑能否依赖这个特性来进行一些优化

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2008-7-1 11:35:00 | 显示全部楼层

Re:关于opengl刷新和双缓冲的问题

第一个不是错误的吗?
如果时间没到20毫秒,为什么还要swapbuffer呢?
如果刚好是偶数次还行,如果是奇数次呢?
你的头像怎么这么丑陋?
难道这就是你低级的审美观?

while(1)
{
// do something
if(计时器超过20毫秒)
{
刷新所有对象
渲染当前帧
SwapBuffers(m_hdc);
}
sleep(1);
}

如何?
头像真的很丑陋,丑陋无比。

13

主题

113

帖子

123

积分

注册会员

Rank: 2

积分
123
QQ
 楼主| 发表于 2008-7-3 03:06:00 | 显示全部楼层

Re:关于opengl刷新和双缓冲的问题

回LS,你没认真看我的问题,或者是我表达不好。我的疑问是:为什么第一个运行良好,第二个(也即是接近你的写法那个)CPU占用率却很高?

另外,你最后的sleep(1)有什么用?

最后,我不想讨论审美观的问题,谢谢:)

21

主题

125

帖子

135

积分

注册会员

Rank: 2

积分
135
QQ
发表于 2008-7-4 01:48:00 | 显示全部楼层

Re:关于opengl刷新和双缓冲的问题

CPU占用率高,因为没有让CPU它休息下.
这就是问题所在. Sleep(1),就可以告诉 CPU,你休息 1 毫秒后才为我的线程继续工作.
然而 Sleep() 也只能说是非常粗略的暂停一下, 因为程序不可能独占整个 CPU, 在别的程序工作的时候. 往往会导致 Sleep() 延迟得更加久. 那么得考虑优先级, 或者其它的定时方法了.
问题就更加多了.哈.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 03:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表