Skip to content

关于 FVector/FVector4 导出为 class 带来 GC 分配开销的问题 #532

Description

@mybios

当前在 UnrealCSharp 中,FVector 与 FVector4 导出均为封装 C++ 版本的 class。这样在 C# 调用 C++ 函数返回 FVector 或 FVector4 时,每次都会产生 GC 分配,而不是在栈上分配或通过值传递。此方式在性能敏感场景下,尤其频繁调用时,会引入额外的 GC 压力及性能损耗。

例如,在 Actor 类中 GetActorLocation 函数的返回值就是 FVector。当在每帧(如 Tick 中)频繁调用该函数获取 Actor 位置时,由于 FVector 是以 class 方式封装,必然导致频繁的 GC alloc 操作,影响整体性能。

建议:

  1. 允许用户根据项目实际需求,在使用 C# 接口时选择使用值类型(struct)或引用类型(class)的方式:
      • 通过提供配置选项或编译开关,让用户在不同场景下选择最合适的数据类型封装方式;
      • 对于对 GC 分配较为敏感的项目,可优先选用值类型(struct)来降低 GC 压力。

  2. 将部分逻辑代码(包括 FVector、FVector4 的相关实现)在纯 C# 层面实现:
      • 可以通过纯 C# 实现一份 FVector/FVector4 版本,供需避免 GC alloc 的场景下使用,例如 UnrealSharp 就采用了纯 C# 的 struct 实现;
      • 在 C# 层封装时,将这部分数据类型实现独立出来,并允许用户根据需要选择调用对应的 C++ 或 C# 版本,达到平衡兼容和性能要求的目的。

感谢开发者们的努力与付出,期待后续版本的优化改进!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions