每次需要其中一个 类 的实例时,拥有一组 类 的额外副本或从文件中读取是否会占用更多内存?
Is it more memory intensive to have an extra copy of a set of classes or read from a file every time an instance of one of those classes is needed?
我意识到这个问题不是很清楚,所以我会扩展我的意思(如果有人能想到更好的表达方式,那将不胜感激)。
我有一个特定的 class 类型(属性),另一个 class(角色)的任何实例都需要几个(例如,如果游戏中有力量、智力和运气,那么每个角色将需要属性的 3 个实例 class).
每个属性的信息存储在 AttributesList.txt。
是否最好在程序开始时读取此文件一次以创建一个全局 const vector<Attributes>
并让每个角色创建一个向量的副本供自己使用,只要它们存在,还是在每次创建角色时读取文件来创建它们的属性?
注意:为每个属性创建一个实例并在需要时使用指针引用它不是一种选择,因为每个角色的属性都有不同的值。
您问题的答案在很大程度上取决于您的代码。这个向量有多大?您需要多久获取一份副本?您的应用程序通常使用多大的内存?
例如,如果这个向量的大小是你总内存占用的百分之几,而你经常复制它,那么我会选择速度优化而不是内存占用优化(在内存中获取一个对象的副本比您需要从磁盘读取的所有 IO 开销)。
虽然直觉可以帮助您决定选择哪一个。 最终的答案是通过测试每个案例和分析。
在这种情况下,您应该评估 "what's easier to code?" 与 "will it really make a difference?" 之间的权衡。
一方面,由于 I/O 通常是 "slow"(与内存访问相比)并且是 errors/exceptions 的来源,因此在游戏开始时阅读一次是个不错的主意。
但是,如果编码更容易并且 AttributesList.txt 文件损坏的风险很小,并且不会产生任何可衡量的性能问题,则每次您的实例重新读取文件字符 class 也可能有效。多久创建一个新角色?
当我在游戏工作室工作时,我们将编译后的对象资源保存(序列化)在磁盘上。每次创建新游戏对象时,我们都会从文件中重新读取结构。我认为我们将其作为主 game/render 线程的异步任务来执行,因此不会影响性能。
问题应该是,"how often do I update or access the attributes?"
在很多游戏中(例如Wii和Playstation),他们会更新属性的内存版本,然后提供将属性保存到文件的命令。
如果属性占用的内存不多,就放在内存中。每当您的程序访问它们时,这将加快访问时间。程序外部的任何内容都将花费更多时间来获取。
记住,在优化之前进行配置。此外,在考虑分析之前,让程序正常运行且健壮。
我意识到这个问题不是很清楚,所以我会扩展我的意思(如果有人能想到更好的表达方式,那将不胜感激)。
我有一个特定的 class 类型(属性),另一个 class(角色)的任何实例都需要几个(例如,如果游戏中有力量、智力和运气,那么每个角色将需要属性的 3 个实例 class).
每个属性的信息存储在 AttributesList.txt。
是否最好在程序开始时读取此文件一次以创建一个全局 const vector<Attributes>
并让每个角色创建一个向量的副本供自己使用,只要它们存在,还是在每次创建角色时读取文件来创建它们的属性?
注意:为每个属性创建一个实例并在需要时使用指针引用它不是一种选择,因为每个角色的属性都有不同的值。
您问题的答案在很大程度上取决于您的代码。这个向量有多大?您需要多久获取一份副本?您的应用程序通常使用多大的内存?
例如,如果这个向量的大小是你总内存占用的百分之几,而你经常复制它,那么我会选择速度优化而不是内存占用优化(在内存中获取一个对象的副本比您需要从磁盘读取的所有 IO 开销)。
虽然直觉可以帮助您决定选择哪一个。 最终的答案是通过测试每个案例和分析。
在这种情况下,您应该评估 "what's easier to code?" 与 "will it really make a difference?" 之间的权衡。
一方面,由于 I/O 通常是 "slow"(与内存访问相比)并且是 errors/exceptions 的来源,因此在游戏开始时阅读一次是个不错的主意。
但是,如果编码更容易并且 AttributesList.txt 文件损坏的风险很小,并且不会产生任何可衡量的性能问题,则每次您的实例重新读取文件字符 class 也可能有效。多久创建一个新角色?
当我在游戏工作室工作时,我们将编译后的对象资源保存(序列化)在磁盘上。每次创建新游戏对象时,我们都会从文件中重新读取结构。我认为我们将其作为主 game/render 线程的异步任务来执行,因此不会影响性能。
问题应该是,"how often do I update or access the attributes?"
在很多游戏中(例如Wii和Playstation),他们会更新属性的内存版本,然后提供将属性保存到文件的命令。
如果属性占用的内存不多,就放在内存中。每当您的程序访问它们时,这将加快访问时间。程序外部的任何内容都将花费更多时间来获取。
记住,在优化之前进行配置。此外,在考虑分析之前,让程序正常运行且健壮。