为什么重新启动关卡时游戏似乎重新加载了整个关卡?


47

播放期间数据真的修改了那么多吗?

我假设重新启动关卡之间的长时间停顿是整个关卡的重新加载。但是在我看来,一个实施良好的系统应该只能“ ping”回到开始的水平。

它在游戏机上更为引人注目,但在PC游戏上却并不引人注目。


8
答案很大程度上取决于游戏,开发人员,他们的习惯和经验以及更多因素。在一般水平上的唯一正确的答案是:有时它被修改了,有时没有,有时东西在流,因此一开始不在内存更多,有时游戏已经的“ping”回级开始,有时没有充分理由说明为什么不能做到这一点的游戏,有时仅仅是因为执行不力而已。
基督教徒

4
一般来说,重新加载关卡(将所有内容置于初始状态)要容易得多,而不是撤消玩家所做的一切。无论如何,我的经验就是如此。
本杰明·丹格·约翰逊

问题不是黑白的。重新加载多少状态?很多游戏都没有充分理由重新加载整个纹理集。当然,从第5级要6级可能意味着加载新的纹理,但是,这并不意味着你应该这样做,你每次(重新)开始6级
MSalters

@MSalters主要是关于游戏状态而不是资源,您可能不需要重新加载常用的纹理,但是更多的是您已经杀死的敌人-需要销毁它的对象并在其初始状态下重新加载(甚至如果他的纹理仍然很好地存储在内存中。)
Tom'Blue'Piddock

我认为有人在旧系统上玩Wing Commander III。
Erik Reppen

Answers:


54

现在好了-这是一个简单但有趣的问题。

重新加载关卡时,需要考虑的因素太多,答案可能有很多方面。

如果您的关卡状态包含大量资产,那么在将关卡重新加载回保存/任务状态时,从干净的状态开始可能会更实际,因为这样可以在重新加载时保持关卡的准确状态,但不会花费很多处理。但是,如果只考虑少数几个资产,则仅重置资产会更有效-确保您可以在较小的级别上快速重新开始操作。后者尤其如此,当您不需要保留场景中的任何东西或不受游戏选择的影响时-如果您不需要从第一次穿过村庄时就保存尸体,他们就不会需要通过该级别重新加载,从而节省了处理器时间并节省了/任务状态访问时间。

一个很好的例子就是第一人称射击游戏,它使用的地形破坏/子弹贴花在游戏过程中具有持久状态,但是如果您重新启动该关卡或关卡则不会停留

如果要倒转关卡而不是销毁并重新加载它,则必须跟踪每个更改的状态。如果您用火箭弹在墙壁上打洞,您会从掉落在墙壁上的碎片中产生地形斑点,墙壁的模型将改变以产生洞,并且您将产生粒子效果,使其看起来更漂亮。要通过将其倒回“可重新启动”状态来进行清理,您必须:

  • 删除该墙的任何动态生成的小框(但不要从加载状态中删除那些小框)
  • 从弹孔中去除灰尘的颗粒效应
  • 更换/修理墙壁以摆脱您创建的孔
  • 重置玩家弹药
  • 等等...

由于有太多的资源可以跟踪以倒带某个级别,因此通常只需简单地破坏整个级别并以默认状态或特定于任务的状态再次重新加载所有资产,就不会占用大量处理器。必须重置特定对象涉及在场景中搜索对象列表,然后访问其属性以重置它们。而不是在墙上的那个弹孔被清理修复,你不需要caluclate任何清理行动,从内存中直接删除的整体水平,并从头开始重新加载它。

这意味着可以从一个状态对象(保存游戏文件或任务脚本)完成关卡的重新加载,而无需动态计算。对于调音台,光盘的加载时间会加剧这种情况。它还可以帮助PC游戏,因为它可以将没有处理能力的计算机纳入考虑范围,以使加载时间可以接受。

因此,对于较大的内容级别-加载单个状态,而不是计算和“倒带”一个状态:

  • 处理器密集度较低
  • 在较低层的计算机上效率更高
  • 使任务脚本和保存文件以相同的方式使用(重新启动关卡时可能使用相同的加载系统来加载保存状态或任务检查点状态)
  • 意味着您作为开发人员重设关卡的工作更少 -从会话数据编程完全重装要比跟踪和倒带容易得多。这可能是最有影响力的一点

但是,作为反例,格斗游戏(现实生活中的最佳示例是Street Fighter 4)可能不需要重新加载所有这么多资产才能重新启动关卡。这2个玩家,该关卡的环境状态和简单关卡计时器大部分是静态的而不是动态的(每轮回合都会以100%的速度重生玩家的健康状况,计时器重置为90秒,并且关卡没有弹孔[或这么做!] ),因此重新设置级别是使战士保持充分健康并将环境恢复到原始位置(例如某些级别的围观者)的问题。

