当前位置: 首页 > news >正文

【编程语言发展史】Unity开发语言的历史发展

Unity开发前期版本时,使用的是一种名为UnityScript的类似JavaScript的语言。然而,随着时间的推移,开发者社区大多数人都倾向于使用C#进行开发,Unity决定将重点放在C#上,因为C#具有更强大的生态系统、更好的性能和更广泛的开发者社区支持。因此,Unity在后续版本中逐渐弃用了UnityScript,将C#作为首选的开发语言。

C#的跨平台实现

如今我们都已经习惯了在Unity中使用C#,代码便捷的编写程序而无需关心我们的代码如何实现跨平台:跨平台这件事情似乎非常理所当然。

C#是微软基于.net框架实现的,自身并不支持跨平台,在.NetCore出现之前甚至无法运行在Windows之外的设备上,为了实现跨平台的目标,Unity引擎选择了Mono作为其主要的脚本运行时环境。

Mono是一个开源的、跨平台的.net框架实现,可以简单理解为一个虚拟机,它使得C#代码可以在各类桌面和移动设备上完美运行,也解决了跨平台的大问题。借助Mono的跨平台能力,Unity也在前些年的市场竞争中突飞猛进。

C#的跨平台实现-Mono

IL2CPP

虽然Mono解决了一个大问题,但明显没有解决所有问题。Mono毕竟不是Unity自己的产品,更新迭代慢,新特性支持延后,无法使用C#新特性...但重点还是安全性和性能,Unity占领的是移动端市场,而移动设备对性能非常敏感。

从2014年开始,Unity正式引入了IL2CPP编译器。IL2CPP将C#脚本编译为C++代码,然后进一步编译为本地机器代码,从之前的JIT,变成了AOT。通俗来讲,IL2CPP移除了上面提到的”Mono虚拟机“,省去了中间环节。

IL2CPP的优势主要体现在以下几个方面:

性能优化:通过将C#脚本编译为本地机器代码,IL2CPP消除了脚本解释和执行的开销,大大提高了游戏的性能。它可以在游戏运行时进行更高效的代码优化和内存管理。

64位支持:自从Apple决定自从2015年开始,App必须支持64位架构之后,移动端的64位时代也已经来临。而Unity集成的Mono在移动端暂时没有64位实现,这也就意味着,若要进行应用/游戏的分发,就必须使用IL2CPP。

平台兼容性:IL2CPP可以将C#代码编译为与目标平台相关的本地代码,从而实现更好的平台兼容性。无论是在PC、主机还是移动设备上,IL2CPP都可以生成与平台紧密集成的代码。

安全性:由于IL2CPP编译为本地机器代码,它提供了更高的代码安全性,减少了脚本易受攻击的风险。

未来,Unity团队将继续改进和优化Mono和IL2CPP。Mono方面,他们致力于提高脚本的性能和开发工作流程,改进编辑器的响应性和稳定性,并提供更多的工具和功能来支持开发人员的创作。IL2CPP方面,他们将继续优化编译器和运行时环境,提高代码生成和优化的效果,以及进一步扩展平台的支持。

Unity引入IL2CPP编译器

总的来说,Mono和IL2CPP在Unity中扮演着不同的角色。Mono提供了灵活的脚本运行时环境,便于快速迭代和开发游戏逻辑,而IL2CPP通过编译为本地代码,提供了更高的性能和跨平台兼容性。Unity团队将继续改进这两个技术,以提供更好的游戏开发体验和性能表现。

建议

如果您正在开发移动端应用,并准备发布到应用商店,不管是AppSotre、GooglePlay,还是国内的各大应用市场,64位支持都是必要条件,因此IL2CPP也是唯一可选项。

如果您是Window平台的内容开发者,为了性能和稳定性,也仍然强烈建议您使用IL2CPP打包。

