UE4 - 对象有反射 - 为什么要使用C ++呢?

时间:2015-11-29 17:41:23

标签: c# c++ unity3d unreal-engine4

我一直认为UE比Unity更快,因为UE使用C ++和Unity C#。 C ++的哲学似乎在这里打破了,你要为你使用的东西买单。现在添加了反射和垃圾收集。那么为什么UE4如果用C ++制作另一个C#会更快?

1 个答案:

答案 0 :(得分:3)

我不确定这是否是一个完整的答案,我试图说明为什么两个Unreals反射和它的GC并不意味着它必须像C#一样慢。

反射

C#有一个非常强大的反射系统,允许你在运行时做一些疯狂的事情(构建泛型类,generating functions)。这是因为C#被编译成一个字节代码,这是一个即时(JIT)编译到执行的机器代码中。许多反射都在公共语言接口(CLI) 1 中实现。这需要加速 - 代码必须在运行时进行编译,因此可以进行不太积极的优化(当用户等待程序启动时,执行它们的时间更少)。

另一方面,虚幻的反射系统是在编译时通过生成一堆代码实现的,然后由同一个C ++编译器编译。当然,如果你广泛使用这个反射系统(通过名称调用函数,动态访问属性),它会比你没有那样慢,并且你将失去对该代码的大量编译时优化。但是如果你不这样做,而你偶尔会得到一个类的类型,那么你将为反射系统支付的主要成本就是你的二进制文件的大小(以及编译时间)。

垃圾收集

我不知道Unreals垃圾收集系统的细节,所以此部分可能不完整。通常,游戏开发者关心GC(或缺乏GC)的原因是:

  • 当您有大量快速分配/解除分配 2 时,GC语言可能会浪费。在C ++中,当您知道数据即将被丢弃时,您可以在堆栈上进行分配(更快 3 )。
  • 您(开发人员)不知道何时会触发GC,这会导致平滑帧速率中断。通常,开发人员更愿意控制垃圾收集何时发生。

虚幻可以避免第一个问题,因为只有UObject是GC。这意味着您仍然可以使用普通类而不必担心垃圾收集器,并在适当时愉快地在堆栈上进行分配。

对于第二点,我不确定GC是如何在虚幻中实现的,但是可以想象他们已经考虑过这一点并且有办法绕过障碍。

总之,Unreal仍然能够使用允许C ++比C#更快的功能(更积极的优化,堆栈分配),即使它具有基本版本的反射和GC。

1 How is reflection implemented in C#?

2 Examples of wasteful heap allocations

3 Which is faster: Stack allocation or Heap allocation