【问题标题】:My application isn't using much memory (C#) [closed]我的应用程序没有使用太多内存(C#)[关闭]
【发布时间】:2017-04-08 09:24:46
【问题描述】:

我目前正在使用我创建的游戏引擎设计一个 2D 游戏,并决定检查每一秒我使用了多少内存。

我目前有一个包含总共 4097 个游戏对象的游戏屏幕,每个对象至少包含一个每帧渲染到屏幕上的精灵(位图)。每个精灵都是一个 32x32 像素的图像。

我显然使用的结果 MB 大约是 1.10MB,这是否太多了,还是我做得还好?我还应该考虑哪些其他事项?

另外,只是为了表明,这是我检查我正在使用的内存量的方式:

double mb = MathHelper.ConvertBytesToMegabytes(GC.GetTotalMemory(true));
Console.WriteLine("Memory: " + mb);

以及“ConvertBytesToMegabytes”方法:

public static double ConvertBytesToMegabytes(long bytes)
{
    return (bytes / 1024f) / 1024f;
}

【问题讨论】:

  • 这.... 根本没有任何意义。请更具体地说明您想了解的内容以及您对哪些内存感兴趣。图像可能位于显卡内存中的某个位置,GC 不考虑这些图像。但是这个问题还不够具体,无法给出答案(至少我的看法)
  • 我正在使用 GDI+,所以我不知道这是否有帮助。我只想知道我的内存使用限制应该是多少。
  • 您的问题不清楚。您是否遇到 1MB 内存使用问题?尝试使用这种方法获取使用的内存量stackoverflow.com/a/750595/4767498
  • 'WorkingSet64' 说 115mb,PrivateMemorySize64 说 109mb。
  • 这看起来更真实,但它仍然不能解释你的实际问题是什么......你想知道如何测量内存(你去)或多少内存是合适的(a除非你列出每个涉及的库、工具、文件......)或完全不同的东西,否则无用的问题?

标签: c# memory memory-management game-engine


【解决方案1】:

GC.GetTotalMemory:

一个数字,它是托管内存中当前分配的字节数的最佳可用近似值。

如果您使用的是 GDI+,我假设您使用的是 Image 类。但是,它的数据并不位于托管内存中,因此无法通过调用垃圾收集器来获取。您的托管数据需要 1.1 MB,这对于现代机器来说完全可以。

位图的内存成本可以很容易地计算出来。假设所有精灵都存在于内存中,大小为 32x32 像素,并使用 32 位像素,这为我们提供了 16781312 字节的像素数据,即 16 MB。您应该更多地依赖此计算,而不是来自 Process 类的内存报告。

我想您最初担心的是报告的内存量太低而无法存储所有位图数据。如您所见,您只是使用了错误的方法来获取它。对于其他(或多或少不可靠和令人困惑的)获取内存量的方法,请参阅this question

【讨论】:

  • 当使用该方法时,它告诉我我正在使用 aroudn 115MB,这似乎更现实。那么 32 位像素使用 32 字节的数据吗?每种颜色 8 个字节 (RGBA)?
  • 32 位像素总共使用 32 位 = 4 个字节。每个颜色分量使用 1 个字节。我忘记在答案中除以 8,现在已修复。
  • 哦,好的,谢谢。我将如何计算以字节为单位的总内存使用量?
  • 所以使用你建议的方法(获取当前进程)告诉我我总共使用了 109mb,那么这有什么要担心的吗?
  • @MathewO'Dwyer 首先,检查进程管理器是否报告了相同数量的内存。如果是这样,您可以假设该数字是可靠的。 100 MB 高于平均水平,但对于通常不会多次运行的游戏,我认为这不是问题。通常你不应该担心应用程序的时间或内存使用情况,除非它们以某种方式很明显。
【解决方案2】:

除非引擎由于相机原因没有渲染所有 4097 个游戏对象,否则您应该使用 12-17MB,假设正常的 32x32 位图大小约为 3KB

【讨论】:

  • 引擎(大部分时间)只会渲染视口内的内容。所以......一次大约有 35 个对象是可见的。但是每个对象仍然包含位图,只是没有被渲染。我刚刚尝试通过使用“currentProcess.WorkingSet64”来获取总内存并将其转换为兆字节,现在它说我正在使用 115mb...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多