如果您计划将您的应用分发至我们的实时云渲染平台,由于Mono虚拟机较为老旧,没有考虑到云渲染的服务器架构问题,存在Bug的潜在可能。目前已知的是,在云渲染环境下Mono和部分常用插件会有兼容性问题,因此为了应用运行的稳定性仍然强烈建议您使用现代化的IL2CPP打包。

小结

3DCAT是一种基于各类游戏开发引擎(如Unity、UE4等)的实时渲染技术,通过利用云端计算渲染和网络串流技术,能够实时制作并推送高质量的渲染内容到用户的终端设备。这项技术满足了广大用户的访问需求,无论时间和地点,用户都可以跨终端设备进行沉浸式、高互动性的体验。同时,3DCAT提供超高清的图像和视觉效果,让用户可以享受到逼真且令人惊叹的虚拟世界。无论是用于游戏、虚拟现实、建筑设计或其他应用领域,3DCAT的实时渲染能力为用户提供了前所未有的视觉体验和交互性。

相关文章:

【编程语言发展史】Unity开发语言的历史发展

Unity开发前期版本时,使用的是一种名为UnityScript的类似JavaScript的语言。然而,随着时间的推移,开发者社区大多数人都倾向于使用C#进行开发,Unity决定将重点放在C#上,因为C#具有更强大的生态系统、更好的性能和更广泛…...

springboot http添加请求头 添加请求证书

首先明确两个事情:请求对象,连接对象 我们知道你要是想发起一个请求,需要指定两个环节内容,一个是请求内容对象(request),一个是连接内容对象(httpClient) 它们两个的作用我们在下面会看到 简要分析源码 1.先说一下…...

【Qt之数据库操作】

使用Qt实现SQLite数据库操作可以分为以下几个步骤: 添加SQLite头文件和库文件: 在Qt项目中,需要在.pro文件中添加以下内容: QT sql打开/创建数据库: 可以使用QSqlDatabase类中的静态函数addDatabase()来添加数据库…...

数据结构(c语言版) 队列

链队列 要求&#xff1a;实现链队列的创建、初始化、入队、出队 &#xff08;先进先出&#xff09; 代码 // // Created by My.cy on 2023/10/19. // //链队列 创建、初始化、入队、出队 先进先出#include <stdio.h> #include <malloc.h>//定义结构体 struct…...

kimera论文阅读

文章目录 功能构成&#xff1a;Kimera线程A. Kimera-VIO:B. Kimera-RPGO:C. Kimera-Mesher:D. Kimera-Semantics:E.调试工具 功能构成&#xff1a; Kimera包括四个关键模块: Kimera-VIO的核心是基于gtsam的VIO方法[45]&#xff0c;使用IMUpreintegration和无结构视觉因子[27]…...

golang gorm通过泛型实现通用单表增删改

golang gorm通过泛型实现通用单表增删改 无废话&#xff0c;直接上代码 想实现通用&#xff0c;首先得实现查询的通用&#xff0c;可以用传递map实现 func Where(where map[string]interface{}) func(db *gorm.DB) *gorm.DB {return func(db *gorm.DB) *gorm.DB {dbTmp : db…...

十、K8S之ConfigMap

ConfigMap 一、概念 在K8S中&#xff0c;ConfigMap是一种用于存储配置数据的API对象&#xff0c;一般用于存储Pod中应用所需的一些配置信息&#xff0c;或者环境变量。将配置于 Pod 分开&#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。 二、创建 可以使用 ku…...

python飞书群机器人通过webhook发送消息

