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

时间:2017-05-08 17:39:25

标签: c# refactoring 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";

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

所以我的问题是,什么是为游戏编写对话框而不会让它变慢的最佳方式。

2 个答案:

答案 0 :(得分:1)

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

话虽这么说,我会警告你一点关于你自己的表现,直到它对你来说是一个真正的问题。如果你提前优化,你可能会解决一个你从未有过的问题,并浪费大量时间去做。如果您在遇到问题后稍后进行优化,那么您将花费大约相同的时间进行优化,但现在您可以更好地了解代码需要执行的操作,并且您将能够轻松地观察是否或不是你的优化做了什么。可能很难抵制这种冲动,但如果你能够管理你最终的利润。

答案 1 :(得分:0)

即使在非常对话中,重度游戏switch在运行时也不会出现问题。但编辑它会变得乏味。

如果您愿意,可以将文档格式保存在文件格式中(对于实例,您可以下载Ren'Py(python中的视觉新颖引擎。免责声明:我不喜欢&# 39;自己使用它,但它是如何存储对话的好例子。或者使用像SQLite这样的inprocess数据库。这样你就可以在游戏需要时从磁盘加载对话然后将它们添加到某个集合中 - 例如Dictionary<String,String>。访问速度无关紧要。即使是非常缓慢的收集也会允许数百万次访问/秒,因此速度可能无关紧要。还考虑使用一些高级结构,比如使用Dictionary<YourStructThatWorksLikeATag,YourClassThatDescribesThePhraseAndHowToPresentIt> =)