MonoGame 中最有效的对话分支方式

Most efficient way of dialog branching in MonoGame

我正在制作一款文字繁重的游戏,我需要知道通过对话分支进行游戏的最有效方式。目前我正在使用一个开关来确定下一行对话框是什么,就像这样。

  if (branch == "A")
            {
                switch (dialogNum)
                {
                    case 0:
                        speaker = "person A"; newDialog = "This is a test.";
                        break;

                    case 1:
                        speaker = playerName; newDialog = "text";
                        break;

                    case 2:
                        speaker = "Person B"; newDialog = "This is a test of";

我担心它变长后可能会减慢游戏速度。我知道我可以将对话框放在文本文件之类的文件中并将其加载到列表中,但我认为这不一定会更快。

所以我的问题是,在不降低游戏速度的情况下为游戏编写对话的最佳方式是什么。

您使用开关进行分支的方式对于大量响应应该是快速高效的。在遇到性能问题之前,您可能会遇到可维护性问题。如果您仍然担心它,请考虑将内容放入数组或字典中。 var newDialog = dialogs[dialogNum]; 之类的东西应该更快,因为您直接映射到答案而不是进行一系列 if (dialogNumber == n) 检查。

话虽这么说,但我要提醒您注意性能,直到它对您来说是一个真正的问题。如果你提早优化,你可能会解决一个你从来没有遇到过的问题,并且会浪费大量时间来做这件事。如果您稍后在确实遇到问题时进行优化,您将花费大约相同的时间进行优化,但现在您将更好地理解您的代码需要做什么,并且您将能够轻松观察是否或不是你的优化做了任何事情。可能很难抗拒这种冲动,但如果你能做到,你最终会获利。

即使在非常对话密集的游戏中,switch在运行时间里也可能不会成为问题。但是编辑起来会很乏味。

如果您愿意,您可以将对话以某种文本格式保存在文件中(例如,您可以下载 Ren'Py (a visual novel engine in python. Disclaimer: I don't use it myself, but it's a good example of how to store dialogues). Or to use some inprocess database like SQLite 的实例)。这样您就可以在播放时从磁盘加载对话游戏需要它们,然后将它们添加到某个集合中 - 例如,Dictionary<String,String>。访问速度无关紧要。即使是一个非常慢的集合也会允许数百万个 accesses/second,因此速度可能无关紧要. 你也可以考虑使用一些高级结构,比如使用 Dictionary<YourStructThatWorksLikeATag,YourClassThatDescribesThePhraseAndHowToPresentIt> =)