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

Posted

技术标签:

【中文标题】我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?【英文标题】:Can I use IL2CPP (Intermediate Language To C++) for non-Unity applications? 【发布时间】:2021-06-05 19:54:55 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

简短回答:否

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(中间语言),顾名思义就是中间语言。它在运行时转换为本机二进制代码(仅在需要时),这就是 C++ 编译成的内容。您可以通过运行 Ahead of Time 编译 (AOT) 跳过 IL 生成来强制进行此转换。

只有当你滥用 GC 的清理能力时,你的 C# 代码的性能才会降低。

【讨论】:

"现代 C++ 也有 GC" 语言本身没有。有像 Boehm GC 这样的库,但它们不是标准的一部分。 @dxiv 我找不到相关信息,但我认为他们通过shared_ptr将GC添加到C++ 11。 @TomaszJuszczak shared_ptr 是一个 RAII 包装器,没有 GC。 对它的描述足够公平,我猜。顺便说一句,你看过 DOTS 吗?有点重构核心,用于并行化和以其他方式优化事物,使用数组中的数据而不是对象。 @antont DOTS 构建在 IL2CPP 核心之上。他们正在使用他们用于“正常”统一代码的现有堆栈,并在引擎盖下添加更多魔法。如果你想编写自己的引擎,你可以在 C# 中做同样的事情。只需将所有数据保存在多个数组中,按对象类型分组并并行处理每个组,您就可以在 C# 中使用 DOTS!只要记住不要一直分配内存,这样 GC 就不必为你工作了 :)

以上是关于我可以将 IL2CPP(C++ 中间语言)用于非 Unity 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

c语言和c++和c#的区别

从 C# 获取非托管 C++ 函数

C++ 向量和列表插入

Unity发布WebGL时il2cpp报错

用于 C++ 的 C# 包装器,但仅编译为静态库

在 C++ 中将非 const 转换为 const