【问题标题】:Why Vector3 is struct type in unity?为什么 Vector3 是统一的结构类型?
【发布时间】:2021-12-23 10:00:02
【问题描述】:

根据docs,单位Vector3 是值类型。 还根据docs“默认情况下,在赋值时,将参数传递给方法,并返回方法结果,复制变量值。在值类型变量的情况下,复制相应的类型实例”。

不是性能、指针等方面的专家,但我认为通过引用而不是值来传递参数以避免复制实例的事实是关于性能的一个好习惯。这就是为什么 c# 中的大多数类型都是引用类型的原因。

RaycastHit 结构也是如此。

据我研究,类和结构有以下基本区别

  • 类是引用类型,结构是值类型
  • 结构不支持继承
  • 结构不能有默认构造函数

对于我来说,这一切都不能证明放弃 ref 类型的性能优势是合理的,所以,主要是 Vector3 在任何游戏中都会有向量作为参数传递,所以在整个应用程序中复制,原因是什么它是结构类型的吗?

【问题讨论】:

  • 您错过了引用类型的 成本,尤其是 GC 为再次释放该内存而增加的工作量,这对延迟敏感很重要游戏之类的东西。复制几个字节实际上是免费的:guidelines 将限制设置为 16 个字节。对于较大的结构,有一些机制可以传递对它们的引用:refout 一直存在,但 inreadonly 结构是为 Unity 之类的东西引入的
  • @canton7 没有一个 Unity 结构是只读的;)
  • @derHugo 他们仍然被引入对延迟敏感的应用程序,例如 Unity
  • 另一个缺失的区别是heap vs stack allocation

标签: c# unity3d


【解决方案1】:

在比较类(引用类型)与结构(值类型)的性能时,我们不能说一个比另一个性能更好。答案是:“视情况而定”。

类在堆上分配,并被垃圾回收,这与结构相比是一种开销。

如您所提到的,结构在传递时会被复制,这与类相比也是一种开销(这并不是结构的大小很小的开销,这就是为什么设计指南在选择时提到了大小限制结构)。

design guidelines 的一些一般规则是:

✔️ 如果类型的实例很小且通常短命或通常嵌入其他对象中,请考虑定义结构而不是类。

❌ 避免定义结构,除非该类型具有以下所有特征:

  • 它在逻辑上表示单个值,类似于原始类型(int、double 等)。
  • 实例大小小于 16 字节。
  • 它是不可变的。
  • 不必经常装箱。

实际上,当您有疑问时,您应该针对您的特定场景进行基准测试。

【讨论】:

  • 另外,struct 不能使用继承,所以这是设计时丢弃它的另一个原因。
  • 我不这么认为,因为你可以使用sealed class
  • @rustyBucketBay fafase 指的是,你可以设计一个非密封类进行继承。对于结构来说,这根本不是一个选项。所以这是值得考虑的事情。
  • heap vs stack allocation 实际上不仅仅是 GC 参数
  • 我的意思是,以unity的Vector3类为例,因为它是一个内置的引擎类,使它密封与作为一个关于继承的结构具有相同的效果,意思是没有机会继承它。不过感谢@Youssef 发现这一点。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2011-12-06
  • 2020-11-21
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多