问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

时空幻境|如何实现时间倒流的魔法

发布网友 发布时间:2023-03-13 03:08

我来回答

1个回答

热心网友 时间:2023-10-20 11:03

时空幻境是一款很有趣的独立游戏,游戏最大的一个特点是可以让时间倒流,回到前面的位置,灵活运用时间倒退的功能,触发各种机关,完成关卡。

如何让游戏内的时间倒退,这是一个有趣的问题,在第一次这个游戏的时候,还是蛮震惊的,或许是第一次遇到这种类型的游戏,时间倒退的机制让人眼前一亮,当时并没有多想,现在从程序的角度思考,如何实现这一机制呢?

使用命令模式来实现是一种可能的方法。

定义看起来有些晦涩,其实并不难理解。在做游戏的时候,我们会将玩家的输入操作转换为游戏内的一个动作。比如按↑跳跃之类的。命令模式定义了一个Comand基类,而其他操作都会继承这个基类,并实现execute()和undo(),大概是这样的:

这样我们就把游戏内对象的动作封装到了Command类中,控制一个角色就相当于执行一系列Command命令。这样做的好处是,我们可以记录用户的操作,把命令保存在一个stack中,当时间倒退的时候,只需要取出一个个Command命令,然后执行undo操作就可以了。

命令模式的好处是实现完各种命令以后,实现时间倒退,前进,加速减速就很简单了,只要不断执行execute或者undo就好了。缺点也很明显,这些命令并不好实现……

在时空幻境中,主角的动作其实比较少,只有跑跑跳跳,还是比较好实现的,但是也有很多其他的物体,这些物体也在运动,并可能与主角进行交互,所以如果用命令模式,实现起来还是相当复杂的。

另一种方式比较暴力,就是备忘录模式,也就是保存游戏状态。

这个模式不用多说,就是每一帧将当前世界的状态做一个快照保存下来,然后当时间倒退的时候直接读取状态就好了。这种方法的好处就是:很好写,速度快。缺点当然就是比较耗费内存。

究竟有多么消耗内存呢?其实可以大概计算一下,假设一个关卡中有20个需要记录状态的游戏对象,每个对象大概需要6~7个属性(位置,移动速度和其他属性等,这里不太确定,不过我觉得需要的属性应该不多),出了位置以外,其他属性应该并不需要很高的精度,可以进行优化,不过这里还是先按照8个字节来算。那么游戏运行1个小时大概需要的内存就是:
一帧需要的内存 = 20 68 = 960(byte)**
一秒如果设定为60帧,那么内存消耗 = 960 * 60 = 57600 (byte)
** 一个小时的内存消耗 = 57600 * 3600 / 1024 / 1024 = 197 (MB)**

接近200MB的消耗!这确实非常多,但是也并非不可行。还是有很多优化方案的,比如减少保存属性的字节。或者采用增量的保存方式,不是没帧都去保存所有值,而是保存改变值,这样会节省大量无效的内存,因为大部分时间,玩家可能是站在某个地方傻傻不动的。

利用上面的方法应该可以剩下一大半内存,另外,应该很少有人在一个章节玩一个小时,大概10~20分钟基本都可以完成了。实际上这个数字还算比较理想的了。

本来到这里差不多结束了,不过我搜到了一个帖子: https://news.ycombinator.com/item?id=9484197

这个,大概是作者对于游戏机制实现的一些回答(从语气上看应该是吧),虽然英语很渣,不过大概可以看懂一些。

大概是说,作者大部分情况下记录了世界的状态,而不是记录事件(除了第五章)。实际上作者上述两个模式都有使用,并且表示使用命令模式非常令人烦躁,而且编写相反状态也非常复杂。

作者还表示,和与内存的消耗相比,CPU的消耗是更大的问题,所以他选择了使用保存状态的方法,在Xbox 360上,实际上在内存缓冲区消耗完之前,大概可以运行30-45分钟的样子。CPU消耗大应该是命令模式在需要执行命令很多的情况下可能会进行大量的计算,并且如果玩家进行加速操作,可能就更伤了。

另外,如果缓冲区被消耗完,那么就抛弃掉最开始的状态,这样虽然你并不能回到最初的状态,但是作者表示,好像并没有什么注意到这一点。

不知道有没有更好的实现方法,感觉其实都挺暴力的……

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音火山版怎么查看钱包 查看方法介绍 职能手机v3职能手机的优点和缺点 关于Cascode运放的偏置电路 vb WindowsMediaPlayer1控件怎么同时播放两个视频文件 太阳马戏团特点 【加拿大必知百科系列】加拿大文化璀璨之星—太阳马戏团 太阳马戏团简介 垃圾短信如何拦截设置 垃圾短信拦截设置的方法 vivo xplay3s用奇兔刷机刷机后打电话显示SIM卡错误是怎么回事?卡重新插... 为什么我的vivo xplay3s联通卡插上去显示无SIM卡呢? 在有窄有宽的道路上行走怎么形容成语 龇的意思是什么 如何选到靠谱的股票?如何选到好股票?网上买理财会亏本金吗?有风险吗? 度小满有钱花可靠吗? 济南轻骑畅胜的摩托车怎么样?畅胜qm125-9c有谁知道这车,麻烦介绍下。看图 豪爵悦星 hj125-9c是什么发动机和9A发动机有啥不同? 建筑中,外墙的说明,外墙9b或是9c是什么意思 飞利浦9@9c的介绍 9c是什么航空公司 9c介绍 恒赢(180天)周期型开放式产品(代销建信理)到期了,怎么赎 有谁听说过骨髓增生异常综合症的病因和治疗方法的?广州有哪些地方可以看这种病 什么是骨髓增生异常综合症?我被诊断为此病,但不知道是什么 骨髓异常综合症怎么引起 ipad能在快手上看其他人的粉丝吗 2019年12月贷款买房lpr看哪个月的 房贷利率12月低还是1月份低 地里的出产和地里的初产有什么区别 出产[chū chǎn]什么意思?近义词和反义词是什么?英文翻译是什么? miui14怎么设置清后台和苹果一样 有什么安卓手机配置是四核1g以上,运行内存是1g以上,屏幕尺寸是4.3~4.7寸,分辨率是480×800以上,像... 胡天八月不飞来山回路口白草折寸光不与四时同接天莲叶送君去千秋一夜为三横角弓空留马行处 2016年离中秋节,国庆节,重阳节,腊八节,元旦节,春节分别还有几天 2016年重阳节出生五行缺什么 OPPO手机微信无法接收QQ离线消息? 带黑边白棉袄怎么洗干净? 作业帮怎么当老师赚钱 累瓦结绳是什么意思 佳能2016J复印出来一擦就掉,换了定影膜,调高了温度也不行。有经验的朋友帮帮忙谢谢了 全民k歌刷粉之后想取消怎么办 伊回收可靠吗? 高伊同请假消失,为你带回一条高定礼服裙 伊清林羊肉是真的吗 衣带渐宽终不悔,为伊消得人憔悴,形容什么样的意境? 麻烦朋友..."伊儿真味‘’能通过注册吗,, 携程低速抢票能抢到吗 携程高铁学生票打几折 阴阳师晴明。面具怎么去掉 阴阳师脸上的出现面具是怎么回事 日本阴阳师脸上带的布怎么看东西,就是那种全遮面的。 阴阳师翅膀面具哪里多