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

Unity读书系列《Unity高级编程:主程手记》——C#技术要点

文章目录

  • 前言
  • 一、业务逻辑优化技巧
  • 二、Unity3d中C#的底层原理
  • 三、List底层源码剖析
  • 四、Dictionary底层源码剖析
  • 五、浮点数的精度问题
  • 六、委托、事件、装箱、拆箱
  • 七、算法
  • 总结


前言

本文旨在总结某一概念的性质,并引出相关的技术要点。如果读者希望深入了解相关技术,可以通过点击链接获取更多信息。友情提示,建议将本文内容分成多个阶段学习,一次性阅读可能会让新手感到困惑。初次接触某些概念时容易产生误解,因此需要谨慎理解。


一、业务逻辑优化技巧

书中将业务逻辑优化放在最后,而我这里放在开头,但我选择将其置于开篇。这是因为很多技术栈和解决方案虽然备受推崇,却往往只是形式上的,有点像面试中滔滔不绝的八股文,只有真正了解内涵的人才会明白。实际上,很多优化和解决方案都是源于真实业务需求。只有在实践项目、需要时才需要去了解和研究。然而,最重要的,也是最容易被忽视的,是日常业务逻辑编写的代码。一般人只关心如何实现功能就算万事大吉,但优秀的程序员会更加关注如何以更恰当的方式实现功能,既能提升性能又能兼顾效率。日积月累,双方代码的质量就会千差万别。

二、Unity3d中C#的底层原理

在Unity中有两种运行机制,Mono和IL2CPP。Mono是一个跨平台的开源项目,Unity在开始时依靠Mono实现了跨平台的能力,吸引了大量的软件开发人员。而IL2CPP则是后来者居上,在性能、扩展等方面有着Mono无法比拟的优势。

详情查看Unity C#的底层原理概述。

三、List底层源码剖析

首先要提到的是 List 的使用。大多数人知其然而不知其所以然。当我们了解了 List 的源码之后,就会明白其中的逻辑,从而在项目中能够注意到许多常人容易忽略的细节和写法。比如,在向 List 插入(Insert)元素时,实际上是在 List 内部逐个遍历并赋值后续元素的过程。而在执行 Contains、Remove 等操作时,List 则是通过从头到尾遍历的方式来完成相应的逻辑。在面对数据比较、剔除等复杂且数据量大的处理逻辑时,经过深思熟虑后再采取行动解决问题,而不是图省事随意地使用这些接口,是至关重要的。然而,大多数人并不了解这些操作背后的逻辑,也因此容易忽视这些细节。

详情查看Unity List底层源码剖析。

四、Dictionary底层源码剖析

Dictionary是使用Hash冲突方案来解决关键字的字典组件。我们了解内部原理后,在业务中创建时尽量使用自定义合理的预设值来管理她的大小。同时,因为Dictionary是使用Object类的GetHashCode()方法来获取类实例的哈希值,而该算法是将内存地址转换成哈希值的过程,所以在调用时就会计算一次Hash,所以频繁的使用则会带来大量的算力损耗。怎么优化呢,尽量使用唯一标识的方式来代替GetHashCode()算法。

详情查看Unity Dictionary底层源码剖析。

说个题外话,面试遇到面试官问Dictionary底层逻辑(一般人应该说个哈希表和键值对),说了一堆似懂非懂的业务,什么行业算法;一问算法是算法部门写的,再问我们需要实现自己的数据结构吗,又答到用自带的就行。净整些虚的,如果大火遇到,怎么"怼"就不用我多说了吧。

五、浮点数的精度问题

说到浮点数精度,大家想到的就是double比float的精度高,想要高精度就用double类型。两者最明显的区别就是所占位数的不同,也就是字节不同,float是32位占8字节,double则是64位占8字节。因此,运算效率也不同。
真正开发过程中会发现数值计算不确定、比较不相等以及其他问题,当然,解决方案也是有的,可以用定点数、字符串等方式。

详情查看:浮点数的精度问题

六、委托、事件、装箱、拆箱

详情查看:委托、事件、装箱、拆箱

七、算法

详情查看:目前无,关注我,持续更新。


总结

本文旨在总结业务逻辑优化技巧,并引出相关的技术要点。在实际项目中,业务逻辑编写的代码往往是最重要的,而优秀的程序员会注重以恰当的方式实现功能,提升性能和效率。
不必担心自己的代码不够好,或者优化的方向不够准确。通过实践并不断修正错误,我们才能不断成长。但同时,也不要对自己或她人太过严格。比如,如果你带领着一些新人,她们只接触 Unity 一年,就让她们直接使用泛型和遵守各种规范,甚至使用一个自认为很厉害的框架,可能会适得其反。更明智的做法是根据项目的整体条件和需求进行合理的安排和优化,如果你是管理者需要让队员进行磨合。

相关文章:

Unity读书系列《Unity高级编程:主程手记》——C#技术要点

