作者NDark (溺於黑暗)
看板GameDesign
标题[心得] 容易被遗忘的游戏设计模组(1)
时间Sat Jan 23 11:42:37 2010
作者:NDark
时间:201001
"容易被遗忘的游戏设计模组"之一: FPS counter
http://0rz.tw/61wWb
FPS是frame per second的意思。最早从电视电影的制作与拨放来的。
意思是每秒拨了几个画格。有在转录影片的朋友应该比较熟悉,
台湾电视讯号的标准就是NTSC他的FPS就是29.97。每秒换了几乎30张影像。
格数(长度)相同的影片,如果拨快一点,
影片(时间)长度就会比较快拨完。人物就像快转一样。
(因为播放速度与原始影像拍摄的速度不同)
在我讲下去之前,请务必思考上面这段说明与下面的问题。避免跟不上。
所谓"拨快一点"到底是什麽变快了?
直接跳到游戏。要怎麽实现我的游戏的拨放速度符合电视的标准?
很简单,1/30秒画一张就好了。画完就送给电视。
所以最Naive(这里必须说明Naive是直接简单的意思,不一定等同於笨)的做法就是
用一个闹铃(timer,比较正确的讲法是计时器)
每跳1/30就叫我的游戏工人
把目前的墙壁刷成新的画面,
然後请电视讯号线的长官来拍照验收,送件。
上面的这个方法问题在哪里?很明显。
假如我有时候工人画的快,有时候工人画的慢,画完的时候才验收(传送)
这样电视显示的结果也会忽快忽慢。
万一电视收件的时间跟邮局一样有限制,货到的时候邮局已经下班,那这个画格就掉了。
(这是白作工,明明就有画,可是被之後的新货物盖掉了)
延伸思考
假如我某一个画格突然运算量大增,此画格画了1秒才画完。
意思是当工人在努力工作的时候,闹铃响了29次。这时候电视这头会发生什麽情况?
另一种方法大家其实都很清楚了,
我叫我的工人不停的工作,然後派一个工人拿着闹钟,
吩咐他:只要一听到闹钟响马上放下手边工作去叫长官来。
管他这个画格画完没。反正确保我有送件就好。
还没画完我还可以先拿上一个画格的墙壁来垫一下档。
甚至我在1/30秒内我工人画了好几次都不管,反正长官来有拍到最後的样子。
(好像有点虐待劳工XD)
这问题事实上早已被解决,我为什麽要花了落落长来说明。
请一定要思考我一开始提到的问题:所谓"拨快一点"到底是什麽变快了?
延伸思考
为什麽某些游戏要强调FPS是60?
明明电视的显示频率是30。(当然现在电视越来越好了,连240Hz的电视都有了)
某些神眼的玩家可以分辨出FPS 30的品质有间断的感觉。
为什麽电影(30FPS)拨出的时候却没有这种感觉?
我要谈FPS的原因是它比各位想像中都来得重要多了。
不只是在刷新画格上。
继续前段的某状况,有时候工人工作的快,有时候工人工作的慢。
意思是开发时的测试机器与最终使用者执行的机器效能不同,
甚至同一台机器效能也是变动的。
而且这问题也许不能只透过上面提到的控制播放的FPS方法来解决。
拿拍电影来举例说明:
某电影场景拍摄内容是:"有台车自左边跑到右边,差点撞到过马路的人"(游戏内容),
在台湾拍的时候用的是普通裕隆轿车(硬体)。这场戏拍了10秒(跑到)。
现在好莱屋想要重拍这场电影,
内容当然是相同的:一台车自左边跑到右边,差点撞到过马路的人
但是因为好莱屋比较有钱,找来的是一台保时捷。
保时捷一开3秒就跑到了,人都还没过马路,司机还跟你摇摇手说他已经很客气。
解决方法是把3秒的画格播慢一点让他10秒才播完?
可是这样做的时候却发现过马路的人也变慢动作,风吹的垃圾也变慢了。
所以,如果只是想要把车变慢,正确的做法应该是告诉司机,
第一画格的时候你要开到哪个位置,让摄影机拍一下。
第二画格的时候则是第二位置,让摄影机拍一下。
第三画格的时候则是第三位置,让摄影机拍一下。
直到10*30=第三百个画格的时候要停在终点,让摄影机拍一下。
游戏设计是在每个画格中进行。因此这边说明的重点是:
"在每个画格必须知道这一格的结束时要进行多少的工作量,不可以做超过或短少"
进一步说明,
当我们拍摄电影时用30Hz拍。播放时就用30Hz来播。
3D Artist 拉了一个1秒的踢腿动作,当踢到0.5秒时,就一定要踢到一半。
企划说飞越全地图100单位要飞10秒。那麽飞到1秒的时候,飞机应该正在10的位置。
因此飞机速度应该是10 / 1 sec => (10/30) / 1 frame = 0.3 / 1 frame
10 / 1 sec : 这是企划知道的速度
0.3 / 1 frame : 这才是本画格真正的速度(移动量)
而因为这个数值FPS:30是变动的。
每个画格的真正移动/变动量,要到该画格才能知道。
至此,FPS扮演的角色,大家都应该很清楚了。
实务面是,
在游戏层的各个元件(不管是绘图,移动,动画)都要能取得目前FPS的资讯,
或是当此元件的机制需要这个资讯的时候,必须要从最外层一路传进去。
延伸思考:
当FPS因为某些状况变低的时候(譬如说每秒10个画格),
除了跳/飞快一点之外还能做甚麽?
当FPS因为某些状况变得极端低的时候(譬如说每秒不到1个画格),
会不会有甚麽例外状况要特别注意?
--
"May the Balance be with U"(愿平衡与你同在)
视窗介面游戏设计教学(
http://0rz.tw/V28It ),讨论,分享。欢迎来信。
视窗程式设计(Windows CLR Form)游戏架构设计(Game Application Framework)
游戏工具设计(Game App. Tool Design )
电脑图学架构及研究(Computer Graphics)论文代读(含投影片制作)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.96.77.176
1F:推 silveriii:有看有推 01/23 12:39
2F:推 lightmaple:看完推一个 01/23 13:03
3F:推 LinaInverse:推~! 01/23 13:08
4F:推 Yshuan:请问这两篇文章可以借转吗~? 01/23 15:22
※ 编辑: NDark 来自: 140.96.77.176 (01/23 17:06)
6F:推 Alaba:好! 01/24 01:32
7F:推 cloner:推~~ 01/24 06:30
8F:推 wangm4a1:推 01/24 09:16
9F:→ vonRundstedt:推 02/19 14:10
10F:推 Andyhsu:推~ 03/11 01:54