令人“悲哀”的 C# 游戏生态 —— 主流引擎支持现状与现实困境

news/2025/12/15 3:46:29/文章来源:https://www.cnblogs.com/hulun/p/19347429

 

506ebc008689d9245d98edd8bcd691ba

 

头图与文无关

令人“悲哀”的 C# 游戏生态 —— 主流引擎支持现状与现实困境

前言

本文中所说的悲哀,是笔者个人的感受。我之所以认为“悲哀”,是因为没有这么一个/一种开源的,且对C#有着很完善的支持的游戏引擎。

游戏引擎对C#的支持

在本文截稿日期(2025年12月12日)为止,在我印象里在世界范围内最具人气的三大游戏引擎分别是Unreal Engine(UE、虚幻引擎)、Unity(团结引擎)和Godot。在这三个引擎中,只有Unity和Godot对C#有官方支持。UE官方支持C++,曾有过第三方C#插件,但现已停止维护。

Unity对C#的支持

C#是Unity官方目前唯一支持的,用作游戏脚本的语言。其对C#的支持非常完善。在游戏调试阶段,使用其二次开发的Mono、JIT编译C#代码,使得在调试阶段无需等待漫长的编译环节。在游戏的导出阶段,则使用IL2CPP技术,将C#代码编译为对应导出平台(最后要玩这个游戏的玩家设备)的原生机器码,以提升游戏在玩家设备上的运行性能。

IL2CPP,即Intermediate Language To C++,是Unity私有,闭源的一种技术。
对于一般的C#程序,通常是先把C#编译为Intermediate Language(中间语言),然后再让C#的运行时(Mono, .NET Framework, .NET Core等)解释运行。有点类似Java的字节码。
而IL2CPP,可以把Intermediate Language转换为相同功能的C++,然后再把C++编译成对应平台的机器码。让游戏拥有极致的运行性能。

我很长一段时间没有接触Unity。原因是Unity是商业非开源项目,由商业公司主导。

为了牟利,Unity曾经还推出过“安装费”这样的让人大跌眼睛的商业政策(虽然这个政策很快被收回)。

在国内,甚至还有团结引擎这样的特供版本。让我长期对Unity不抱有很大的好感。

Godot对C#的支持

据说为了吸引Unity开发者使用Godot,同时微软曾对Godot给出过一笔“慷慨”的捐款,让Godot很早就提供了对C#的支持。Godot 官方在文档和社区讨论中多次强调,C# 是其官方支持的脚本语言之一,并试图将其定位为与 GDScript 并行的选择。但事实似乎并非如此。

Godot4相对于Godot3而言,将其使用的C#运行时从Mono迁移到了.NET,但是其在迁移后至今(Godot 4.5.1 stable仍未适配)仍未适配C# WASM,使得Godot 4尚不支持导出到Web(WASM),不能把游戏导出到网页上。

WASM,全写作WebAssembly。我暂时没找到它的中文译名,但我认为可以理解其为网络汇编。即一种运行在浏览器上的,类似汇编语言的语言。相对于JS这样的脚本语言而言,会有更高的运行效率。

同时,Godot 4 对iOS和Android平台的支持也是“试验性”的。换言之,没有成熟和完善的支持。

具体可参考下面的截图,截图自Godot官方文档(4.5)https://docs.godotengine.org/zh-cn/4.5/tutorials/scripting/c_sharp/

image

其中,对iOS,官方的描述是:

iOS support is currently experimental and has a few limitations.(对iOS的支持当前是实验性的且还有少量限制)

  • • The official export templates for the iOS simulator only supports the x64 architecture.(对iOS模拟器的官方导出模板只支持x64架构)
  • • Exporting to iOS can only be done from a macOS device.(只能从macOS设备导出到iOS)

只能从macOS设备导出不是大问题。因为据我所知,打包iOS应用只能使用macOS。对于iOS开发者而言,一台Mac设备是必不可少的。

但是,“对iOS模拟器的官方导出模板只支持x64架构”。我不知道这句话是否隐含:存在“对iOS模拟器的、支持Arm64架构的官方或非官方导出模板”(似乎是没有的,至少我没查到有)。

如果的确只能支持x64架构,那说明其对iOS的支持基本可以说是没有的。因为,苹果公司从来没有发布过x64架构的iOS设备,包括iPhone、iPad和iPod。使用这个模板导出的游戏只能运行在使用Intel芯片的Mac的iOS虚拟机上。

这样的“试验性”支持对于一个正式游戏项目而言是不可接受的,更不必说商业化项目了。这样一来,基本上可以说Godot 4 C#只支持三大桌面平台(Windows、Linux和macOS)。