因此,对于格斗游戏,当进行重新比赛(不是一轮又一轮)时,您需要:

  • 将生命值和能量重置为最大值或默认值(每个角色始终相同)
  • 重置计时器
  • 重置角色起始位置
  • 将地形重置为默认状态(无弹孔可修复或重新加载!)

这实际上就是整个列表-这意味着快速状态重置而不是完整级别的重新加载更为可行。当您最初开始比赛时,这也可以通过加载时间来显示。加载所有角色和关卡模型需要花费很长时间,但是只有很少的处理器滴答声才能重置与已加载模型之间的比赛之间的角色起始位置。

重要的是要注意,这也是格斗游戏的一项更迫切的需求,因为他们的玩家往往想迅速恢复原状,因为比赛通常只能持续一分钟-强调这个答案在很大程度上取决于游戏和体裁。FPS要求更多动态资产,而Fighters要求快速重复行动。

我希望这可以使您的问题有所启发。


7
很好的答案...我愤世嫉俗的一面,会把你的话:“开发人员的工作量减少了……排名较高……但是也许它的引擎实现可能会更好。”
Mesh

3
另外,错误恢复又如何呢?由于物理系统中的错误,内存泄漏等原因,NPC不会移动。即使对游戏进行了彻底的测试,此类事情仍然会发生,并且必须有一种方法可以将游戏重置为已知的工作状态。
Sulthan

9
减少工作量是一个令人羡慕的目标,而不是耻辱。您可能需要花一周的时间来构建倒带系统,而花一个月的时间来清除所有错误,或者重新加载并使用其他功能=)
Patrick Hughes

1
我认为成本是这里最重要的论点。除非重新加载关卡发生很多,并且成为用户的主要烦恼,否则没有动力编写优化的代码来加快重新加载的速度。将代码重用于正常负载的成本更低。
orlp

1
+1我只是想澄清一下,重新加载一个关卡并加载一个关卡-如果重新加载将所有内容扔掉并从新的加载开始,则不需要编写新代码即可实现游戏目标。倒带系统是一套全新的代码,它是不平凡的,而且由于它依赖于可变状态,因此调试起来极为困难。示例:“错误修复:导弹在200像素水深范围内爆炸后,将头盔戴在炸弹上方后重新启动关卡不会再导致桌面崩溃。” 简而言之,您必须有充分的理由打扰。
BrianH

14

为了澄清有关控制台的问题的现有答案:它们没有足够的内存来存储大型复杂游戏的开始状态和当前状态。

一个游戏可以分别存储关卡和初始状态,以便可以仅重新输入状态,这很可能是许多游戏所做的。但是,即使流式传输也要比保留在内存中的速度慢很多。

最新的“最佳”控制台在CPU数据和图形之间共享的内存只有512MB。那太小了。主机开发当前令人头疼的问题之一是试图适应具有如此少量内存的满足当今质量水平的游戏。千字节计数可能很重要,尤其是在发货日期之前。存储关卡初始状态的副本是可以完成的一些数据工作,不但可以使关卡重新加载更快,还可以将更多的内存用于使游戏更加有趣的事物。

理想情况下,玩家花在游戏上的时间要多于死亡和重启游戏的时间,因此在游戏过程中进行优化以获得更好的体验更有意义。

下一代控制台及其8GB内存可能会发生巨大变化。或者,它们可能保持不变,仅使用更高分辨率的模型和材质以及大量活动的游戏对象。时间会证明一切。鉴于PC游戏通常针对具有2GB RAM和512MB VRAM的机器(尽管许多机器可以扩展到更大的值),因此就最低基准而言,新游戏机的8GB相当豪华。在不久的将来,我们可能会看到游戏过渡到需要64位CPU / OS和4-8GB RAM和1-2GB VRAM的游戏。然后,将多个状态存储在内存中以进行快速快照应该容易得多。


+1很棒的信息,并很好地解释了为什么控制台在重新加载时明显变慢。
汤姆·布鲁德·皮多克(Tom'Blue'Piddock),

7

我不同意Blue的大部分回答,我不认为存在不重置级别的技术案例-我当然从未遇到过。关卡加载几乎总是比关卡重置慢,实际上,我发现很难想象不会有这样的情况。在大多数情况下,如果开发人员选择,游戏可以提供有效的即时关卡加载。

