C# Unity 唐老狮 No.2 模拟面试题

news2025/5/13 18:23:55

 本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要:

Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho

        如果你发现了文章内特殊的字体格式,那是AI补充的知识

目录

C#

1.Equals可以判断一些引用类型是否相等 尤其是对象不同时

2.深浅拷贝主要区别为引用类型是否独立

3.第二种速度更快 因为List涉及到了扩容

4.B先打印 ,A:10 B:11

5.A 11 B11 因为是引用类型

Unity

1. Unity中当一个细小高速物体撞击另一个较大物体时,会出现什么情况?如何避免?

2. 请简述一下Prefab(预制体)的本质是什么?

3.Unity是否支持写成多线程程序?如果支持的话需要注意什么?

4. 请简述一下对象池,在游戏开发中我们什么时候会用到它?

5. 什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?


C#

1.Equals可以判断一些引用类型是否相等 尤其是对象不同时

       对值类型 二者都可以使用 

static void test() {
    int a0 =1;
    int a1 =2;
    Console.Write(a0==a1?a0:a1);
    Console.Write(a0.Equals(a1));
}
test();

        但是当对象比较变成 不同的类  时 == 就不被允许了(除非operator重载运算符)

        当然,你去比较两个相同类型的对象仍然是可以的 

a Obja0 = new a();
b Objb = new b();
a Obja1 = new a();
Obja0 = Obja1;

