简短回答:它需要大量定制,如果您不是经验丰富的 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 也可以使用。但我认为这不会很快发生。
但是硬实时呢?
你最好不要尝试。但这又是另一个故事了。