为什么我魔兽保存的录像在哪内容会失真

《魔兽争霸》的录像,为什么长达半小时的录像大小只有几百 KB?
【ShiftyGuo的回答(194票)】:
补充一下,在理解rep只是存储操作指令和单位状态后,我小时候还一直不清楚几率相关的东西是怎么存进rep的,比如攻击力在魔兽中是个范围而不像在星际中是个确定数值,剑圣/dh这刀是否暴击/被闪避,坡下打坡上是不是miss,直到我接触了伪随机数。直到现在和别人解释伪随机数时我都用星际魔兽rep里的暴击作为材料。
粘贴评论中的举例:
为简化,假设剑圣暴击率是10%,2倍暴击,而平砍伤害是10-20,剑圣砍了一刀,实际伤害30(15*2),第二刀坡下砍坡上,miss了。如果在rep中直接储存暴击30,第二刀miss也是可以的,但是这样显然要把剑圣一局中的每一刀都要存下来,较为占用空间。而rep中采用的做法是,魔兽游戏中生成了一个伪随机数序列(这个序列在游戏中,不在rep里,但是rep播放时可以调用。例如取0-1的均匀分布,比如0.753、0.500、0.988、0.132、0.781、0.646………均匀分布即为在0-1中取到这些数中的每一个概率是一致的),然后在rep中记录随机数种子(随机数开始的序列位置)。例如本rep种子为1,即从0.753开始。剑圣第一刀坡下砍坡上,命中率70%,可以等价于伪随机数值大于0.3即命中,而0.753大于0.3,故命中。下面实际攻击取10+(20-10)*随机数,此处为0.5,故攻击为15。下面计算暴击,和命中类似,随机数大于0.9即为暴击,此处为0.988,满足,故最终伤害为30。第二刀由于0.132小于0.3,故miss。作为rep,只需要存储剑圣的坐标、命令和种子数1,就能再现这两刀。此外其他游戏里的掉宝率也是这样的,例如暗黑。那个哥布林在你决定杀他的一刹那,他掉什么已经确定了,所以叫伪随机。
ps:我们打wow时说组了个黑手,这个CD就被他黑了,是有道理的。
关于更真实更复杂的实际情况,牵扯到概率的补偿,不会永远让你感到黑手没法玩(例如最近wow中好运币roll装备若没roll到则几率越来越高)。请参考评论中zy RSN的说明。
对于近战坡下砍坡上不会miss的问题,我搞错了,答题时也忽略了这个事实。那大家把例子想成DOTA里带水晶剑的远程英雄(不带金箍棒克敌机先)吧。
虽说有点走题,不过关于魔兽世界中的掉落问题,确实如评论中所说,是在第一个人进入副本时根据掉落表生成的。不过我想表达的意思没有变,随机的事物实际上往往是不那么随机的。至于掉落表怎么做,实际掉落生成方式怎么设计,这个水很深,超出了我认知范围,还是请专业的数值人员来回答吧。
【罗纳德的回答(42票)】:
我猜一个,因为下的不是视频文件,而是剧情脚本。要看时让游戏主程序运行下就行了
【Belleve的回答(41票)】:
魔兽的记录的是这种东西:
………………1:00,从 OOO 工厂造了一个兵,位置 ……,方向 ……1:01,玩家 XXX 选择了兵 OOO1:02,玩家 XXX 对兵 OOO 下令攻击 XXX………………1:20,兵 OOO 受到攻击,挂了………………
【郭发财的回答(27票)】:
感觉楼上两位还没读懂题主的意思。
题主的意思大概是自带的游戏录像功能。
我觉得,因为这种录像不是直接录画面,而是录下这局游戏的数据。所以100多K的文件里面记录的是你的游戏数据,读取的时候,就直接读取这些数据,然后用游戏自带的功能播放。
【SmithJiang的回答(13票)】:
录像文件有三个主要内容:
随机种子数
基本信息(玩家、地图)
在我们玩war3的时候,地图初始化会产生一个随机种子,这个种子的作用是用来计算游戏中的随机数(例如AI行动,单位攻击造成的伤害)。
接着,我们每一次的点击、按键操作都会被序列化记录下来。这里记录有分成三种:
时间X,玩家X对单位X执行命令(无目标,无点)
时间X,玩家X对单位X对单位Y执行命令
时间X,玩家X对单位X对点X执行命令
游戏结束后,这些序列化数据会被保存下来。而不是正真保存了游戏录像。
再次载入录像时,war3会按照随机种子和序列重播一遍游戏。这样就保证了单位的攻击伤害,和原本的伤害完全相同。操作也会完全相同。
如果玩的多的话,大家应该会注意到。有时候有些图的录像会和原本游戏不一样。播放到一半的时候单位行为变得不正常,莫名其妙的站在原地或者明明不该死的英雄居然死了。录像完全乱套。原因也是因为随机种子和操作序列和原本的出现偏差导致的结果。
【岳阳的回答(7票)】:
除了楼上所说的,还有一点很重要,就是对于随机事件记录了随机的种子,以保证随机序列一致(比如AC在比赛中一次攻击是3,每次播放录像时必须是3)
【知乎用户的回答(8票)】:
你,知道MIDI不?
【知乎用户的回答(4票)】:
你没发现你放录像的时候要有这张图才可以吗?
【钱康来的回答(2票)】:
正如前面两位所说,其实不是视频本身而是事件
可以参考这个
【武龙飞的回答(3票)】:
这种游戏都是按状态机实现的,例如有:stand, move, attack, spell1, spell2, 这种状态机,状态机是互斥的,意思就是说我在某个时刻点只能处于一种状态,所以我只需要记录时间点和状态机就可以了。没有具体反解war3的rep,根据我自己做录像的经验。
【廖鑫炜的回答(2票)】:
目前的项目(策略游戏)也实现了录像回放机制,几个要点:
1、记录玩家的操作命令,而不是视频。这样数据量可以很小,一场战斗只有几k。
2、记录下达命令的帧编号而不是时间,比如在战斗开始的第几帧下达了什么指令。分离逻辑和渲染的Update,战斗时游戏逻辑按帧推进而不是按时间推进,这样才能做到精确回放。
3、战斗开始时生成随机种子记录下来,回放时设置该种子,保证随机函数生成的伪随机数列一致。
【石桥的回答(2票)】:
以下内容纯属瞎猜!
题主看的是魔兽争霸的录像,不是视频,这就是***!
魔兽争霸的录像保存的并不是视频信息,而是一些用户行为(建筑,攻击,路线,***物品等),当你观看“录像”的时候,平台将这些数据读出并进行“播放”,就形成了你看到的画面。
因为魔兽争霸所有的游戏模型(英雄,建筑,森林,草地……)都是后台构建好的,所以只需要加上具体的操作命令就可以得到想要的画面。换句话说,你所谓的几百kb的录像只是录像的一个部分,在它后面还有整个游戏平台。
据此可以推断,如果你会编辑那几百kb的文件,那么你完全可以“导演”一场完美的魔兽争霸战役!
胡说八道,心里不安了~~
【麦麦的回答(2票)】:
很多年前我开始打星际时,也思考过这个问题。因为再之前玩帝国2,需要在游戏开始前勾上游戏录像才会有,而星际是打完后才提示是否保存,而且文件体积比帝国的小很多。虽然都是老游戏了,但后者的设计明显优于前者。
咦跑题了。其实同为暴雪出品,魔兽的模式跟星际是雷同的。RTS,何谓即时战略?就是你作为commander下达指令(鼠标键盘操作集),电脑执行其中的有效部分。比如农民a坐标是(3,7),某矿坐标是(9,5),那你游戏开始第3秒时左键单击(3,7)再右键单击(9,5),农民这一刻就会跑去采矿。这一类指令明确而没有二义性,所以在初始地图一样的条件下,执行同样的指令,结果是一定的,胜负亦然。
印证想法的一个是战斗结束后选项不叫save video而是save replay,但这里的replay不仅是重玩的意思,还是重新演算。由于该文件已经把所有玩家的所有指令带上时间戳记录了下来,所以放录像时可以无损回放整个战斗过程,跟玩的时候一模一样,区别只在于一个是你在操作,一个是电脑根据保存在rep文件里的指令集去操作。
另一个是不知道题主有没用过类似SCtools里apm/eapm分析器的小工具。它只要读取rep文件就可以统计出这一场里所有玩家的峰值apm和平均apm等数据,也说明了rep里存的是键鼠操作。比如01:01:03 (3,7) left down或者01:01:04 'p'这样的格式。一场战斗也就几万条这样的数据,不占多少空间。rep里还存了起始地图数据,而这个也没多大。
所以比起真正录像里一帧一帧记录所有像素点,这种游戏的“录像”文件也就小多了。
以上纯属apm88的星际老菜鸟瞎扯。
【神人无功的回答(1票)】:
最逗的是录像会出错。录下来,再放时跟刚才打的天差地别
【刘腾达的回答(1票)】:
自己下载一个 RepKing 看一看
【凌零的回答(2票)】:
我知道有一个厉害的,我玩星际争霸1打七个电脑打了好久赢了然后录了录像,后来回放的时候我是第一个被电脑干掉的玩家。自此我就知道星际录像是录的指令,甚至有些随机数他都不屑于记录的。
【强丽的回答(1票)】:
几千个人的队列演练,必须是真人,你说需要的数据大不大?可是只需要不超过100个bite就能实现
121,121,121,立定,稍息,向后转。跑步走!
【杨浩的回答(1票)】:
相信你提出这个问题是以为魔兽的录像文件是份视频,所以才提出了"为什么它只有几百KB"这样的问题,事实上这份文件不是一份视频文件,它是一份二进制的文件具体格式和内容可以参考下面的内容。
我在GitHub找到的一份非官方发布魔兽3录像格式的文件描述,作者通过逆向工程和自己游戏的经验得出,里面非常详尽地描述了一个录像文件的格式和内容包括哪些东西,帮助你了解;
录像原理简而言之:魔兽客户端就是一个播放器,录像就是输入内容,播放器根据输入播放输出,其中的格式就是自己根据需求定义。
1.文件格式目录:
文件的目录大致包含一下部分,首先录像文件头包含了版本信息。虽然看到了这个版本的定义,但是对录像文件的数据没有做版本控制,这也是为什么播放录像的时候,如果客户端版本不对,就无法播放的问题。扩展一下,其实这个问题可以在定制录像文件的时候,针对不同部分的数据做特别的版本控制,以此达到兼容的问题,至少可以做到向下兼容。
===============================================================================Table of Content=============================================================================== 1.0 Introduction 2.0 [Header] 2.1 [SubHeader] for header version 0 2.2 [SubHeader] for header version 1 2.3 Version information 2.4 WarCraft III The Frozen Throne beta replay information 3.0 [Data block header] 4.0 [Decompressed data] 4.1 [PlayerRecord] 4.2 [GameName] 4.3 [EncodedString] 4.4 [GameSettings] 4.5 [Map&CreatorName] 4.6 [PlayerCount] 4.7 [GameType] 4.8 [LanguageID] 4.9 [PlayerList] 4.10 [GameStartRecord] 4.11 [SlotRecord] 4.12 [RandomSeed] 5.0 [ReplayData] 6.0 General notes 6.1 Notes on official Blizzard Replays 7.0 Credits 8.0 Document revision history
2.格式说明
这里以PlayerRecord说明一下里面的具体录像格式,按照二进制的方式读取的,其中offest代表流的偏移,size/type代表读取的数据大小,这样就能精准的定位到具体的数据了。- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -4.1 [PlayerRecord]- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -offset | size/type | Description-------+-----------+-----------------------------------------------------------0x0000 | 1 byte | RecordID: | | 0x00 for game host | | 0x16 for additional players (see 4.9)0x0001 | 1 byte | PlayerID0x0002 | n bytes | PlayerName (null terminated string) n+2 | 1 byte | size of additional data: | | 0x01 = custom | | 0x08 = ladder没有太多时间,先写个大概。。。后续会补充详细的录像内容,点赞给动力!
【JimLiu的回答(0票)】:
你说的是rep吧,rep是一个脚本文件,记录了“什么时间发生了什么事情”,然后你看到的东西,基本都是根据这个脚本,游戏给你复盘,实时重新演绎了一遍的,而不是录视频。
这就造成同一个游戏,不同版本的rep文件格式可能不兼容。或者你用了改过的客户端,比如星际高AI版,放原版的rep,也许也能放,但可能就根本无法复盘。又或者你玩war3的时候调了秘技,然后录的rep回放也会出问题。
【知乎用户的回答(0票)】:
不能用视频播放软件打开的录像(非视频格式),都只是游戏自身存储了游戏内行为而已。。
不算是录像。更像是根据保存的游戏数据的一个再次(展示)回放。
&&&&&本文固定链接:
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!
最新日志热评日志随机日志

参考资料

 

随机推荐