撰写了文章 更新于 2017-12-15 18:02:48
【弹幕程序科普计划】第四篇 同调弹幕所面对的技术问题与解决方案
【同调弹幕所面对的技术问题与解决方案】
新海诚导演曾表示过,自己曾经也很喜欢做游戏,但是游戏的音乐无法与剧情完全同步,无法100%完全控制游戏玩家的体验,这点令他不满。他希望完全控制作品中的时间和空间,因此才制作动画。然而,其实还是有一种特殊情况,游戏中的音乐可以与内容完全同步。这种情况简单讲,就是游戏的版面推进速度恒定,或者说版面推进速度不受玩家控制,这种情况下游戏作者有条件根据BGM来同步布置游戏版面,从而最大程度控制玩家情绪。而STG典型地符合这种情况。
长久以来,各类STG都或多或少存在版面与BGM配合的情况,其中不乏一些极端做法,让版面和BGM完全同步。对这类作品,有些地方称其为同调弹幕,有些地方称其为高同步STG,有时我自己会将其叫作全同步弹幕,叫法并不统一。为了方便,本文统一将他们称为同调弹幕。这类作品常具有以下特点:
1. 敌机出现频率和发弹频率与BGM节奏相符
2. 版面与BGM同步转阶段
3. 发弹时间点压住BGM鼓点
4. 版面与BGM同步结束
比较典型的作品例如前段时间C91的游戏《IKUSAAAAAAAN!》、我以前做的《东方百花宴》以及现在在做的《弹幕音乐绘》
这里给个《IKUSAAAAAAAN!》的视频链接供参考
http://www.bilibili.com/video/av7888754/
以下本文将主要讨论同调弹幕所牵涉的技术问题。不过,版面同步这件事情是有很强的主观性的。即使《IKUSAAAAAAAN!》这样的高同步版面,肯定依然有很多玩家注意不到其中的同步,而仅将注意力集中在其疯狂的弹幕上。如果实在感觉不到同步的话,请跳过本期文章。。。
本文并不会详细讲解同调弹幕艺术层面的东西,也就是怎么样才同步,怎么才能让版面和BGM配合更好之类的问题。其实,之前我曾经头脑一热,做了两个视频去解说新海诚短片MV作品的音画同步,但是解说效果非常有限。游戏的音画同步和MV其实很类似,如果通过视频加语音解说都讲不清的东西,这里想仅通过文字来讲清楚,这不是作死么。。。所以本文仅从同调弹幕的技术层面出发。那么估计很多人会问,对于同调弹幕,技术层面究竟有什么可以讲的东西。我可以负责地说,超过99.9%的人意识不到下面要讲的这个问题。
其实,对于传统的游戏做法,不管使用什么游戏引擎,理论上都是无法制作出同调弹幕的。因为游戏运行的速度总有不稳定因素,并不可能从头至尾都和BGM保持同步。
这里先说明一个概念,游戏本身存在两种推进模式,一种是按时间推进,一种是按帧推进。所谓按时间推进,就是说版面与实际时间相关,比如游戏在第20秒出现Boss,则不管在20秒时游戏运行了多少帧,都会出现Boss。而所谓按帧推进,就是说版面与帧相关,而不直接与时间相关,只有当帧率恒定不变时,游戏运行速度才是固定的。如果还是要在第20秒时出现Boss的话,则是设置成在第1200帧时出现Boss,按每秒60帧的帧率,正好20秒出现Boss。但是如果期间出现掉帧,花了21秒才运行到第1200帧,那么Boss就会在第21秒出现。
我们熟悉的弹幕游戏基本都是按帧推进的,因此会存在帧率不稳从而产生累计误差的情况。那么具体影响会有多大?要求误差在什么范围内才能做同调弹幕?根据经验,如果要压着鼓点来发弹(或者压着乐器压着歌词来发弹),发弹时间点与鼓点偏差在5帧以内时,几乎感觉不到;偏差大于5帧时,会逐渐感觉到偏差存在;当偏差达到10帧时,偏差会比较明显;当偏差达到20帧时,会直接让人感觉不同步。至于实际偏差会有多大,我们可以来算一下。假如游戏帧率从60fps偏差到60.1fps,偏差率1/600。百花宴5面后半BGM曲长3分43秒,合13380帧。
13380×1/600=22.3帧
通过计算可以看到,1/600的偏差已经超出了允许范围,这还没有算上游戏出现非正常卡顿的情况。而且不要认为正常不会偏差到60.1fps,其实即使是开着垂直同步,帧率依然是一个不怎么可靠的数字。我之前有一台旧的笔记本,玩东方游戏稳定运行在59.6fps,之前我用那台机器做出来的同调弹幕在别的机器上都不同步,也算是被坑的够惨。在这种帧率不稳可以产生累计误差的情况下,制作同调弹幕理论上不可行。即使有的作者想去做同调弹幕,也只能是一厢情愿。这里举个同调弹幕失败的例子——《东方危险领》。
http://www.bilibili.com/video/av2172105/
视频第29分钟后,接近游戏末尾,有一段非常疯狂的弹幕表演,虽然子弹打不死人,但是仅作为弹幕演出这段也非常出彩。然而,弹幕并没有和BGM同步结束,最后BGM还进入了第二次循环。我相信这肯定不是作者的本意,而是游戏长期运行在低于60fps的帧率下,使得游戏运行速度低于设计值,所以BGM先播完了而游戏还没结束。
为了解决游戏帧率误差带来的不同步问题,有从艺术层面进行妥协的做法。比如压鼓点发弹这种做法可以仅放在游戏前半部分,避免游戏后期产生误差后破坏同步感;对于版面和BGM同步结束这种做法,可以将BGM设成单次播放,从而避免在版面结尾时BGM再次响起的尴尬。但是这些方法并不解决根本问题,要做同调弹幕,归根结底必须从技术层面加以支持。
为了实现真正的同调弹幕,总共出现过三种非常具有针对性的解决方案,代表作品分别为《Akashicverse》、《IKUSAAAAAAAN!》以及我做的《东方百花宴》和《弹幕音乐绘》,以下将分别介绍。
1. 按帧推进和按时间推进相结合的版面控制逻辑
《Akashicverse》是一部非常有创意的STG作品。它为STG融入了FTG要素,是难得一见的可以“搓招”的STG。除此之外,这部作品在版面同步上也是下足了功夫。弹幕花样非常多,随BGM转阶段而不断变换,其中5面尤为出彩。为了同步,很多时候,Boss的弹幕会随时间相关,击破逻辑比较复杂。有时击破了Boss的一个弹幕,而BGM转阶段时间还没到,它就会再补一个弹幕上来。

