Unity中Mono所搭建的脚本核心基础

Unity脚本运行时Mono核心原理与性能优化实战指南 在游戏开发领域,脚本运行时是连接高级编程语言与底层引擎核心的关键组件,它决定了代码的执行效率与跨平台兼容性。其核心原理在于将C#等高级语言编译为中间字节码,再通过即时编译或提前编译技术转换为目标平台的原生机器码执行,从而实现“一次编写,到处运行”的技术愿景。这一机制不仅大幅提升了开发效率,还通过托管环境提供了自动内存管理等便利特性,对大型项目的可维护性至关重要。在Unity引擎中,Mono作为其长期使用的默认脚本后端,深刻影响了开发工作流与性能特征。开发者需特别关注其垃圾回收机制带来的内存管理挑战,例如在U 阅读详情

Mono基本介绍

Mono组件

C#编译器——MCS:MCS的作用就是将C#编译为CIL(通用中间语言)

Mono运行时(mono Runtime):运行时中的编译器将CIL的Byte Code在转译为原生码,同时提供即时编译(JIT),提前编译(AOT),完全静态编译(Full-AOT)三种转译方式

基础类库:提供广泛的基础类

Mono类库:提供额外的有用功能,尤其是构建Linux方面

Mono如何提供脚本功能

总所周知Unity是由C++写成的,将Mono运行时嵌入到由C++写成的应用后,该应用便会获取一个完整的虚拟机环境 。Mono的嵌入接口就会将Mono运行时暴露给C++代码,哪些C/C++代码被称为非托管代码,经CIL编译器生成的CIL代码被称为托管代码。

Mono运行时嵌入应用可分为3个步骤:

  • 编译C++程序和链接Mono运行时
  • 初始化Mono运行时
  • C/C++ 和C#/CIL的交互

假设我们要实现Unity中的组件系统,在C#中定义Component类,C#端中主要目的是为游戏脚本提供相应接口,而不是具体逻辑的实现。我们在C/C++中实现具体逻辑,再以该代码中创建的实例为样本,调用Mono提供的方法在托管环境中创建相同的类型实例。

我们可以看出,虽然引擎底层是由C/C++实现的,但是他通过Mono提供了一套C#的接口作为其脚本语言,方便我们快速开发游戏

UNITY如何跨平台

原理就是CIL!

由于CIL的存在,不同平台的代码编译只需要两个步骤:从代码本身到CIL,从CIL到本地指令的即时编译

这样我们就不用根据不同的平台部署不同内容

什么是CIL

CIL(Common Intermediate Language)是指令集。

CIL主要有以下特点:

  • CIL基于堆栈而非CPU
  • 面向对象
  • 以一个“.”开头,可读性较低

CIL其实没有在本地运行,他是在运行在虚拟机中的,具体到Unity中就是Mono运行时,运行在本地的是被编译后的原生代码

Unity中的脚本语言

哈人!Unity除了可以使用C#之外,还可以使用Boo、UnityScript(和JavaScript的相同点就是后缀相同)

C#效率比UnityScript更快,因为UnityScript涉及频繁的拆箱装箱,但他们是同一个层级的语言(都需要一个CIL的过渡过程)。至于Boo已经在Unity5.0之后停止文档支持了

Unity的脚本编译

无论是哪种语言编写的源代码,最后都不能供CPU运行,需要先被翻译为本地代码(也就是二进制的机器语言)

脚本编译流程概览

Unity并非直接将游戏脚本编译为二进制脚本而是将他编译为新的.NET dll文件,再通过Mono内部的 JIT 编译器编译为二进制代码(IOS平台不行,这也是为何Unity平台不能给出热更新方案,IOS一般采用完全静态编译)

但是呢Unity的游戏脚本中经常会存在相互引用彼此定义的类型的情况,所以脚本编译将会按4个阶段的顺序进行,取决于他所在的文件夹,是的,也就是Asset,Plugins,Editor那些文件夹。

  1. 编译运行时的脚本:这些脚本位于Standard Asset,Plugins,Pro Standard Asset(存放专业版才有的功能)文件夹中,这些文件夹中的脚本肯定不会访问外部变量
  2. 编译Editor的脚本:位于Plugins/Editor,Standard Asset/Editor,Pro Standard Asset/Editor中,我们使用了UnityEditor命名空间的脚本都要放在上述文件夹中,比如我们想要拓展Unity编辑器使用的脚本都要放在上述文件夹中
  3. 所有不在Editor中的脚本:基本就是我们开发过程中创建的游戏逻辑脚本
  4. 剩余的脚本:不在特殊文件夹的Editor中的,而在其他Editor文件夹中的脚本(好拗口解密)

JIT即时编译

定义:一个程序在他运行时创建并且运行了全新的代码

