• 问题朋友【第二季】——八月打卡帖


    Leetcode

    数组

    【简单】121. 买卖股票的最佳时机 (一点点动态规划)

    字符串

    【简单】409. 最长回文串

    链表

    【中等】148. 排序链表 (二分法排序、快慢指针)

    【简单】589. N 叉树的前序遍历
    【中等】102. 二叉树的层序遍历

    二分法

    【简单】704. 二分查找
    【简单】278. 第一个错误的版本

    排序

    【中等】56. 合并区间
    【简单】27. 移除元素

    知识点回顾

    协程 Coroutines

    协程(Coroutines)是一种比线程更加轻量级的存在。一个操作系统中可以有多个进程;一个进程可以有多个线程;同理,一个线程可以有多个协程
    协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,跟多线程类似,有类似异步的效果,但不是真正的异步【但是看到好多地方都说是异步】。

    协程的优点:

    1. 有大量IO操作的情况下,用协程替换线程,降低系统内存,减少切换线程开销,性能提升。
    2. 只有一个线程,不需要多线程的锁机制,在协程中控制共享资源不加锁,只需要判断状态,执行效率高。

    协程的缺点:

    1. 本质是单核的,不能同时利用单CPU多核,协程需要和进程配合才能运行在多CPU上;
    2. 协程阻塞,会阻塞整个线程;
    3. 本质是迭代器,是基于unity的生命周期的,会引起GC,多个高开销的协程在同一帧执行导致卡顿。

    注意:

    1. 协程调用阻塞IO操作的时候,操作系统会让线程进入阻塞状态,当前的协程和其它绑定在该线程之上的协程都会陷入阻塞而得不到调度(因此在协程中尽量不要调用阻塞IO的方法,比如打印,读取文件,Socket接口等,除非改为异步调用的方式)。处理在协程中调用阻塞IO的操作:
      (1)在调用阻塞IO操作的时候,重新启动一个线程去执行这个操作,等执行完成后,协程再去读取结果;
      (2)对系统的IO进行封装,改成异步调用的方式。
    2. 协程对计算密集型的任务也没有太大的好处,计算密集型的任务本身不需要大量的线程切换,因此协程的作用也十分有限,反而还增加了协程切换的开销。

    yield() 方法和 sleep() 方法有什么区别?

    1. 调用 yield 方法,线程让出剩余的时间片,没有被阻塞挂起,处于就绪状态,线程调度器下一次可能会调度到当前线程。
    2. 调用 sleep 方法,被阻塞进入超时等待状态,在这期间线程调度器不会去调度该线程。

    什么是协程?
    C#协程的用法
    C# 协程 在 Unity中的应用
    Unity C# 协程:(开始一个协程、停止一个协程、优化协程、协程中yield的用法)

    C#的委托和事件

    1. 委托的本质就是一个密封类,是引用类型,这个类继承了MulticastDelegate(多播委托:一个委托可以代表多个相同签名的方法,当委托被调用时,这些方法会依次执行)
    2. 委托的构造函数,有两个参数,一个类型是IntPtr,用来接收方法的(IntPtr表示窗口的时候,叫“句柄”,表示方法时,叫“指针”)
    3. 可以同步调用(Invoke),也可以异步调用 (BeginInvoke、EndInvoke)
    4. 委托将方法以变量的形式传递,并且以方法的形式执行
    5. 委托的三种形式
      (1)delegate: 四步(声明,实例化,注册方法,调用)
      (2)Action:添加的方法不能有返回值
      (3)Func: 添加的方法要有返回值
      (4)lamda表达式:方法只使用一次,没有多次使用的话使用
    1. 事件是功能被限制的一个委托变量,它的类型是委托类型。是一种特殊的委托,他的调用和委托是一样的。
    2. 事件是基于委托的,为委托提供了一个发布/订阅机制。

    区别:

    1. 事件只能在方法的外部进行声明,而委在方法的外部和内部都可以声明。
    2. 事件只能在类的内部触发,不能在类的外部触发。而委托在类的内部和外都都可以触发。
    3. 委托一般用于回调,而事件用于外部接口。

    一篇文章彻底搞清楚c#中的委托与事件
    C#委托与事件

    Unity 碰撞器和触发器

    要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器(Collider)。

    1. 刚体可以让物体在物理影响下运动。
    2. 碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

    碰撞检测方法

    1. 利用触发器:IsTrigger属性
    2. 利用碰撞器:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等

    注意点

    1. 碰撞体主要由2个组件完成:刚体 + 碰撞体(它可以是触发器Trigger)
    2. 物体发生碰撞的必要条件:两个物体都必须带有碰撞器,其中一个物体还必须带有Rigidbody刚体
    3. 可以简单地认为,带有Rigidbody的碰撞的产生体,而带有Collider是碰撞的接受体。
    4. 带有Rigidbody必须带有一个Collider,碰撞是针对Collider的,Rigidbody只是标记了某个物体是一个能够产生碰撞的物体。

    碰撞器和触发器的区别

    1. Collider是Trigger的载体,Trigger只是Collider上的一个属性。
    2. Collider是一个实体,是有体积的,Collider之间无法穿插,会弹开;Trigger是虚体,可以穿插。
    3. 发生条件不同:
      (1)碰撞:双方都有碰撞器、至少一个带刚体;
      (2)触发:双方都有碰撞器、至少一个带刚体、至少有一个勾选了触发器。
    4. 回调方法不同:
      (1)碰撞OnCollisionEnter,参数包含了碰撞两物体的详细信息,如碰撞点的位置、法线、碰撞点数量;
      (2)触发OnTriggerEnter,参数只有进入触发区域物体的Collider组件信息。

    当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
    当IsTrigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

    碰撞器和触发器(Unity)
    Unity碰撞器和触发器的总结

  • 相关阅读:
    SpringCloud中的分布式锁用法详解(Java+Redis SETNX命令)
    Cannot read property ‘pickAlgorithm‘ of null
    Leetcode刷题详解——二分查找
    一个命令下载Windows的所有pdb
    【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
    erlang练习题(三)
    ISP图像信号处理——平场校正介绍以及C++实现
    模式识别与人工智能(程序与算法)系列讲解 - 总目录
    【动态规划】动态规划经典例题 力扣&牛客
    MR混合现实实训系统为农学情景实训教学演练
  • 原文地址:https://blog.csdn.net/weixin_44013557/article/details/126095790