真正的答案是,如建议的那样,它更容易,更快捷。无论如何,重复加载关卡是游戏需要的东西,因此将其重新用于关卡重新启动是相对简单的。重置需要复杂的新途径,并且有大量潜在的新错误和内存泄漏的可能,并且需要投入大量的开发时间。在某些情况下,它可能还会增加内存限制。由于很少开发者会花费大量时间来开发游戏,因此关卡重置等项目会沿途掉线,这是令人遗憾的趋势,尤其是如果游戏架构并非一开始就最好的话。

尽管我认为可能需要重置“倒带”的情况,但实际上大多数游戏仅需要存储原始状态,提供一种有效的方法将保留的对象完全重置为该状态,并提供一种将对象标记为放弃重置。游戏状态信息也需要存储和恢复。与整个级别的要求相比,此类信息通常在内存上相对较少,因此,这样做无需从磁盘上缓慢,昂贵地加载数据(包括纹理和模型之类的大项),并以快速,低成本的方式代替它。 -场景的内存传递。


3
您可能需要查看Sean的答案,以获得一个技术案例的示例,在该案例中,您可能想通过“重置”它来重新加载一个关卡
SpartanDonut13年

2

为了允许进行大级别或无缝级别的游戏,即使内存有限(内存总是太小,问题是要先达到RAM还是显卡的极限),还有另一种策略:

内存中只有播放器当前需要的部分,或几秒钟后将需要的部分。从内存中删除可能不再需要的模型,纹理,声音样本...。

牢记《地牢围攻》(开发人员曾经声称,内存管理比实际游戏具有更多的处理能力),大多数MMORPGS都会这样做,在开放环境下的Shooters不得不这样做,...在这种情况下,级别(甚至30秒钟前的重生点)可能不再(完全)在内存中。

通常,重新加载是最简单的方法,最便宜的方法,也许是最快的方法。

编辑:这是一篇关于地下城围攻的加载机制的论文:地下城围攻的连续世界


好点,我没有考虑连续或无缝的关卡。那将需要一个完全不同的关卡加载系统。
汤姆·布鲁(Tom'Blue)Piddock,

2

借助Sean和Blue关于物理平台限制和赞成决策的出色答案,我将在另一种方法中发表评论:

为什么您应该只完全重新加载关卡

这样您的loadLevel()调用就可以正常工作了,是的!您可以流式传输关卡文件信息,并逐步根据该信息构建世界,创建对象以及随心所欲地加载纹理和声音。然后,当所有操作完成-或“足够”完成就可以开始播放时,您可以调用startPlay()并显示您的世界,然后开始播放音乐。

现在,当您完成关卡操作,退出菜单或退出游戏时,您可以调用unloadLevel()释放您一直持有的所有资源和内存,以提供流畅的体验。

现在,当您想添加“重启级别”功能时会发生什么?好...

unloadLevel(currentLevel);
loadLevel(currentLevel);
startPlay();

您完成了!没有新的代码,最多只有几个简单的函数调用,并且您已经编写并调试了所有代码,因此现在您的新闪亮的Restart Feature已从列表中删除,并且可能再也不会遇到-精简,不生锈的代码是最好的一种!将代码移到restartCurrentLevel()函数中,您可以将代码折叠起来,不再查看它-当然,也许在确保有一个级别可以重启之后:)

但是,然后您想知道这是否不是浪费,卸载您将要再次重新加载的东西。好吧,如果您的级别和资源很小,那么即使在速度较慢的系统(甚至是较旧的智能手机)上,每次调用“重新启动”时,您最多需要花费几秒钟的空闲时间来加载负载,那么谁在乎呢?“过早的优化”可以使您的时间变得更好。

嗯,但是现在您的音量在增加,纹理也变得更加细腻,音轨以512kbps的速度撕裂,每个声音和音乐层都有单独的通道(这在当时看来是个好主意,尽管您不记得为什么。 ..)以及有关“状态起源的体素射线追踪多维傅立叶变换矩阵”的内容,您认为这完全是虚构的,不是真实的东西,并且级加载实际上需要一段时间,并且它开始使您烦恼。您甚至已经对真实的人进行了测试,他们实际上对等待时间表现出厌恶,因为它比同类游戏更糟糕(您不希望拥有100名玩家的MMORPG首都在2秒钟之内就可以全部加载,是吗?),这是一个问题。

那么如何优化?好吧,如果关卡重新加载是个问题,那么关卡加载不是问题吗?如果您认为这只是重新加载,那么为什么人们在现实世界中重新加载您的关卡的次数要比最初加载水平的次数多?听起来像是游戏问题,而不是代码工程问题。谁认为一次又一次地重新加载关卡很有趣,只是希望它更快而不是完全可以避免