python飞书群机器人通过webhook发送消息 import json import loggingimport requestslogger logging.getLogger(__name__) logging.basicConfig(levellogging.DEBUG)class FeishuTalk:"""飞书群机器人通过webhook发送消息"""def __init__(self…...

埃隆·马斯克的 AI 聊天机器人 Grok 已经上线

昨天&#xff0c;埃隆马斯克 (Elon Musk) 通过他的公司 xAI 推出了一款名为 Grok 的新型人工智能聊天机器人。这款新的聊天机器人将通过 Twitter 更新实时获取世界知识&#xff0c;使其成为最新的对话 AI 系统。 Grok 的独特和基本优势在于它可以通过 &#x1d54f; 平台实时了…...

【代码随想录】算法训练营 第十五天 第六章 二叉树 Part 2

102. 二叉树的层序遍历 层序遍历&#xff0c;就是一层一层地遍历二叉树&#xff0c;最常见的就是从上到下&#xff0c;从左到右来遍历&#xff0c;遍历的方法依然有两种&#xff0c;第一种是借助队列&#xff0c;第二种则是递归&#xff0c;都算是很简单、很容易理解的方法&am…...

使用ssl_certificate_by_lua指令动态加载证书

1、下载 OpenResty - 下载 根据自己系统选择下载&#xff0c;我的是64位 2、解压到目录 3、启动openresty 进入解压后的目录&#xff0c;执行nginx.exe 浏览器输入 http://localhost 查看是否正常。显示以下画面就表示没有问题。 接下来可以开始准备动态安装证书 4、使用o…...

Qt中Opencv转Qimage出现重影或者颜色不对

废话不多说 在qt中opencv获取的图像转qimage时出现重影原因&#xff1a; 图像数据的内存对齐可能会导致画面重影&#xff0c;如果出现误差转换出来的图就会出现重影 解决办法&#xff1a; cv::Mat image_bgr cv::imread(“example.jpg”); cv::Mat image_aligned; cv::copyMak…...

upload-labs-1

文章目录 Pass-01 Pass-01 先上传一个正常的图片&#xff0c;查看返回结果&#xff0c;结果中带有文件上传路径&#xff0c;可以进行利用&#xff1a; 上传一个恶意的webshell&#xff0c;里面写入一句话木马&#xff1a; <?php eval($_POST[cmd]); echo "hello&quo…...

【vite配置路径别名@】/启动配置

npm install types/node --save-dev npm install path --save import { defineConfig } from vite import vue from vitejs/plugin-vue // 配置别名 import { resolve } from "path";// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()]…...

3. List

数据结构在Java集合中的对应关系 线性表【数组】 -> ArrayList 线性表【链表】-> LinkedList 队列 -> Queue -> LinkedList&#xff0c;PriorityQueue, ArrayBlockingQueue … etc. 双端队列 -> Deque -> ArrayDeque 栈 -> LinkedList 哈希表 -> Hash…...

Django初窥门径-oauth登录认证

引言 在现代Web应用程序中&#xff0c;用户身份验证和授权是至关重要的组成部分。Django&#xff0c;一个流行的Python Web框架&#xff0c;为用户身份验证提供了内置支持。本文将探讨如何创建和注册Django应用&#xff0c;自定义身份验证服务&#xff0c;配置AUTHENTICATION_…...

数学到底在哪里支撑着编程?

数学到底在哪里支撑着编程&#xff1f; 除了少数算法等明显相关情况外&#xff0c;说点日常的。 编程是个极度依赖逻辑的领域&#xff0c;逻辑严谨性好&#xff0c;你的编程工作会顺畅很多一-绝大多 数的bug都是最近很多小伙伴找我&#xff0c;说想要一些嵌入式的资料&#x…...

Python模块ADB的, 已经 pyadb

Python模块ADB的使用指南_笔记大全_设计学院 (python100.com) pip install adb Python 调用ADB_python 调用adb命令_实相实相的博客-CSDN博客 Python ADB.shell_command Examples, pyadb.ADB.shell_command Python Examples - HotExamples Gitee 极速下载/PyADB - 码云 - 开…...

猫头虎分享从Python到JavaScript传参数:多面手的数据传递术

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

注解汇总:Spring 常用的注解

前言 本栏目的内容已经讲完了&#xff0c;本案例将把案例中所有讲到的注解都汇总起来&#xff0c;方便日后的学习需要用到的时候能够快速的找到相应的注解。本案例将结合小案例一起做汇总&#xff0c;也想丹玉是再复习一遍讲过用过的注解。 一、注解汇总 1、Component Reposi…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...