我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?
Can I use IL2CPP (Intermediate Language To C++) for non-Unity applications?
IL2CPP.exe 是一个用于将 C# IL 代码转换为 C++ 的 Unity 实用程序。我的问题是:此可执行文件能否在 Unity 游戏开发环境 外部 用作转换 any .NET 应用程序的通用工具(不仅仅是游戏)到高性能的本机可执行文件?
虽然我知道一些 C++,但如果能够用我的语言编写所有种程序肯定很好熟悉和流利地使用 (C#)......无论它们是 audio/video/music-production DAW 还是 OS 级 security/forensics 工具或机器学习平台或任何其他资源密集型的.. .....并且知道它们将 运行 与直接用 C++ 编写的应用程序一样高效。
简答:否
IL2CPP 与 Unity 环境紧密相连,无法在 Unity 之外使用它。你需要编写自己的转换器(?)来做这样的事情。
更长的答案
IL2CPP 在性能改进方面没有任何魔力。将 C++ 与 C# 与 IL2CPP 代码进行比较应该(几乎-下面更多)没有性能优势。
与为 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)包装才能用于几乎任何东西,你不能编写自己的原生任何东西。 (这是一个简化)
- Unity是用C++写的,所以需要做一些很像Marshalling的事情,效率不是很高。
为什么是 IL2CPP?
- Unity 无法将其已经非常遗留的后端 (Mono) 及其遗留 API 转换为多线程,因为 Mono 对您的代码有很多假设,这些假设不容易转换为“简单”统一 API.
- Unity 核心是用 C++ 编写的,因此他们通过跳过 Mono“转换器”来消除任何形式的编组。
- IL2CPP 在可能的情况下将非常低效的 C#、单线程代码转换为多线程 C++,并且它通过分析 IL 代码来实现。
是否值得将其他 C# 转换为 C++?
否! 将 AOT 预编译的任意优化 C# 代码与(现代)C++ 进行比较。您应该获得相同的性能!我会说完全相同。
C#被编译成IL(Intermediate Language),顾名思义就是Intermediate。它在运行时转换为本机二进制代码(仅在需要时),这就是 C++ 被编译成的代码。您可以通过 运行 提前编译 (AOT) 跳过 IL 生成来强制进行此转换。
唯一会导致 C# 代码性能下降的是当您滥用 GC 的清理能力时。
IL2CPP.exe 是一个用于将 C# IL 代码转换为 C++ 的 Unity 实用程序。我的问题是:此可执行文件能否在 Unity 游戏开发环境 外部 用作转换 any .NET 应用程序的通用工具(不仅仅是游戏)到高性能的本机可执行文件?
虽然我知道一些 C++,但如果能够用我的语言编写所有种程序肯定很好熟悉和流利地使用 (C#)......无论它们是 audio/video/music-production DAW 还是 OS 级 security/forensics 工具或机器学习平台或任何其他资源密集型的.. .....并且知道它们将 运行 与直接用 C++ 编写的应用程序一样高效。
简答:否
IL2CPP 与 Unity 环境紧密相连,无法在 Unity 之外使用它。你需要编写自己的转换器(?)来做这样的事情。
更长的答案
IL2CPP 在性能改进方面没有任何魔力。将 C++ 与 C# 与 IL2CPP 代码进行比较应该(几乎-下面更多)没有性能优势。
与为 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)包装才能用于几乎任何东西,你不能编写自己的原生任何东西。 (这是一个简化)
- Unity是用C++写的,所以需要做一些很像Marshalling的事情,效率不是很高。
为什么是 IL2CPP?
- Unity 无法将其已经非常遗留的后端 (Mono) 及其遗留 API 转换为多线程,因为 Mono 对您的代码有很多假设,这些假设不容易转换为“简单”统一 API.
- Unity 核心是用 C++ 编写的,因此他们通过跳过 Mono“转换器”来消除任何形式的编组。
- IL2CPP 在可能的情况下将非常低效的 C#、单线程代码转换为多线程 C++,并且它通过分析 IL 代码来实现。
是否值得将其他 C# 转换为 C++?
否! 将 AOT 预编译的任意优化 C# 代码与(现代)C++ 进行比较。您应该获得相同的性能!我会说完全相同。
C#被编译成IL(Intermediate Language),顾名思义就是Intermediate。它在运行时转换为本机二进制代码(仅在需要时),这就是 C++ 被编译成的代码。您可以通过 运行 提前编译 (AOT) 跳过 IL 生成来强制进行此转换。
唯一会导致 C# 代码性能下降的是当您滥用 GC 的清理能力时。