Console.Write(Obja0.Equals(Objb));
Console.Write(Obja0.Equals(Obja1));
Console.Write(Obja0  == Obja1);
特性== 操作符Equals 方法
本质运算符(可重载)虚方法(可重写)
默认行为值类型:比较值;引用类型:比较引用地址值类型:比较值;引用类型:比较引用地址
可自定义性通过重载 operator == 改变行为通过重写 Equals 方法改变行为
null 处理可直接比较 null(如 obj == null需先检查是否为 null,否则可能抛 NullReferenceException
多态性静态绑定(编译时决定行为)动态绑定(运行时根据实际类型决定行为)

         另外对于string引用类型却有值类型的特殊性,Equals比较的是其字符串内容(值)

2.深浅拷贝主要区别为引用类型是否独立

public class MyClass : ICloneable
{
    public int Value { get; set; }
    public List<int> List { get; set; } = new List<int>();

    // 浅拷贝实现
    public object Clone()
    {
        return new MyClass
        {
            Value = this.Value,    // 值类型直接复制
            List = this.List       // 引用类型复制指针
        };
    }
}

// 使用示例
MyClass original = new MyClass 
{ 
    Value = 10,
    List = new List<int>() 
};

// 浅拷贝
MyClass shallowCopy = (MyClass)original.Clone();

// 修改拷贝对象
shallowCopy.Value = 20;       // 不影响 original.Value(值类型独立)
shallowCopy.List.Add(1);      // 会影响 original.List(共享同一个列表实例)
using System;
using System.Collections.Generic;

public class MyClass : ICloneable
{
    public int Value { get; set; }
    public List<int> List { get; set; }

    // 实现深拷贝
    public object Clone()
    {
        return new MyClass
        {
            Value = this.Value,  // 值类型直接复制
            List = new List<int>(this.List)  // 创建新列表实例(深拷贝关键)
        };
    }
}

// 使用示例
MyClass original = new MyClass 
{ 
    Value = 10,
    List = new List<int>() 
};

// 深拷贝
MyClass deepCopy = (MyClass)original.Clone();

// 修改拷贝后的对象
deepCopy.Value = 20;       // 不影响 original.Value
deepCopy.List.Add(1);      // 不影响 original.List
特性浅拷贝(Shallow Copy)深拷贝(Deep Copy)
复制层次仅复制对象本身及其直接字段(一层)递归复制对象及其所有引用字段的完整对象树
引用类型字段复制引用地址(新旧对象共享同一引用对象)创建新对象并复制内容(新旧对象引用完全独立)
性能高效(仅复制一层)较低效(需递归复制所有嵌套对象)
适用场景引用字段不可变或无需独立修改时引用字段需要完全独立修改时

3.第二种速度更快 因为List涉及到了扩容

        关于扩容简单写法请看这篇之中的c#部分第五题:
C# &Unity 唐老狮 No.1 模拟面试题-CSDN博客

4.B先打印 ,A:10 B:11

        异常捕捉的机制是先try然后接着finally执行捕获 再执行其他地方的代码 但是return是已经返回出去了i,因此是先return 再B处 再A处

5.A 11 B11 因为是引用类型

Unity

1. Unity中当一个细小高速物体撞击另一个较大物体时,会出现什么情况?如何避免?

        会穿过去 ,或者卡在大球的某个部分抖动,解决方法:

1.将碰撞检测改为更好的方式:

2.射线检测

可以给小球加一个很短的射线检测 当撞击前就做出一定的预处理

这个方案由ai提供 我还真没用过

3.修改固定时间步长
在 Project Settings --> Time 中减少 Fixed Timestep 值(如从0.02改为0.01),提升检测频率

2. 请简述一下Prefab(预制体)的本质是什么?

        本质是一个配置文件,里面有很多关于该预制体的参数和基本信息,甚至可以自行修改

3.Unity是否支持写成多线程程序?如果支持的话需要注意什么?

        支持,但是要注意unity本身就带有一个主线程,其大部分api都只能在主线程里面跑,如果在其他线程和主线程同时调用unity的一这些api(比如translate,GetComponent等等)会导致线程冲突报错 所以禁止直接调用Unity API,但可通过 MainThreadDispatcher 将任务排队到主线程执行

// 示例:主线程调度器
public class MainThreadDispatcher : MonoBehaviour {
    private static Queue<Action> tasks = new Queue<Action>();
    void Update() {
        while (tasks.Count > 0) 
            tasks.Dequeue().Invoke();
    }
    public static void RunOnMainThread(Action action) => tasks.Enqueue(action);
}

        同时还要注意多线程本身就应该注意的问题:

        内存泄漏,是指要在合适的时机对后台关闭后台线程,不然这个线程将会一直运行 哪怕你停止运行了游戏 在Editor之中仍然在跑,直到这个线程持有了大量的资源,导致可用内存逐渐减少, 这种现象就是内存泄漏

        避免死锁,即多个线程相互等待对方释放资源而陷入僵持状态

4. 请简述一下对象池,在游戏开发中我们什么时候会用到它?

知识加油站:

Unity 高级一些的对象池(初版)(非基础警告)_unity 高级对象池-CSDN博客

        对象池也叫缓存池 是一个用于存储和拿出频繁销毁物体或对象的管理类

在大量且频繁创建与销毁的场景之中会用到,比如音效,子弹,大量敌人

5. 什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?

        知识加油站:这里挖个坑 关于shader基础知识的链接将会放在这里

        DrawCall就是 CPU 向 GPU 发送指令,要求 GPU 对一组图元(如三角形、四边形等)进行渲染的操作,每一次对图形api的调用都会产生一次drawcall

        如果大量的drawcall:

  • CPU 开销:每次 Draw Call 都需要 CPU 进行准备工作,如设置渲染状态、传递顶点数据、纹理数据等。大量的 Draw Call 会使 CPU 花费大量时间在这些准备工作上,从而减少了 CPU 用于处理游戏逻辑等其他重要任务的时间。
  • GPU 上下文切换:GPU 在处理不同的 Draw Call 时,可能需要切换渲染状态,如切换纹理、材质、着色器等。频繁的上下文切换会增加 GPU 的额外开销,降低渲染效率。
  • 带宽限制:Draw Call 需要在 CPU 和 GPU 之间传输数据,包括顶点数据、索引数据、纹理数据等。大量的 Draw Call 会导致数据传输量增大,可能会超出总线带宽限制,造成数据堵塞,影响渲染速度

        减少:

        1.对UI进行剔除:对于不在屏幕范围内或被其他 UI 遮挡的 UI 元素,不进行绘制,可以通过计算 UI 元素是否在视口内,以及使用遮挡剔除技术来实现,例如,在 Unity 中可以利用 Canvas Group 组件的 Alpha 值为 0 时自动进行剔除的特性,或者自定义脚本根据 UI 的可见性来控制是否渲染

       2. 对网格进行合批(动态 在一定程度上unity自动处理,但是有很大限制,可以自己编写脚本处理

        静态 只针对静态的物体,当勾选了static选项以后 unity会自动做处理)

        3. 对图片进行打图集        

       唐老师在unity核心之中讲过打图集相关内容

       也可以参考本篇Unity UGUI 之 图集_unity 图集-CSDN博客

AI补充:

  • 使用批处理渲染器:一些渲染器提供了批处理功能,如 URP(Universal Render Pipeline)中的 SRP Batcher。它可以在不改变材质和模型的情况下,对物体进行批处理,提高渲染效率。
  • 优化材质和着色器:尽量减少材质和着色器的复杂度,避免使用过多的变体。过多的材质变体和复杂的着色器计算会增加 Draw Call 的开销。可以通过合并相似的材质,减少不必要的纹理采样和计算来优化。

        

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

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

相关文章

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…

单片机中的flah和RAM

片机的 Flash 和 RAM 是两种关键的内存类型&#xff0c;分别用于存储程序代码和运行时数据。 Flash 存储器 用途&#xff1a;用于存储程序代码&#xff08;如固件&#xff09;和常量数据&#xff08;如查找表、字符串等&#xff09;。 特点&#xff1a; 非易失性&#xff1a;断…

【Pytest】setup和teardown的四个级别

文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中&#xff0c;setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…

单细胞marker基因表达密度图-(还有一个包装函数)

有小伙伴说想要做单细胞marker基因表达密度图&#xff0c;我一想&#xff0c;好像之前是做过的&#xff08;单细胞marker基因可视化的补充---密度图与等高线图&#xff09;。但是他又说没有文献中的效果。后来我一看&#xff0c;是因为着色的问题。其实用Nebulosa包&#xff08…

记忆化搜索与动态规划:原理、实现与比较

记忆化搜索和动态规划是解决优化问题的两种重要方法&#xff0c;尤其在处理具有重叠子问题和最优子结构性质的问题时非常有效。 目录 1. 记忆化搜索&#xff08;Memoization&#xff09; 定义&#xff1a; 实现步骤&#xff1a; 示例代码&#xff08;斐波那契数列&#xff0…

架构师面试(九):缓存一致性

问题 关于【数据库和缓存】一致性&#xff0c;下面哪几项是在线上生产环境中相对合理的处理方式&#xff1f; A. 对于查询操作&#xff0c;先查缓存&#xff0c;如果为空则查 DB&#xff0c;然后将数据带入缓存&#xff1b; B. 对于插入操作&#xff0c;只写 DB 即可&#…

Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】

文章目录 一.Spring Ai介绍1.0 认识Spring Ai1.1 特征1.1 大模型专业名字介绍1.1.1 RAG(检索增强生成)RAG 的基本原理RAG 的关键技术RAG 的优势RAG 的应用场景 1.1.2 fine-tuning(微调)1.1.3 function-call(函数调用) 1.2 创建简单的Spring Ai项目 二.Spring Ai简单的智能应用2…

OpenHarmony启动系统-U-Boot简介和源码下载与编译

OpenHarmony系统启动流程简述 设备上电后&#xff0c;OpenHarmony系统大致经历以下3个阶段&#xff1a; 1.BootRom代码引导加载UBoot&#xff1b; 2.UBoot启动初始化硬件资源&#xff0c;引导并加载系统内核(Linux内核)&#xff1b; 3.Kernel(LiteOs,Linux内核)启动、加载驱动…

Metal 学习笔记六:坐标空间

要在网格上轻松找到一个点&#xff0c;您需要一个坐标系。例如&#xff0c;如果网格恰好是您的 iPhone 15 屏幕&#xff0c;则中心点可能是 x&#xff1a;197、y&#xff1a;426。但是&#xff0c;该点可能会有所不同&#xff0c;具体取决于它所处的空间。 在上一章中&#xf…

Java测试框架Mockito快速入门

Mockito结合TestNG快速入门 什么是Mockito Mockito 是一个专门用于 Java 的强大测试框架&#xff0c;主要用来创建和管理模拟对象&#xff0c;辅助开发者进行单元测试&#xff0c;具有以下特点和功能&#xff1a; 创建模拟对象&#xff1a;能通过简洁的语法创建类或接口的模…

LabVIEW 无法播放 AVI 视频的编解码器解决方案

用户在 LabVIEW 中使用示例程序 Read AVI File.vi&#xff08;路径&#xff1a; &#x1f4cc; C:\Program Files (x86)\National Instruments\LabVIEW 2019\examples\Vision\Files\Read AVI File.vi&#xff09;时发现&#xff1a; ✅ LabVIEW 自带的 AVI 视频可正常播放 这是…

AI编程界的集大成者——通义灵码AI程序员

一、引言 随着软件行业的快速发展和技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;正在成为软件开发领域的一个重要组成部分。近年来&#xff0c;越来越多的AI辅助工具被引入到开发流程中&#xff0c;旨在提高效率、减少错误并加速创新。在这样的背景下&#xff0…

第三十三:6.3. 【mitt】 任意组件通讯

概述&#xff1a;与消息订阅与发布&#xff08;pubsub&#xff09;功能类似&#xff0c;可以实现任意组件间通信。 // 引入mitt import mitt from "mitt";// 创建emitter const emitter mitt()/*// 绑定事件emitter.on(abc,(value)>{console.log(abc事件被触发,…

6.7 数据库设计

文章目录 数据库设计6个阶段新奥尔良法完整导图 数据库设计6个阶段 数据库设计是指&#xff0c;根据应用环境&#xff0c;构造数据库模式&#xff0c;建立数据库、应用系统&#xff0c;实现有效地数据存储&#xff0c;以满足用户需求。 数据库设计过程包含6个阶段 数据库规划&…

Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)