对我个人而言,在Godot提供了官方支持的两种语言中,我更偏向于使用C#。主要原因是我认为C#是一门更强大、更完善、更成熟的编程语言。它和主流的开发语言Java、C++在语法上更相似,有着高级的面向对象特性。有着更广泛的使用生态,在后端开发、桌面开发甚至机器学习方面有着很广泛的应用。另外,使用C#还有一个好处是,可以使用.NET生态下丰富的NuGet库。

在性能上,C#与GDScript各有优劣。一般而言,C#的性能优于GDScript。但是如果游戏程序要频繁调用Godot的接口,从C#到Godot的跨语言调用也是一笔不少的开销。在官方文档(见参考4)中说到,这种开销甚至在某种情况下会使其性能不如GDScript。

综上,Godot 4 作为一个开源游戏引擎极具吸引力,但其C#支持在移动端跨平台导出能力方面,尚不足以承载严肃的商业项目。

其他引擎

Godot 3 似乎有着对Web(WASM)、iOS、Android较好的支持。但是其使用Mono作为运行时,不支持C#新的语言特性。且Godot3本身也已经不再加入新特性,和Mono一样,进入了“长期维护状态”。

我查到了一个叫MonoGame的技术,但实际上它不算一个游戏引擎,只能说是一个游戏框架。没有编辑器、什么轮子都要自己造,在易用性上远不如Unity和Godot。

写在文末

本文仅代表作者个人观点,如有纰漏,欢迎友好的批评与指正。

参考:

[1]Godot官方文档,https://docs.godotengine.org/en/4.5/tutorials/scripting/c_sharp/
[2]Godot Blog.Raul Santos.Current state of C# platform support in Godot 4.2,https://godotengine.org/article/platform-state-in-csharp-for-godot-4-2/
[3]Reddit.hermitfist.State of Godot 4.4 Android/iOS using C#? Commercially viable?
[4]Godot官方文档,https://docs.godotengine.org/zh-cn/4.5/about/faq.html#which-programming-language-is-fastest

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1010588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工具分享:彻底解决Docker拉取慢/超时,解放双手!自动测速优选配置镜像源 代理切换脚本

背景与痛点 在国内使用 Docker,网络问题一直是初学docker小白的恶梦: docker pull 龟速:配置了几个国内加速器,但不知道哪个快,或者几天后突然全部失效。docker search 报错:搜索镜像时直接提示超时&…

单车慢跑中的节奏建议

单车定向的几个问题第21届智能车竞赛单车定向组比赛科目细则 01 单车定向中的慢跑 一、漫无目的 卓大单车还有如果这样跑可以吗? 我感觉这么跑的话就无线循环了,应该也在规则里ban了吧。 单车的两个公司的舵机可以混着用吗?   比如在k1车模…

CS配合CrossC2插件,实现MacOS/Linux上线

前言 我们知道CS原生只支持Windows上线,那么对于MacOS、Linux我们可以通过CrossC2插件实现上线下载地址:https://github.com/gloxec/CrossC2/releases我这里主要是演示上线MacOS,上线Linux是相同的,参考文章:https://…

1、掌握 Puppet 4:高效管理 IT 基础设施的秘诀

掌握 Puppet 4:高效管理 IT 基础设施的秘诀 1. Puppet 简介 在当今不断发展的软件行业中,DevOps 趋势正深刻改变着工作流程。开发者自行搭建和维护环境,运维人员则将自动化提升到新高度,把整个基础设施转化为代码。Puppet 作为一款新兴的服务器配置管理工具,凭借其独特的…

2、初探Puppet清单编写

初探Puppet清单编写 1. Puppet简介与重要性 在过去几年里,配置管理在IT领域变得越来越重要。特别是对于服务器操作而言,如果没有强大的管理基础设施,几乎无法进行。在众多可用的配置管理工具中,Puppet已成为最受欢迎和广泛使用的解决方案之一。它最初由Luke Kanies编写,…

无需运动恢复结构(SfM)的层级训练三维高斯溅射(3D Gaussian Splatting)

