Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 内存管理思想?_C#_Memory - Fatal编程技术网

C# 内存管理思想?

C# 内存管理思想?,c#,memory,C#,Memory,我正在用C#和SharpDX写一个游戏。。。 所以,为了画一个框架,目前我使用一个计时器,间隔设置为1; 但这对游戏来说太慢了,所以我想要更快的。。。 首先,如果我为游戏使用另一个线程(为窗口本身使用另一个线程),并使用“[while(InGame)]”语句,速度很快,但GC永远不会释放单个对象,内存使用量也会不断增加 如果我使用SharpDX内置的“RenderLoop”函数,它也很快,但GC仍然不做任何事情 我试图覆盖窗口形式的“WndProc”功能,但游戏只刷新自己,然后我像疯子一样移动鼠

我正在用C#和SharpDX写一个游戏。。。 所以,为了画一个框架,目前我使用一个计时器,间隔设置为1; 但这对游戏来说太慢了,所以我想要更快的。。。 首先,如果我为游戏使用另一个线程(为窗口本身使用另一个线程),并使用“[while(InGame)]”语句,速度很快,但GC永远不会释放单个对象,内存使用量也会不断增加

如果我使用SharpDX内置的“RenderLoop”函数,它也很快,但GC仍然不做任何事情

我试图覆盖窗口形式的“WndProc”功能,但游戏只刷新自己,然后我像疯子一样移动鼠标

这是我第一个真正的游戏,有很多功能, 所以,如果你们有任何想法,我将如何修复它,或者我应该使用什么,我将不胜感激。。。 窗口窗体生命周期中必须有类似于

void FormLife
{
     WndProc();
     HandleEvents();
     etc...
}
(这只是一个很难的例子……)

或者,如何在
while(InGame)
状态结束时强制GC执行其工作?
我试过
GC.Collect()但它不起作用…

您通常不必担心内存管理。如果您确保不保留引用,那么垃圾收集器应该根据内存压力自动完成它的工作


您可以使用GC.Collect强制它,但您需要绝对确定您确实需要这样做。大多数情况下,这不是必需的。查看此线程以了解更多信息和需要考虑的要点:

您通常不必担心内存管理。如果您确保不保留引用,那么垃圾收集器应该根据内存压力自动完成它的工作

您可以使用GC.Collect强制它,但您需要绝对确定您确实需要这样做。大多数情况下,这不是必需的。查看此线程以了解更多信息和需要考虑的要点:

  • 不要将游戏逻辑放在UI类中

  • 使用和分派器返回主线程进行渲染。根据我的经验,5秒的循环效果很好。(降低会浪费CPU时间)

  • 使用输入的调度程序优先级,以便计时器不会阻塞UI并阻止它处理用户事件

  • 在计时器事件中,如果上一次更新尚未完成,则立即返回,无需执行任何操作(可以使用System.Threading.Interlocked.CompareAndExchange作为廉价的同步方法)

  • 为了让游戏运行得更快,请尝试重用对象并更改它们的状态,或者传递短暂的不可变项,以便GC不会延迟您的程序

  • 如果适用,请使用IDisposable模式

  • 不要将游戏逻辑放在UI类中

  • 使用和分派器返回主线程进行渲染。根据我的经验,5秒的循环效果很好。(降低会浪费CPU时间)

  • 使用输入的调度程序优先级,以便计时器不会阻塞UI并阻止它处理用户事件

  • 在计时器事件中,如果上一次更新尚未完成,则立即返回,无需执行任何操作(可以使用System.Threading.Interlocked.CompareAndExchange作为廉价的同步方法)

  • 为了让游戏运行得更快,请尝试重用对象并更改它们的状态,或者传递短暂的不可变项,以便GC不会延迟您的程序

  • 如果适用,请使用IDisposable模式


  • 如果GC.Collect没有释放内存,则内存泄漏。使用您选择的内存分析工具来发现泄漏(PerfView、Windbg、.NET内存分析程序、YourKit等)

    除此之外,最好的分配是完全不分配。如果重用对象并将未使用的对象保留在池中,则可以几乎完全摆脱GCs。即使你远离第2代收集,这可能会阻碍你的游戏数百毫秒,你也需要保持对第0/1代收集敏锐的眼睛,这也可能导致明显的延迟


    如果GC.Collect没有释放内存,请参阅内存泄漏。使用您选择的内存分析工具来发现泄漏(PerfView、Windbg、.NET内存分析程序、YourKit等)

    除此之外,最好的分配是完全不分配。如果重用对象并将未使用的对象保留在池中,则可以几乎完全摆脱GCs。即使你远离第2代收集,这可能会阻碍你的游戏数百毫秒,你也需要保持对第0/1代收集敏锐的眼睛,这也可能导致明显的延迟


    请参见

    ,因为没有收集对象,所以您必须在某个地方保留对它们的引用

    您没有发布太多代码,因此很难说您在哪里持有引用

    在过去,我一直在寻找内存问题的根本原因。内置(可能更容易使用)


    我见过的一个持有引用的常见案例是通过事件订阅。如果您已订阅任何活动,则必须确保取消订阅以释放该对象。有关更多详细信息,请参阅。这看起来不像是您的问题。

    由于对象未被收集,您必须在某个地方保留对它们的引用

    您没有发布太多代码,因此很难说您在哪里持有引用

    在过去,我一直在寻找内存问题的根本原因。内置(可能更容易使用)


    我见过的一个持有引用的常见案例是通过事件订阅。如果您已订阅任何活动,则必须确保取消订阅以释放该对象。有关更多详细信息,请参阅。这看起来不像你的问题。

    如果你的对象没有被收集,它们就不是垃圾。确保不再保留对不再需要的对象的引用。如果GC.Collect不起作用,则必须仍保留对某些对象的引用objects@AdmiralAdama你可以,但你不应该。一个计时器,间隔设置为1,这意味着什么?1毫秒?任何低于25毫秒的东西都是浪费的,因为分辨率是ar