首先解决实际问题!

但是可以说,您的游戏经过精心设计,因此至少应该偶尔重新启动,并且加载时间足够长,因此可以一次执行,这是完全不可避免的,但您不想再次执行。无论如何,这是什么样的游戏?似乎有点怪异的问题……也许是高分辨率的类似Portal的游戏,其中假定您要反复弄乱这个难题?

首先,您必须认识到这不会是微不足道的。您将不得不编写全新的,未经测试的代码,并且它是“依赖于状态的”,因此您甚至可能不知道在关卡游戏之间将要重用或不重用什么。您的关卡中是否存在随机元素,生成物,可变纹理(您的骨骼有时只穿盔甲吗?)或其他变化元素?是否有随播放器而变化的事物,例如衣服或定制模型或颜色/门/陷阱?

您将要进行比较,其中有很多。您将遍历关卡元素,比较所需的内容和当前加载的内容(您对上一个关卡而不是此关卡加载的内容怎么做-释放它们或保留以防止将来发生加载?)。如果这确实对您的游戏来说很重要,则您可能需要更改加载/卸载代码,以在加载之前查看是否已加载某些东西(使代码具有多种用途,但可能会在以前的功能和功能中引入新的错误)仔细释放不久将不再使用的资源)。叹。

无论您做什么,即使您的游戏很简单,也要在重新启动某个关卡时遇到基于关卡/玩家状态的晦涩的错误,而这并不是您第一次加载关卡时发生的。因此,您可以使用以下文字编写游戏更新:

“将炸弹上的头盔扔到砖块上,该砖块附近也有导弹爆炸,该砖块也在水面200像素之内,不会再破坏您的游戏数据或导致游戏崩溃。”

大多数游戏不打扰的真正原因

您是否曾经注意到,大多数人只是在现有墙壁上油漆或干砌墙面,而不是剥落至底层,或者将地毯铺在硬木地板上而不是将其拉起?

一个简单的事实是,它需要付出更多的努力才能获得最小的回报。在大多数情况下,在现有墙壁上绘画是可以的,并且撕裂硬木地板的价值通常很小或根本不存在。

在软件中,从游戏到多媒体Power Point演示文稿,情况都是如此-如果您要做的只是将载入画面缩短几秒钟,而人们花了他们1%的时间在看,那么做起来就变得微不足道了,否则您将获得您投资时间的回报很差。

因此,大多数游戏都不会打扰,而且我很难想到很多游戏,除了一些极端的例子,加载屏幕使本来不错的游戏变得不那么值得了。在极端的例子中,为更快的关卡加载进行优化是有意义的,这只是向公众公开的一小部分游戏,甚至可能是一小部分因从未发布而从未见过的游戏。


0

因为很难开发出相反的行为,这就是将静态游戏数据(例如纹理,地质信息,未受影响的暴民)保留在内存中,并仅重新加载动态数据(例如玩家位置,玩家状态,任务状态,库存) 。

由于花费更多的金钱和时间,因此游戏开发人员通常不会这样做。


这不包括由于游戏类型或个人需求而必须发生相反情况的情况。例如波斯王子需要记录游戏状态才能使用特定的游戏机制,而我给出的格斗游戏示例则需要能够重新加载各个项目/级别/角色状态才能在比赛进行到一半时重置下一轮或重新开始比赛以开始下一场比赛。这些是满足手边游戏需求所必需的,因此游戏开发人员必须花费更多的时间和金钱。
汤姆(Tom'Blue)Piddock,

如果在特定游戏中出现相反的情况,则上述问题对该游戏无效。因为在发生相反情况的游戏中加载时间会很快。我只是回答了适用情况的问题(这是从头开始加载整个关卡的游戏)
Xtro

如果在可能发生问题的前提下出现了相反的情况,则始终应注意该问题以及原因。缺少信息或遗漏有关为什么会出现某种情况或解决方案的细节永远是无益的。说不需要细节是有点反常的直觉,因为如果这个人不追求细节,那么就不会有任何问题。如果您能够提供更多细节,请始终努力做到这一点,因为它可以帮助其他人更多地了解整个主题,并从实际需求中了解需求。
汤姆(Tom'Blue)Piddock,

因此,您的反应是我的第一行答案,即“不需要细节”,对吗?如果我删除那条线,您能拿回-1点吗?
Xtro

很有趣-是的。永远不要在任何可能的地方阻止细节,您通常会发现您的答案会得到更大的赞赏。
汤姆(Tom'Blue)Piddock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.