论文核心信息 论文题目:SfM-Free 3D Gaussian Splatting via Hierarchical Training(基于分层训练的无 SfM 3D 高斯 splatting)作者:Bo Ji、Angela Yao单位:新加坡国立大学会议:CVPR 2025(计算机…

3、编写首个Puppet清单指南

编写首个Puppet清单指南 清单排序配置 Puppet的近期版本支持基于本地清单的排序方式。在 puppet.conf 配置文件中,可按如下方式配置基于清单的排序: ordering = manifest此设置在Puppet 4中为默认配置。不过,了解排序原则仍十分重要,因为在更复杂的清单中,隐式顺序难…

前端工程师必看:AI+前端+A/B测试 实战指南(小白友好版)

前端工程师必看:AI前端A/B测试 实战指南(小白友好版) 是不是总觉得“AI”“A/B测试”这些技术离自己很远?其实现在前端已经能直接对接AI能力、落地A/B测试了!这篇文章会从**“是什么→前端要做什么→怎么实现”** 一步…

4、Puppet 入门:从基础使用到主从架构搭建

Puppet 入门:从基础使用到主从架构搭建 1. Puppet 类型文档与常用资源类型 Puppet 安装后,代码中内置了类型文档,可通过 puppet describe 命令在命令行打印: puppet describe <type> [-s]若不确定某个类型是否存在,可使用以下命令获取所有可用资源类型的完整列…

Notepad++紧急更新,且是两个版本,究竟修复了什么

开源文本编辑器 Notepad 接连发布了 v8.8.8/v8.8.9 更新&#xff0c;修复了更新组件 WinGUp 在对下载文件签名和证书校验不够严格的问题。 上月&#xff0c;Notepad 爆出了安全漏洞&#xff1a;在安装了 Notepad 的机器上&#xff0c;黑客劫持网络后&#xff0c;利用自动更新机…

5、Puppet 主节点与代理节点:全流程解析与性能优化

Puppet 主节点与代理节点:全流程解析与性能优化 在 Puppet 为中心的工作流里,服务器(甚至可能是工作站)配置的所有更改通常都源于 Puppet 主节点,并自动传播到代理节点。下面将详细介绍 Puppet 代理节点的生命周期、证书管理、运行方式、性能考量、不同运行方案对比、数据…

6、深入探究 Puppet:Facts、Types 与 Providers 详解

深入探究 Puppet:Facts、Types 与 Providers 详解 一、Facter 系统简介 在 Puppet 中,最初的解决方案虽然强大但成本高昂。主节点在编译过程中遇到特定表达式时需回调代理节点,编写能处理命令返回错误码的清单很费力,且 Puppet 可能变得像奇特的脚本引擎。 当使用 pupp…

C51_HC-05蓝牙通信

文章目录一、蓝牙   1、蓝牙的特点   2、蓝牙特性二、HC-05   1、简介   2、主要参数   3、引脚   4、模块原理图   5、工作模式     1&#xff09;、命令响应工作模式     2&#xff09;、自动连接工作模式     3&#xff09;、进入命令响应工作模式…

7、Puppet资源类型与模块:深入剖析与实践应用

Puppet资源类型与模块:深入剖析与实践应用 1. Puppet资源管理基础 在Puppet的资源管理体系中,资源类型和提供者是核心概念。资源类型定义了Puppet在DSL(领域特定语言)中暴露的接口,同时负责输入值的验证、转换等工作。而提供者则封装了实际操作系统及其工具链的知识,实…

8、利用类和自定义类型模块化清单

利用类和自定义类型模块化清单 编写综合类 许多类的编写目的是让 Puppet 在代理平台上执行重大任务。以 Apache 类为例,我们可以构思一个能被任何机器的清单包含的类,并确保满足以下条件: - 安装防火墙软件并配置默认规则集。 - 安装恶意软件检测软件。 - 定时任务按设定…

网络融合

AD_Classification 对3DCNN进行调试使之与LSTM训练回合尽量保持一致 融合两个网络 查看效果 使用2D网络? 问题:使用2D网络的话需要给每张图像加标签 解决办法:利用循环添加标签(one-hot格式) 问题:提取每幅图像的第30…

9、深入理解 Puppet 中的类、定义类型和模块

深入理解 Puppet 中的类、定义类型和模块 资源通知与容器排序 在 Puppet 中,当一个定义类型包装或包含服务(service)或执行(exec)类型的资源时,有时需要通知该定义类型的实例来刷新所包含的资源。例如: file { /etc/example_app/main.conf: source => ..., notif…

10、Puppet 模块:结构、管理与实践指南

Puppet 模块:结构、管理与实践指南 模块结构 模块的各个组件需位于特定的文件系统位置,以便主节点识别。每个模块构成一个目录树,其根目录以模块本身命名,例如 ntp 模块存储在 ntp/ 目录中。 清单文件(Manifests) :存储在 manifests/ 子目录下,每个类和定义类…

智源Emu3.5震撼登场:AI首次实现物理世界统一认知,开启多模态交互新纪元

智源Emu3.5震撼登场&#xff1a;AI首次实现物理世界统一认知&#xff0c;开启多模态交互新纪元 【免费下载链接】Emu3.5 项目地址: https://ai.gitcode.com/BAAI/Emu3.5 北京智源人工智能研究院今日对外正式发布了新一代多模态大模型Emu3.5&#xff0c;这款被业界专家评…

利用sklearn进行pca降维

from sklearn.decomposition import PCA import numpy as np # 主成分分析PCA def pca():"""主成分分析进行降维"""# 信息保留90%pca PCA(n_components0.9)data pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])print("")print(…