在这部作品中,为了达到版面与BGM同步,采取了一种按帧推进和按时间推进相结合的版面控制逻辑。怎么个结合法,具体来说,它本身还是一个按帧推进的游戏,子弹发射时间点按帧定位,物体运动速度按每帧多少像素来算。但是,在版面转阶段或者弹幕转阶段时,它依据的是时间定位。也就是说,弹幕起始和结束的时间必然和BGM同步。举个非常极端的例子,如果有一个弹幕每30帧发1波子弹,要持续10秒,在正常60fps下应该是持续600帧,然而游戏卡成了1fps,在10秒内只能运行10帧,那么在这10秒内,可能会1波子弹都发不出来,到10秒后直接转入下一个弹幕。
从以上例子可以看出,这确实是一种强行将版面与BGM同步起来的方法,但是也有相当大的缺陷。至少在游戏卡顿厉害的情况下,会影响到游戏内容。除此之外,还使得游戏无法储存Replay,这点简直是致命伤。至于为什么会影响Replay,这在后续文章我们讲Replay的存储原理以后就好理解了,这里先放一下。
可能由于没有Replay功能这个缺陷,加上游戏弹幕丧心病狂,使得《Akashicverse》这作游戏现在要找个视频都比较困难,大家如果感兴趣的话,可以去优酷或者YouTube上找视频,应该还能找到几个。此外,由于有“搓招”功能,使得游戏自由度也比较高,系统稍显复杂,大多数人在游戏过程中可能并不会去体会同步方面的细节,多少有些遗憾。
2. BGM重定位法
不久前C91上发布的游戏《IKUSAAAAAAAN!》,这作游戏完全可以称其为音乐游戏。从道中到Boss战所有弹幕甚至所有特效都和BGM高度同步,所有Boss弹幕都是时符。道中和Boss战都分为几个阶段,会对玩家的表现进行评分,如果评分低于指定值,就会在BGM转阶段处强行将版面停止,然后进入下一个关卡。由于和BGM转阶段部分配合的天衣无缝,所以版面强行停止也毫无违和感。

对于这样一作游戏,曲子长度随便就上3、4分钟,如果不做特别处理,累计误差将完全破坏同步性,所以这作游戏在技术上也用了非常有创意的解决方案。在游戏设置选项中,可以看到这样一个选项,称为BGM同期补正机能。
解释一下这个功能的原理。在游戏进行时,游戏将每隔一段时间检测一下BGM播放的进度,如果发现BGM播放的进度与版面的进度偏差大于指定值时,就将BGM从指定的位置继续播放。至于偏差大于指定值具体是多少,那就是以上画面中写的0.05秒。至于BGM从什么位置继续播放,这个位置可以通过版面进度(单位:帧)除以理论帧率(单位:帧/秒)来计算获得。这种方法概括来讲,就是一种根据游戏进度对BGM进行重定位的方法。正是基于这种方法,在本作游戏中时而可以听到BGM的卡顿现象,这种现象其实是由于版面出现了卡顿或延时后,在对BGM进度进行调整。
从本作游戏可以看出,这种BGM重定位方法起到了不错的效果。
除了以上两种实现同调弹幕的方法,还有一种是我从《东方百花宴》开始一直使用的方法,我称其为绝对帧率控制法。考虑到篇幅原因,这种方法将在下次介绍。由于牵涉到帧率控制问题,下次将对传统的帧率控制方法以及改良方法一并做出介绍,敬请期待。
wrath 1年前
发布