编译器不仅会生成CIL代码,还会在托管模块中生成数据表集合,又叫metadata元数据。用来描述该模块定义了什么,引用了什么,所以进行JIT编译的时候就不需要额外的C++头文件的支持。

相较于传统的直接将脚本编译为原生代码,JIT可以跨平台,而且具备了对生成的原生代码进行性能优化的能力,虽然即时编译会影响运行时的效率,但Mono优化之后并不明显。

不同平台上的编译

Android

在打包成apk之前,首先需要一套Android开发环境,具体步骤为:

  1. 在Android Developer SDK界面下载最新的SDK,安装解压
  2. 将Android设备与计算机相连,识别成功后在Unity中设置Android SDK路径,第一次发布的时候需要提供Android SDK安装的根目录(在Preference中修改)

生成Android引用程序也分为两个主要步骤:生成apk和将该文件部署到Android设备上。我们点击Build and Run会执行两个步骤

IOS

需要使用AOT编译方式(Ahead-Of-Time提前编译),先将游戏脚本源码提前编译,这样运行时直接加载已经编译好的原生源码而不是即时编译。相比JIT主要优势是减少启动时间、节约内存、生成的原生源码性能可能更好

Unity Mono游戏逆向实战:Frida Hook绕过碰撞死亡判定 在移动游戏开发与安全分析领域,Unity引擎因其跨平台特性被广泛应用,其脚本后端Mono和IL2CPP是核心执行框架。Mono运行时通过解释或编译C#字节码来驱动游戏逻辑,其核心函数mono_runtime_invoke是所有托管方法调用的必经枢纽。理解这一原理对于游戏逻辑分析、安全测试和性能优化具有重要技术价值,尤其在动态插桩和运行时行为干预场景中。通过Hook此函数,可以在不修改原始程序集的情况下,实现对特定游戏逻辑(如碰撞检测、状态判定)的精准拦截与修改。本文以一款经典Unity Mono游戏为例,结 阅读详情

相关推荐

Unity脚本后端选择:Mono与IL2CPP性能、兼容性及实战对比

在游戏开发中,脚本后端是决定应用性能与平台兼容性的核心技术组件。其核心原理在于代码编译与执行方式:即时编译(JIT)在运行时动态生成机器码,提供开发灵活性;而提前编译(AOT)则在构建阶段进行静态优化,直接输出高效原生代码。从技术价值看,AOT方案能显著提升运行效率、优化内存管理并增强代码安全性,尤其适用于对性能与安全有高要求的移动端及跨平台项目。在应用场景上,高性能游戏、移动应用及WebGL项目往往依赖AOT编译来确保稳定帧率与合规发布。本文聚焦Unity开发中的具体实践,通过对比Mono与IL2CPP在

weixin_30315723的博客 303

其他笔记 - Mono for Windows 跨平台 Runtime 在Win10上编译和安装

目录在Windows上编译Mono安装环境下载Mono源码预配置编译安装说明详细的编译说明启用BTLS作为Windows构建的加密后端为Windows版本启用LLVM使用monolite代替预装的Mono发行版使用 Visual Studio 安装 Mono对于Visual Studio 2015 64位Mono Runtime构建:对于Visual Studio 2017 64位Mono Runtime构建:Visual Studio MSBuild构建属性配置make为使用Visual Studio构建

参谋谋的博客 5010

Unity脚本后端深度解析:从Mono到IL2CPP的性能、安全与实战迁移

在游戏开发与高性能应用领域,脚本后端的选择深刻影响着应用的性能、安全与部署。其核心原理在于代码的编译与执行方式,通常涉及即时编译与提前编译两种主流技术路线。JIT(即时编译)技术在运行时动态编译代码,提供了极佳的开发灵活性和快速迭代能力,但可能引入运行时开销与安全风险;而AOT(提前编译)技术则在构建阶段将代码静态编译为本地机器码,牺牲部分灵活性以换取更高的执行效率与代码保护强度。从技术价值看,这直接关系到应用的启动速度、运行时帧率稳定性、内存占用以及抵御逆向工程的能力。在Unity引擎、移动游戏开发等具体

weixin_33670713的博客 463

【游戏引擎 - C#脚本系统】2、配置Mono Runtime环境

11111

记录值得记录的东西 2041

Unity脚本后端深度解析:从Mono到IL2CPP的性能、安全与迁移实战

在Unity游戏开发中,脚本后端的选择直接影响应用的性能、安全与跨平台能力。理解即时编译(JIT)与预先编译(AOT)的核心原理是基础。JIT在运行时动态编译,提供了灵活性,但可能带来启动延迟和代码安全风险;而AOT在构建时完成全部编译,消除了运行时开销,并能通过深度优化提升执行效率。从技术价值看,AOT编译模型通过生成高度优化的原生代码,不仅带来了更稳定的运行时性能,还从根本上提升了代码的安全性,使得反编译难度大幅增加。在应用场景上,对于追求启动速度、计算密集型操作效率以及代码保护的移动端、WebGL和商

