游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3096|回复: 7

“双倍缓存”,会使“操作”与“显示”之间出现多少帧

[复制链接]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2011-8-20 15:32:00 | 显示全部楼层 |阅读模式
以前的2D游戏里是没有“双倍缓存”的。
视频缓存只有1个,而且屏幕刷新该内容时缓存的内容不能改变(不然会出现闪烁)。
所以,游戏画面的渲染必须在“垂直回归”的过程中完成。
所以
“垂直回归”开始 -> “操作” -> “渲染” -> 垂直回归结束后开始“刷屏”
就成了一个游戏循环。

进入3D时代之后,为了能在刷屏的时间里进行渲染,人们想出的方案是“双倍缓存”。
一个缓存参与刷屏,另一个缓存参与渲染。这下,硬件就有了足够的时间进行渲染了。

可是双倍缓存也有一个缺陷:
如果关掉“垂直同步”,那么画面会出现横切现象,就是所谓的“撕裂”。
如果开启“垂直同步”,那么一帧画面渲染完成之后不能马上显示,也不能马上渲染再下一帧。

于是,“三倍缓冲”出现了。
一个缓存参与刷屏,一个缓存等待刷下一帧,一个缓存渲染再下一帧。

问题:
“单倍缓存”下的“操作”与“显示”之间的延迟是几帧?
“双倍缓存”下的“操作”与“显示”之间的延迟是几帧?
“三倍缓存”下的“操作”与“显示”之间的延迟是几帧?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2011-8-20 16:03:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

2d游戏也存在这个情况,而且DOS时代就存在。

只是并无前台后台之后,所有的后台缓冲需要自己实现。

后来DirectDraw带来了主缓冲与后台缓冲之分。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2011-8-20 20:35:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

不知道这个“操作”做了些什么工作

撕裂主要也是主表面在更新的时候刚好遇到显示器进行刷新,而显示器的刷新跟主表面的更新是两个不同的速度,导致出现撕裂的现象。

2D游戏在早期也需要后台缓冲,“操作”如果是值游戏逻辑的话,一般先绘制到后台缓冲,然后在等垂直回扫一个周期后把后台拷贝到显示区内存。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-8-20 22:10:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

“操作”,就是玩家按了哪个按钮。
比如,玩《魂斗罗》的时候,玩家按了“B键(开枪)”。

如果是单倍缓存,那么玩家按了B键之后,下一帧画面上马上会出现子弹。

如果是双倍缓存,那么玩家按了B键之后,下一帧画面是刚刚渲染完成的没有子弹的画面。再下一帧才是有子弹的画面。

格斗游戏,比如《拳皇97》,1帧的操作延迟会导致某个技能无法达成连击。
比如八神庵的BUG技能“鬼步”。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-8-20 23:51:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

PS平台上的《生化危机2》,用的是 双倍缓存(下面是PS1显存分配图)


PS平台上的《铁拳3》,用的是 单倍缓存(下面是PS显存分配图)

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2011-8-26 12:40:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

瞎说8道。

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2011-8-26 18:41:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

打开"双倍缓存"看FPS是多少.
再关闭"双倍缓存"看FPS是多少.

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2011-8-27 12:31:00 | 显示全部楼层

Re:“双倍缓存”,会使“操作”与“显示”之间出现多少

啥乱七八糟的说法。

1.double buffer用处是防止闪烁,这跟垂直扫描没什么太大关系。
比如显示一个地图+人物,如果直接绘制到屏幕,那么人物绝对会闪烁,跟wait vertical没有关系。
所以需要backbuffer,把东西全部绘制到banckbuffer在一次性画到屏幕

2.等待垂直刷新的作用,考虑更新backbuffer->屏幕时, 此时如果正在显示器刷新,那么出现的画面效果就是一部分属于前面一帧,一部分是当前帧。画面会有撕裂感。所以要等待垂直扫描完成后再更新画面。

3.triple buffer的作用,单个的backbuffer,在等待垂直扫描时没什么事情可以干,所以出现了triple buffer,这时可以绘制下一帧数据。,绘制完成后如果另外一个缓冲已经提交完毕,则交换2个buffer的用途

3个buffer情况是这样
a:正在显示的
b:等待扫描完成后显示的
c:正在绘制的

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 17:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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