播放期间数据真的修改了那么多吗?
我假设重新启动关卡之间的长时间停顿是整个关卡的重新加载。但是在我看来,一个实施良好的系统应该只能“ ping”回到开始的水平。
它在游戏机上更为引人注目,但在PC游戏上却并不引人注目。
播放期间数据真的修改了那么多吗?
我假设重新启动关卡之间的长时间停顿是整个关卡的重新加载。但是在我看来,一个实施良好的系统应该只能“ ping”回到开始的水平。
它在游戏机上更为引人注目,但在PC游戏上却并不引人注目。
Answers:
现在好了-这是一个简单但有趣的问题。
重新加载关卡时,需要考虑的因素太多,答案可能有很多方面。
如果您的关卡状态包含大量资产,那么在将关卡重新加载回保存/任务状态时,从干净的状态开始可能会更实际,因为这样可以在重新加载时保持关卡的准确状态,但不会花费很多处理。但是,如果只考虑少数几个资产,则仅重置资产会更有效-确保您可以在较小的级别上快速重新开始操作。后者尤其如此,当您不需要保留场景中的任何东西或不受游戏选择的影响时-如果您不需要从第一次穿过村庄时就保存尸体,他们就不会需要通过该级别重新加载,从而节省了处理器时间并节省了/任务状态访问时间。
一个很好的例子就是第一人称射击游戏,它使用的地形破坏/子弹贴花在游戏过程中具有持久状态,但是如果您重新启动该关卡或关卡则不会停留。
如果要倒转关卡而不是销毁并重新加载它,则必须跟踪每个更改的状态。如果您用火箭弹在墙壁上打洞,您会从掉落在墙壁上的碎片中产生地形斑点,墙壁的模型将改变以产生洞,并且您将产生粒子效果,使其看起来更漂亮。要通过将其倒回“可重新启动”状态来进行清理,您必须:
由于有太多的资源可以跟踪以倒带某个级别,因此通常只需简单地破坏整个级别并以默认状态或特定于任务的状态再次重新加载所有资产,就不会占用大量处理器。必须重置特定对象涉及在场景中搜索对象列表,然后访问其属性以重置它们。而不是在墙上的那个弹孔被清理修复,你不需要caluclate任何清理行动,从内存中直接删除的整体水平,并从头开始重新加载它。
这意味着可以从一个状态对象(保存游戏文件或任务脚本)完成关卡的重新加载,而无需动态计算。对于调音台,光盘的加载时间会加剧这种情况。它还可以帮助PC游戏,因为它可以将没有处理能力的计算机纳入考虑范围,以使加载时间可以接受。
因此,对于较大的内容级别-加载单个状态,而不是计算和“倒带”一个状态:
但是,作为反例,格斗游戏(现实生活中的最佳示例是Street Fighter 4)可能不需要重新加载所有这么多资产才能重新启动关卡。这2个玩家,该关卡的环境状态和简单关卡计时器大部分是静态的而不是动态的(每轮回合都会以100%的速度重生玩家的健康状况,计时器重置为90秒,并且关卡没有弹孔[或这么做!] ),因此重新设置级别是使战士保持充分健康并将环境恢复到原始位置(例如某些级别的围观者)的问题。
因此,对于格斗游戏,当进行重新比赛(不是一轮又一轮)时,您需要:
这实际上就是整个列表-这意味着快速状态重置而不是完整级别的重新加载更为可行。当您最初开始比赛时,这也可以通过加载时间来显示。加载所有角色和关卡模型需要花费很长时间,但是只有很少的处理器滴答声才能重置与已加载模型之间的比赛之间的角色起始位置。
重要的是要注意,这也是格斗游戏的一项更迫切的需求,因为他们的玩家往往想迅速恢复原状,因为比赛通常只能持续一分钟-强调这个答案在很大程度上取决于游戏和体裁。FPS要求更多动态资产,而Fighters要求快速重复行动。
我希望这可以使您的问题有所启发。
为了澄清有关控制台的问题的现有答案:它们没有足够的内存来存储大型复杂游戏的开始状态和当前状态。
一个游戏可以分别存储关卡和初始状态,以便可以仅重新输入状态,这很可能是许多游戏所做的。但是,即使流式传输也要比保留在内存中的速度慢很多。
最新的“最佳”控制台在CPU数据和图形之间共享的内存只有512MB。那太小了。主机开发当前令人头疼的问题之一是试图适应具有如此少量内存的满足当今质量水平的游戏。千字节计数可能很重要,尤其是在发货日期之前。存储关卡初始状态的副本是可以完成的一些数据工作,不但可以使关卡重新加载更快,还可以将更多的内存用于使游戏更加有趣的事物。
理想情况下,玩家花在游戏上的时间要多于死亡和重启游戏的时间,因此在游戏过程中进行优化以获得更好的体验更有意义。
下一代控制台及其8GB内存可能会发生巨大变化。或者,它们可能保持不变,仅使用更高分辨率的模型和材质以及大量活动的游戏对象。时间会证明一切。鉴于PC游戏通常针对具有2GB RAM和512MB VRAM的机器(尽管许多机器可以扩展到更大的值),因此就最低基准而言,新游戏机的8GB相当豪华。在不久的将来,我们可能会看到游戏过渡到需要64位CPU / OS和4-8GB RAM和1-2GB VRAM的游戏。然后,将多个状态存储在内存中以进行快速快照应该容易得多。
我不同意Blue的大部分回答,我不认为存在不重置级别的技术案例-我当然从未遇到过。关卡加载几乎总是比关卡重置慢,实际上,我发现很难想象不会有这样的情况。在大多数情况下,如果开发人员选择,游戏可以提供有效的即时关卡加载。
真正的答案是,如建议的那样,它更容易,更快捷。无论如何,重复加载关卡是游戏需要的东西,因此将其重新用于关卡重新启动是相对简单的。重置需要复杂的新途径,并且有大量潜在的新错误和内存泄漏的可能,并且需要投入大量的开发时间。在某些情况下,它可能还会增加内存限制。由于很少开发者会花费大量时间来开发游戏,因此关卡重置等项目会沿途掉线,这是令人遗憾的趋势,尤其是如果游戏架构并非一开始就最好的话。
尽管我认为可能需要重置“倒带”的情况,但实际上大多数游戏仅需要存储原始状态,提供一种有效的方法将保留的对象完全重置为该状态,并提供一种将对象标记为放弃重置。游戏状态信息也需要存储和恢复。与整个级别的要求相比,此类信息通常在内存上相对较少,因此,这样做无需从磁盘上缓慢,昂贵地加载数据(包括纹理和模型之类的大项),并以快速,低成本的方式代替它。 -场景的内存传递。
为了允许进行大级别或无缝级别的游戏,即使内存有限(内存总是太小,问题是要先达到RAM还是显卡的极限),还有另一种策略:
内存中只有播放器当前需要的部分,或几秒钟后将需要的部分。从内存中删除可能不再需要的模型,纹理,声音样本...。
牢记《地牢围攻》(开发人员曾经声称,内存管理比实际游戏具有更多的处理能力),大多数MMORPGS都会这样做,在开放环境下的Shooters不得不这样做,...在这种情况下,级别(甚至30秒钟前的重生点)可能不再(完全)在内存中。
通常,重新加载是最简单的方法,最便宜的方法,也许是最快的方法。
编辑:这是一篇关于地下城围攻的加载机制的论文:地下城围攻的连续世界
借助Sean和Blue关于物理平台限制和赞成决策的出色答案,我将在另一种方法中发表评论:
这样您的loadLevel()调用就可以正常工作了,是的!您可以流式传输关卡文件信息,并逐步根据该信息构建世界,创建对象以及随心所欲地加载纹理和声音。然后,当所有操作完成-或“足够”完成就可以开始播放时,您可以调用startPlay()并显示您的世界,然后开始播放音乐。
现在,当您完成关卡操作,退出菜单或退出游戏时,您可以调用unloadLevel()释放您一直持有的所有资源和内存,以提供流畅的体验。
现在,当您想添加“重启级别”功能时会发生什么?好...
unloadLevel(currentLevel);
loadLevel(currentLevel);
startPlay();
您完成了!没有新的代码,最多只有几个简单的函数调用,并且您已经编写并调试了所有代码,因此现在您的新闪亮的Restart Feature已从列表中删除,并且可能再也不会遇到-精简,不生锈的代码是最好的一种!将代码移到restartCurrentLevel()函数中,您可以将代码折叠起来,不再查看它-当然,也许在确保有一个级别可以重启之后:)
但是,然后您想知道这是否不是浪费,卸载您将要再次重新加载的东西。好吧,如果您的级别和资源很小,那么即使在速度较慢的系统(甚至是较旧的智能手机)上,每次调用“重新启动”时,您最多需要花费几秒钟的空闲时间来加载负载,那么谁在乎呢?“过早的优化”可以使您的时间变得更好。
嗯,但是现在您的音量在增加,纹理也变得更加细腻,音轨以512kbps的速度撕裂,每个声音和音乐层都有单独的通道(这在当时看来是个好主意,尽管您不记得为什么。 ..)以及有关“状态起源的体素射线追踪多维傅立叶变换矩阵”的内容,您认为这完全是虚构的,不是真实的东西,并且级加载实际上需要一段时间,并且它开始使您烦恼。您甚至已经对真实的人进行了测试,他们实际上对等待时间表现出厌恶,因为它比同类游戏更糟糕(您不希望拥有100名玩家的MMORPG首都在2秒钟之内就可以全部加载,是吗?),这是一个问题。
那么如何优化?好吧,如果关卡重新加载是个问题,那么关卡加载不是问题吗?如果您认为这只是重新加载,那么为什么人们在现实世界中重新加载您的关卡的次数要比最初加载水平的次数多?听起来像是游戏问题,而不是代码工程问题。谁认为一次又一次地重新加载关卡很有趣,只是希望它更快而不是完全可以避免?
首先解决实际问题!
但是可以说,您的游戏经过精心设计,因此至少应该偶尔重新启动,并且加载时间足够长,因此可以一次执行,这是完全不可避免的,但您不想再次执行。无论如何,这是什么样的游戏?似乎有点怪异的问题……也许是高分辨率的类似Portal的游戏,其中假定您要反复弄乱这个难题?
首先,您必须认识到这不会是微不足道的。您将不得不编写全新的,未经测试的代码,并且它是“依赖于状态的”,因此您甚至可能不知道在关卡游戏之间将要重用或不重用什么。您的关卡中是否存在随机元素,生成物,可变纹理(您的骨骼有时只穿盔甲吗?)或其他变化元素?是否有随播放器而变化的事物,例如衣服或定制模型或颜色/门/陷阱?
您将要进行比较,其中有很多。您将遍历关卡元素,比较所需的内容和当前加载的内容(您对上一个关卡而不是此关卡加载的内容怎么做-释放它们或保留以防止将来发生加载?)。如果这确实对您的游戏来说很重要,则您可能需要更改加载/卸载代码,以在加载之前查看是否已加载某些东西(使代码具有多种用途,但可能会在以前的功能和功能中引入新的错误)仔细释放不久将不再使用的资源)。叹。
无论您做什么,即使您的游戏很简单,也要在重新启动某个关卡时遇到基于关卡/玩家状态的晦涩的错误,而这并不是您第一次加载关卡时发生的。因此,您可以使用以下文字编写游戏更新:
“将炸弹上的头盔扔到砖块上,该砖块附近也有导弹爆炸,该砖块也在水面200像素之内,不会再破坏您的游戏数据或导致游戏崩溃。”
您是否曾经注意到,大多数人只是在现有墙壁上油漆或干砌墙面,而不是剥落至底层,或者将地毯铺在硬木地板上而不是将其拉起?
一个简单的事实是,它需要付出更多的努力才能获得最小的回报。在大多数情况下,在现有墙壁上绘画是可以的,并且撕裂硬木地板的价值通常很小或根本不存在。
在软件中,从游戏到多媒体Power Point演示文稿,情况都是如此-如果您要做的只是将载入画面缩短几秒钟,而人们花了他们1%的时间在看,那么做起来就变得微不足道了,否则您将获得您投资时间的回报很差。
因此,大多数游戏都不会打扰,而且我很难想到很多游戏,除了一些极端的例子,加载屏幕使本来不错的游戏变得不那么值得了。在极端的例子中,为更快的关卡加载进行优化是有意义的,这只是向公众公开的一小部分游戏,甚至可能是一小部分因从未发布而从未见过的游戏。
因为很难开发出相反的行为,这就是将静态游戏数据(例如纹理,地质信息,未受影响的暴民)保留在内存中,并仅重新加载动态数据(例如玩家位置,玩家状态,任务状态,库存) 。
由于花费更多的金钱和时间,因此游戏开发人员通常不会这样做。