文章目录 前言一、业务逻辑优化技巧二、Unity3d中C#的底层原理三、List底层源码剖析四、Dictionary底层源码剖析五、浮点数的精度问题六、委托、事件、装箱、拆箱七、算法总结 前言 本文旨在总结某一概念的性质,并引出相关的技术要点。如果读者希望深入了解相关技术…...

Redis分片集群

哨兵集群虽然解决了高可用和高并发读问题,但是还是有缺陷 1. 因为是主节点是单节点,并发写存在瓶颈 2.数据量大了每个节点存储相同的数据,造成内存紧张,资源浪费 redis.conf文件 port 6379 # 开启集群功能 cluster-enabled yes…...

Math.Round()函数说明

Math.Round()并不是严格意义上的是四舍五入函数。它默认的执行的是“银行家舍入”算法,即四舍六入五取偶。概括为:四舍六入五考虑、五后非零就进一,五后皆零看奇偶,五前为偶应舍去、五前为奇要进一。 当为5时,取离着最…...

001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮

文章目录 ProductController.javaProduct.javaElasticsearchSyncListener.javaProductElasticSearchMapper.javaProductMapper.javaProductDeletedEvent.javaProductServiceImpl.javaSyncProductService.javaIProductService.javaElasticSearchSpringDemoApplication.javaServl…...

Vue 快速入门:Vue初级

语法规则 前端渲染 渲染有几种方式:原生js、js模板、Vue模板语法 原生js 使用字符串拼接 js模板语法 Vue.js 模板语法概述 Vue.js 是一个用于构建用户界面的渐进式框架,其模板语法非常灵活和直观。Vue 的模板语法基于 HTML,可以通过指令…...

什么是IP跳变?

IP 跳跃(也称为 IP 跳动)的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么?为什么它对于各种在线活动至关重要? 在本文中,我们将深入探讨 IP 跳跃的世界,探索其实际应用、用例、潜在问…...

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改

服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机,复制完成后,原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘,开机后发现还是原来的100G的磁盘,通过fdisk -l 查看有个sdb是150G, 但是已经划转的lvm盘只有100G, 通过df查看也是原来的100G: pvs查看pv里也是10…...

AOP是什么和OOP的区别

AOP(Aspect-Oriented Programming,面向切面编程)和OOP(Object-Oriented Programming,面向对象编程)是两种不同的编程范式,它们在多个方面存在显著的差异。 编程思想: AOP&#xff1…...

Clickhouse 字符串函数 - 2

reverse​ 反转字符串。 reverseUTF8​ 以Unicode字符为单位反转UTF-8编码的字符串。如果字符串不是UTF-8编码,则可能获取到一个非预期的结果(不会抛出异常)。 format(pattern, s0, s1, …)​ 使用常量字符串pattern格式化其他参数。pat…...

【个人成长】Fitten Code 测试案例分析

JS,Fitten Code 当插件,然后在代码分析的时候,有些小感悟,大模型写代码的思路,正常我理解的代码思路。 输入代码 (item.score* 100).toFixed(0)Prompt 得出的结果 5分,如果超过100按100算输出结果 con…...

管理Anaconda虚拟环境的实用指南

Anaconda是一个开源的Python数据科学平台,它提供了一个管理包和环境的强大工具。在这篇文章中,我们将探讨如何在Anaconda中创建、克隆、切换和管理虚拟环境,以及如何升级Python版本和更新conda本身。 切换Anaconda环境 在Anaconda中&#x…...

python如何在图片上写斜体字

在Python中,直接在图片上写斜体文字通常不是图像库(如PIL或OpenCV)的内置功能,因为这些库主要关注于图像处理而非复杂的文本渲染。然而,你可以通过几种方式在图片上创建斜体效果: 使用PIL(Pytho…...

算法练习第22天|39. 组合总和、40.组合总和II

39. 组合总和 39. 组合总和 - 力扣(LeetCode)https://leetcode.cn/problems/combination-sum/description/ 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数…...

CCF PTA 2022年11月C++大富翁游戏

【问题描述】 小明很喜欢玩大富翁游戏,这个游戏的规则如下: 1、游戏地图是有 N 个格子,分别编号从 1 到 N。玩家一开始位于 1 号格子。 2、地图的每个格子上都有事件,事件有以下两种类型: A)罚款 x 枚金币…...

React获取form表单值的N种方式

Ref模式&#xff08;非受控模式&#xff09; 非钩子模式 1.createRef()方式 js: userNameElcreateRef() <input type"text" name"userName" ref{this.userNameEl} /> 获取值的方式&#xff1a; this.userNameEl.current.value2.refs(废弃) js: con…...

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…...

Tomcat 内核详解 - Web服务器机制

详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件&#xff0c;它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...

IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署

安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...

蓝桥杯备战15.完全二叉树的权值

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N]; signed main() {std::ios::sync_with_stdio(0),cin.ti…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

django blank 与 null的区别

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

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…...