weixin_33674976的博客 444

Unity深度调试:从源码编译可调试mono.dll的完整实践指南

在软件开发中,调试是定位和修复问题的核心环节,而符号文件(如PDB)是实现源码级调试的关键。对于Unity开发者而言,官方发布的mono.dll默认不包含调试符号,限制了在复杂场景下的深度问题排查能力。通过从Unity官方提供的Mono源码进行编译,开发者可以生成附带完整调试信息的定制版本,从而实现对托管代码和运行时内部机制的透明观测。这一技术方案不仅解决了发布版本中诡异Bug的追踪难题,还为性能优化、内存分析及第三方库集成问题提供了底层支持。本文将以Unity引擎为例,详细阐述如何通过环境配置、源码修改和

weixin_33922672的博客 376

使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework

之前有一个C#版本和ios版本(支持下载学生名单,点名等更多功能,该版本未上app store)的教辅助手帮助学校老师提交成绩到教务系统(浙大正方web版),一直打算用mfc写一个vc++版本的可以方便的在未安装net framework的电脑上使用,前几天看到一篇文章再谈为什么要使用MONO  ,既然Unity3D游戏(mono内核)可以单独打包脱离net framework,那我的教辅助手

记事本 4474

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

【游戏引擎 - C#脚本系统】1、Mono介绍

11111

记录值得记录的东西 3845

RabbitMq安装

本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案

sinat_25821779的博客 321

IROS 2025机器人技术解析:从诡异设计到硬核应用

机器人技术正从传统的结构化环境应用,迈向复杂非结构化场景的深度交互。其核心原理在于通过仿生设计、多模态感知与智能控制算法,赋予机器人类似生物的适应性与交互能力。这一技术演进的价值在于突破传统机器人在极端环境、精密操作和自然交互中的瓶颈。例如,结合深度强化学习的全身动力学控制,使机器人能在废墟、管道等复杂地形中自主导航;而软体机器人技术则通过材料变形实现安全、柔顺的抓取操作。这些技术最终服务于极端环境巡检、精密装配和高端陪护等刚性应用场景,推动机器人从功能实现迈向与环境、人进行深度、智能交互的新阶段。

weixin_34006468的博客 447

.NET Runtime Mono运行时:跨平台.NET实现

Mono运行时是.NET生态系统中的重要组成部分,为跨平台.NET应用程序提供了强大的运行时环境。作为开源实现,Mono不仅支持传统的桌面和服务器应用,还扩展到移动设备、WebAssembly和嵌入式系统等多个领域。 ### Mono架构核心组件 ```mermaid graph TD A[Mono运行时] --> B[核心引擎] A --> C[垃圾回收器] A --...

gitblog_00919的博客 786

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

目标是优化风力涡轮机的功率调度,使其在给定的实时风速数据下,最小化涡轮机关键组件(如塔架和主轴)的疲劳损伤。问题的挑战在于,考虑通信延迟和测量噪声的同时,要确保功率输出与风速变化的响应快速且准确。

2401_82549447的博客 6627

ESP-IDF BLE ANCS 配对失败:从广播到加密密钥,五步定位卡点

ESP32 连 iPhone 读通知时,ESP-IDF BLE ANCS 配对失败是个高频问题:iOS 弹不出配对框、输入 passkey 超时、或者配对成功却找不到 ANCS 服务。这篇给一条递进式排查路线:先用症状自查失败发生在哪一段,再沿广播、配对参数、passkey、加密后服务发现四个检查点逐步走,每次只改一个变量,用串口日志确认是否通过。 ## 1. 自查症状:配对失败卡在哪一段 🔍

gitblog_00042的博客 393

WinCC与PLC在西门子逻辑赛项中的通信配置避坑指南

本文针对西门子逻辑赛项中WinCC与PLC通信配置的常见问题,提供了一套实战避坑指南。重点解析了WinCC、PLC与EET仿真平台的三角通信架构,强调了IP地址规划、防火墙设置等关键环节的注意事项,并给出了系统化的故障诊断流程与排查技巧,帮助选手和技术人员快速定位并解决通信故障,确保监控系统稳定运行。

weixin_29165725的博客 107

