我一直认为UE比Unity更快,因为UE使用C ++和Unity C#。 C ++的哲学似乎在这里打破了,你要为你使用的东西买单。现在添加了反射和垃圾收集。那么为什么UE4如果用C ++制作另一个C#会更快?
答案 0 :(得分:3)
我不确定这是否是一个完整的答案,我试图说明为什么两个Unreals反射和它的GC并不意味着它必须像C#一样慢。
C#有一个非常强大的反射系统,允许你在运行时做一些疯狂的事情(构建泛型类,generating functions)。这是因为C#被编译成一个字节代码,这是一个即时(JIT)编译到执行的机器代码中。许多反射都在公共语言接口(CLI) 1 中实现。这需要加速 - 代码必须在运行时进行编译,因此可以进行不太积极的优化(当用户等待程序启动时,执行它们的时间更少)。
另一方面,虚幻的反射系统是在编译时通过生成一堆代码实现的,然后由同一个C ++编译器编译。当然,如果你广泛使用这个反射系统(通过名称调用函数,动态访问属性),它会比你没有那样慢,并且你将失去对该代码的大量编译时优化。但是如果你不这样做,而你偶尔会得到一个类的类型,那么你将为反射系统支付的主要成本就是你的二进制文件的大小(以及编译时间)。我不知道Unreals垃圾收集系统的细节,所以此部分可能不完整。通常,游戏开发者关心GC(或缺乏GC)的原因是:
虚幻可以避免第一个问题,因为只有UObject
是GC。这意味着您仍然可以使用普通类而不必担心垃圾收集器,并在适当时愉快地在堆栈上进行分配。
对于第二点,我不确定GC是如何在虚幻中实现的,但是可以想象他们已经考虑过这一点并且有办法绕过障碍。
总之,Unreal仍然能够使用允许C ++比C#更快的功能(更积极的优化,堆栈分配),即使它具有基本版本的反射和GC。
1 :How is reflection implemented in C#?