文章目录 一、环境准备1.1 创建Vue3项目1.2 安装依赖1.3 配置Element Plus 二、文件上传实现2.1 基础上传组件2.2 自定义上传逻辑&#xff08;Axios实现&#xff09; 三、文件下载实现3.1 直接下载&#xff08;已知文件URL&#xff09;3.2 后端接口下载&#xff08;二进制流&am…

【云原生】SpringCloud-Spring Boot Starter使用测试

目录 Spring Boot Starter是什么&#xff1f; 以前传统的做法 使用 Spring Boot Starter 之后 starter 的理念&#xff1a; starter 的实现&#xff1a; ?创建Spring Boot Starter步骤 在idea新建一个starter项目、直接执行下一步即可生成项目。 ?在xml中加入如下配置…

介绍下pdf打印工具类 JasperPrint

JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类&#xff0c;其本质是 填充数据后的可打印报表对象&#xff0c;承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析&#xff1a; 一、核心定位与生命周…

idea中或pycharm中编写Markdown文件

参考 ltjt_aiseek: seek_backend_py 项目 数智科技ai探索API接口开发 1. 安装 Django 框架 在开始创建 Django 项目之前&#xff0c;需要先安装 Django 框架。可以通过 PyCharm 的终端或者系统的命令行工具来完成安装。 使用 PyCharm 终端安装 打开 PyCharm&#xff0c;如果…

Go红队开发—并发编程

文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…