华为OD机试 - 音乐小说内容重复识别 - 并查集(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 159

Unity构架解析:Unity Mono 脚本后端概述

摘要:Unity的Mono脚本后端采用JIT即时编译技术,开发阶段编译速度快、调试便捷,但不支持禁用JIT的平台(如iOS)。本文详细介绍了Mono的特性、平台兼容性、调试支持及配置方法,包括可视化设置和脚本自动化两种配置方式,并强调多平台需单独构建。Mono适合开发迭代阶段,但需注意平台限制。

分享知识,拥抱变化 1411

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 在线蒸馏 (附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv11的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了,本文内容为在线蒸馏教程,之前的文章为离线蒸馏!

Snu77的博客 2667

Unity C# 和 Mono简史

一般Unity游戏开发,都使用C#作为主要开发语言。虽然Unity本身支持Unity(一种Java的扩展)和Boo(一种受Python启发的语言),但是在正常生产实践中,还是会使用C#作为主要开发语言。 什么是C#? C# 是微软推出的一种基于 .NET 框架的、面向对象的高级编程语言。微软在 2000 年发布了这种语言,希望借助这种语言来取代Java,更多详细的介绍可以参看C#Wiki。 为什么是C#? 因为C#的跨平台特性可以解决Unity引擎的跨平台支持问题。 其实确切的说,跨平台的并不是C

Peter的博客 6308

Matlab 普通kriging(克里金)插值

Matlab 普通kriging(克里金)插值

dayuhaitang1的博客 4569

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity入门----Unity脚本基础

FixedUpdate函数:主要是用于进行物理更新如碰撞检测,是每一帧都会执行的,但是这个帧和游戏帧不同,这个帧的时间间隔是可以自己定义修改的,在“项目设置”中的“时间”里去设置。的成员变量,那么他会自动显示在Inspector窗口上,而且显示的值会是你给的初始值,如果没给,显示的就是默认值,如上图。这个函数是有一个参数的,默认为false,意思就是如果子对象处于失活状态,是不会去寻找这个对象是否有某个脚本的,如果是true,哪怕处于失活也会去寻找。此时,我把游戏对象移除,再点击运行,控制台会为空白;

2203_75571378的博客 1236

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Unity Mono和IL2CPP的区别

*目录 Unity是如何实现跨平台的? Mono介绍 IL2CPP介绍 Mono与IL2CPP的区别* 一、Unity是如何实现跨平台的? 跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任意在平台上跑,即代码不依赖于操作系统,也不依赖硬件环境。 Unity是如何实现跨平台的?这就得提到Unity脚本后处理(Scripting Backend)的两种方式Mono和IL2CPP。让我们来搞清楚这2个的区别。 二、Mono介绍 Mono是一个由Xamarin公司所主持的自由开放源码项目。 Mon

weixin_41044151的博客 2743

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Unity 引擎开始从 Mono 迁移到 .NET CoreCLR

Unity 引擎开始从 Mono 迁移到 .NET CoreCLR的解读

YF云飞的博客 4204

Unity脚本后端深度解析:从Mono到IL2CPP的性能演进与迁移实战

在游戏开发与高性能应用领域,脚本后端是决定代码执行效率与平台兼容性的核心组件。其原理在于将高级语言代码转换为目标平台可执行的机器码,传统解释型或即时编译(JIT)方式虽便于快速迭代,但在执行效率与跨平台限制上存在瓶颈。静态编译技术通过预编译优化,能显著提升运行时性能并满足严格的安全策略,其技术价值体现在更稳定的帧率、更低的内存开销以及无缝支持iOS等禁止动态代码生成的平台。在Unity引擎的生态中,这直接关系到移动端与主机游戏的性能优化、包体控制及开发工作流。本文聚焦Unity脚本后端的核心机制,深入对比M

weixin_30439067的博客 321

Unity跨平台开发核心:.Net运行时、IL2CPP与Mono后端深度解析

在软件开发领域,跨平台技术是实现代码一次编写、多端运行的关键。其核心原理在于通过中间层抽象,将高级语言代码转换为平台无关的中间表示,再由各平台的运行时环境执行。.Net框架正是这一理念的杰出代表,其公共语言运行时(CLR)和中间语言(IL)机制构成了跨平台的技术基石。对于游戏开发而言,Unity引擎深度集成了.Net生态系统,通过Mono和IL2CPP两种脚本运行时后端,将C#代码高效部署到iOS、Android、PC等多元平台。理解.Net运行时与Unity的协作机制,不仅能优化游戏性能、解决平台兼容性问

cnracht8153的博客 287

Unity中.Net与Mono的关系

NET是一个开发框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Language Runtime)两种约定,CIL标准为一种编译标准:将不同编程语言(C#, JS, VB等)使用各自的编译器,按照统一的标准编译成语义一致的CIL中间码, 这样虽然代码使用的语言不同,但编译出的产物是一样的。CLR标准为一种执行标准:不同的操作系统可以根据CLR这一执行标准开发出自己平台的中间码执行器,这样CIL这个标准中间产物就可以在不同的平台执行了。

gghhb12的博客 2038
上一篇: unity 脚本之间的优雅沟通方式
下一篇: Unity3D脚本语言的类型系统
地狱火堡垒
博客等级 码龄6年 132粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值