Unity精华☀️ 面试“堆栈”误区!这样做可能反而会降低吸引力。

Posted 橙子SKODE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity精华☀️ 面试“堆栈”误区!这样做可能反而会降低吸引力。相关的知识,希望对你有一定的参考价值。

哈喽大家好,你的橙哥突然出现~

本系列博客地址:传送门

关注橙哥的小老弟们都知道,我常说的一句话就是,好东西是吸引来的,而不是去追来的。工作也是。

所以大家开始越来越重视提高自身价值这件事了。

 

这本来是一件好事,橙哥也感到挺欣慰的。

但是有一说一啊,用力方向也要选对,否则有时候往往会起反效果啊。

 

有个小老弟跟我说,我已经抓紧一切机会在面试官面前展示自己了呀,看网上教程能背的都背了,怎么感觉他反而有点儿冷淡,不那么热情呢?到底是哪里出了问题?

 

那今天借着“堆、栈”这个机会,盘一盘怎样让面试官眼前一亮,

一起来看看吧。

 

一、面试是提供对方想要的

首先我们要知道,面试是提供给对方价值,而不是索求价值。

 

曾经我用了两周的时间,做了一个手工品当做节日礼物,

手磨起了泡,对方却从没有戴过

 

有次对方生日,我用了几十块钱,挑了一个对方喜欢的玩具,

结果对方发了朋友圈,并把玩具摆在展示柜😳

 

橙哥几周的打磨竟然比不上淘宝的几十块钱,就离谱

由此可见想让对方眼前一亮,提供对方喜欢的才是关键。

那面试官为什么要问堆、栈呢?

 

 

二、了解你的基础知识储备量

1、堆、栈是什么

栈:全称是线程堆栈 ,栈空间比较小,但是读取速度快。

堆:全称是托管堆,堆空间比较大,但是读取速度慢。


栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。


栈是一片连续的内存域,由系统自动分配和维护。存放在栈中时要管确定存储顺序,保持着先进后出的原则。

堆是无序的,它是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,系统将会通过垃圾回收器(GC)来回收。

 

堆只有一种,表示堆内存

而栈有两种

  • 一种是上面说的与堆对应的栈内存
  • 另一种是与队列(Queue)对应的数据结构Stack<T>

 

2、值类型和引用类型在堆上,还是在栈上?

 C#中类型被分为两种:

  • 值类型(整数,小数,bool,struct,char )
  • 引用类型(string,数组,自定义的类,内置的类)

 

值类型:

只需要一段内存,用于存储实际的数据,存放在栈上

 

引用类型:

需要两段内存,第一段存储实际的数据,位于堆中,第二段是一个引用,指向数据在堆中的存放位置。即值存在堆上,栈上存引用

 

值类型和引用类型赋值的区别:

  • 将一个值类型变量赋值给另一个值类型变量时,将赋值包含的值
  • 引用类型变量的赋值只复制对象的引用,而不复制对象本身。

 

 

三、顺带学一下怎样使用堆栈:Stack类

Stack (栈)是常见的数据结构之一,栈是一种先进后出的结构,即元素从栈的尾部插入,从栈的尾部移除,类似于日常生活中搬家的时候装车,先装上车的东西要后拿下来。

 

Stack 类的方法和属性

属性描述
Count获取 Stack 中包含的元素个数。

下表列出了 Stack 类的一些常用的方法:

序号方法名 & 描述
1public virtual void Clear();
从 Stack 中移除所有的元素。
2public virtual bool Contains( object obj );
判断某个元素是否在 Stack 中。
3public virtual object Peek();
返回在 Stack 的顶部的对象,但不移除它。
4public virtual object Pop();
移除并返回在 Stack 的顶部的对象。
5public virtual void Push( object obj );
向 Stack 的顶部添加一个对象。
6public virtual object[] ToArray();
复制 Stack 到一个新的数组中。

 

实例

下面的实例演示了堆栈(Stack)的使用:

    void Start()
    {
        Stack st = new Stack();

        st.Push('A');
        st.Push('M');
        st.Push('G');

        print("Current stack: ");
        foreach (char c in st)
        {
            print(c);
        }
    }

 

当你在面试时,回答道这儿,

面试官的印象可能会是基础扎实,是个认真的同学

更进一步,要达到惊才艳艳,

那还需要让他觉得,你是他面试过这么多人中,最出色的。

 

那怎样打败和你竞争的人呢?

那是不是应该给面试官想要的感觉:能干活呢?

  • 你用过这个东西,能解决他项目中的问题
  • 你流利的的说出来了,表达清晰,有自信,让他感觉这活交给你靠谱

那下面这个栈在Unity项目中的应用,可能会给你带来帮助 👇

 

 

四、了解你的项目经验

在《设计模式》“命令模式”一节(传送门),我们使用 Stack<> 实现了游戏回放功能。

 

回放演示效果如下:

点击录制后,使用WASD操作cube移动,

点击回放后,cube自动运动,演示回放。

 

我们能看到,使用栈的思路是:

将之前的操作步骤存到栈中,

在回放时,拿出之前存的数据,将这些命令执行到被操作的物体上,完成回放操作。

 

根据栈的先进后出的特性,我们要知道,

栈的不仅可以应用在回放上,我们也能把它用在:

  • PS的撤销、重做上
  • 画画的撤销、重做上
  • UI页面的上一页、下一页、返回上。。。

 

 

感兴趣的同学可以做一下《设计模式》一节的功能哦

好啦,本节分享就到这儿了,有其他问题在下方留言~

 

如果你有技术上的问题或困扰

都可以加我的vx(skode250)

和我聊一聊你的故事🧡

以上是关于Unity精华☀️ 面试“堆栈”误区!这样做可能反而会降低吸引力。的主要内容,如果未能解决你的问题,请参考以下文章

Unity精华☀️ 哥哥,你会这么多「设计模式」,面试官会心疼你吧

Unity精华☀️ 哥哥,「设计模式」能解决游戏回放呀,你尝一口!

Unity精华☀️到底是什么原因导致“万向锁”?旋转翻车的终极解析!

Unity精华☀️四元数(Quaternion)解决万向锁

Unity精华☀️GetInstanceID 和 GetHashCode 的区别

Unity精华☀️GetInstanceID 和 GetHashCode 的区别