c# - 我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?

标签 c# c++ windows unity-game-engine il2cpp

IL2CPP.exe是一个用于将 C# IL 代码转换为 C++ 的 Unity 实用程序。我的问题是:这个可执行文件是否可以在 Unity 游戏开发环境之外用作通用工具,用于将任何 .NET 应用程序(不仅仅是游戏)转换为高性能 native 可执行文件?

虽然我确实了解一些 C++,但如果能够用我熟悉且流利的语言(C#)编写所有类型的程序,那就太好了。 ......无论它们是音频/视频/音乐制作 DAW 还是操作系统级安全/取证工具或机器学习平台或任何其他资源密集型......并知道它们将作为作为直接用 C++ 编写的应用程序,效率很高。

最佳答案

2023 年更新:

基于@StackHola更新,可以使用IL2CPP Command Line从C#生成C++代码,但这样做可能不会获得任何性能优势,请参阅我的 2021 年长答案。

简短回答:否

IL2CPP 与 Unity 环境紧密相连,无法在 Unity 之外使用它。您需要编写自己的转换器(?)来完成这样的事情。

更长的答案

IL2CPP 在性能改进方面没有任何魔法。将 C++ 与带有 IL2CPP 代码的 C# 进行比较应该不会带来任何性能优势(几乎 - 下面会详细介绍)。

与专门为 Unity 编写的 C# 代码相比,IL2CPP 的性能更高,原因与 C++ 无关。

为什么 Unity 是独一无二的并且需要 IL2CPP:

  • Unity API 非常依赖主线程性能,因为整个 Unity API 是在大约 10 年前编写的,当时 2 核 CPU 是一流的,每个人都相信我们现在将拥有 20-50GHz 的单核 CPU .
  • Unity 做出了很多假设,即您将使用其 API 来完成所有事情,从 IO 到线程和 GPU 访问,这些都与 C++ 核心密切相关。
  • Unity 需要用 Unity 对象(MonoBehaviours 和 GameObjects)包装才能用于几乎任何内容,您无法编写自己的 native 任何内容。 (这是一个简化)
  • Unity 是用 C++ 编写的,因此它需要做一些与 Marshalling 非常相似的事情,而且效率不是很高。

那么为什么选择 IL2CPP?

  • Unity 无法将其已经非常传统的后端 (Mono) 及其传统 API 转换为多线程,因为 Mono 对您的代码有很多假设,而这些假设不容易转换为“简单”的 Unity API。
  • Unity 核心是用 C++ 编写的,因此他们通过跳过 Mono“翻译器”来消除任何形式的编码。
  • IL2CPP 在可能的情况下将效率极低的 C#、单线程代码转换为多线程 C++,并通过分析 IL 代码来实现此目的。

是否值得将其他 C# 转换为 C++?

不!将 AOT 预编译的任意、优化的 C# 代码与(现代)C++ 进行比较。你应该得到同样的表现!我想说的是相同的。

C# 被编译为 IL(中间语言),顾名思义就是中间语言。它在运行时转换为 native 二进制代码(仅在需要时),这就是 C++ 编译成的内容。您可以通过运行提前编译 (AOT) 来跳过 IL 生成来强制进行此转换。

唯一会降低 C# 代码性能的情况是,当您滥用 GC 的清理能力时。

关于c# - 我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66521272/

相关文章:

c++ - 头文件报错

c++ - 获取 C++ 函数的大小

windows cmd批处理文件计算

c# - 我可以将 WCF Web 服务限制为仅来自特定域的调用吗?

c# - 如何在 UWP 应用程序中创建文件夹?

c# - ActivityTypes.Event 不存在用于 BackChannel 通信

windows - 无法加载 OpenGL 进程,只能从 Haskell 加载

c# - Azure Active Directory 身份验证出现错误 "we can' 无法连接到您现在需要的服务”

c++ - 将共享库链接到集群上的 C++ 项目

c++ - 如何安全终止QT中不同线程上运行的对象