4

我正在考虑将 d 用于我正在进行的图形引擎。让我失望的一件事是GC。

我还是一个年轻的程序员,我可能对 GC 有很多误解,希望你能澄清一些问题。

我的目标是低延迟,一般来说时间是至关重要的。据我所知,GC 是非常不可预测的,例如我的应用程序可以每 16.6 毫秒渲染一个帧,而 GC 何时启动它可能会上升到 30 毫秒之类的任何数字,因为它不是确定性的,对吗?

我读到您可以在 D 中关闭 GC,但是您不能使用 D 的大多数标准库,并且 GC 并未完全关闭。这是真的?

您认为在时序关键型应用程序中使用 D 有意义吗?

4

2 回答 2

8

简短回答:它需要大量定制,如果您不是经验丰富的 D 开发人员,可能会非常困难。

问题清单

内存管理本身并不是什么大问题。在实时应用程序中,您永远不想在主循环中分配内存。为所有主要数据预先分配内存池几乎是执行此类应用程序的事实上的标准方式。从这个意义上说,D 并没有什么不同——你仍然直接调用 C malloc 来为你的池获取一些堆,并且这个内存不会由 GC 管理,它甚至不会知道它。

然而,某些语言特性和 Phobos 的大部分确实会自动使用 GC。例如,如果没有某种形式的自动管理分配,您就无法真正连接切片。火卫一很长一段时间都没有对此制定过强有力的政策。

很少有语言触发的分配本身不会成为问题,因为无论如何使用的大多数内存都是通过池管理的。但是,库存 D 中的实时软件存在一个致命问题:默认 D 垃圾收集器是 stop-the-world。即使几乎没有垃圾,您的整个程序也会在运行收集周期时遇到延迟峰值,因为所有线程都会被阻塞。

可以做什么:

1) 用于GC.disable();关闭收集周期。它将解决 stop-the-world 问题,但现在您的程序在某些情况下会开始泄漏内存,因为基于 GC 的分配仍然有效。

2) 转储隐藏的 GC 分配。有一个开关的拉取请求-vgc,我现在找不到,但如果没有它,您可以编译自己的运行时版本,在gc_malloc()调用时打印回溯。您可能希望将其作为自动测试套件的一部分运行。

3) 完全避免使用 Phobos,并使用https://bitbucket.org/timosi/minlibd之类的东西作为替代方案。

做这一切应该足以满足游戏开发者典型的软实时需求,但正如您所见,这根本不简单,需要退出 D 发行版。

未来的替代方案:

一旦 Leandro Lucarella 将他的并发垃圾收集器移植到 D2(计划中,但未计划),情况将变得更加简单。即使不禁用 GC,少量 GC 管理的内存 + 并发实现也可以满足软实时要求。在从最烦人的分配中剥离后,即使是 Phobos 也可以使用。但我认为这不会很快发生。

但是硬实时呢?

你最好不要尝试。但这又是另一个故事了。

于 2013-05-22T09:09:18.993 回答
2

如果你不喜欢 GC - 禁用它。

方法如下:

import core.memory;

void main(string[] args) {
    GC.disable;
    // your code here
}

自然,您将不得不自己管理内存。这是可行的,并且有几篇关于它的文章。这里也讨论过,只是不记得主题了。

dlang.org 也有这方面的有用信息。这篇文章http://dlang.org/memory.html涉及实时编程的主题,你应该阅读它。

还有一篇好文章:http: //3d.benjamin-thaut.de/ ?p=20 。

于 2013-05-21T18:11:15.707 回答