自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(281)
  • 问答 (1)
  • 收藏
  • 关注

原创 Unity面经(自整)——移动开发与Shader

看下pass的次数与set pass 次数, pass 次数,比如阴影这些都会导致多次pass,多光源这些会导致多次pass, 我们可以通过定制渲染管线,优化shader代码, 优化光照计算等,从Shader+渲染管线级别来做好渲染优化,还有LOD优化。Flutter 是 Google 的开源工具包,用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序(一套代码跨平台构建app是它最大的优点),并且可以构建高性能、稳定和丰富UI的应用程序。应用主导的,由CPU实现。处理与要绘制的几何相关的事情。

2024-04-09 08:41:32 427

原创 Unity面经(自整)——C#基础

装箱指将值类型转换为引用类型拆箱指将引用类型转换为值类型。

2024-04-09 08:29:44 891

原创 Unity面经(自整)——Unity基础知识

由于欧拉角不同的 旋转顺序会导致不同的结果,如x-y-z和x-z-y,而欧拉角旋转就会造成万向锁现象,如果按照y轴旋转90度后,z轴也会跟着旋转与x轴重合,那么旋转z轴和x轴效果是一样的。物体丢失了一个自由度。那么可以把最不可能旋转90度的轴放在旋转顺序的中间。

2024-04-08 21:04:02 1031

原创 LeetCode 双指针专题

例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。输出:[[-1,-1,2],[-1,0,1]]

2024-03-30 10:29:42 865

原创 Unity Shader——透明效果

只要一个片元的透明度不满足条件,则直接被舍弃,否则按照不透明物体去进行深度测试和写入。:要么完全透明,看不到,要么完全不透明。透明度测试不需要关闭深度写入。

2024-03-28 10:09:03 269

原创 【Unity】Unity的生命周期(事件函数的执行顺序)

我们可以从官网上找到这样一张图:其实这张图上就很清楚的表示各个事件函数的执行顺序了。

2024-03-24 15:08:13 373

原创 LeetCode 搜索回溯专题

子集组合问题78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]class Solution {public: vector<int> sub = {};

2021-09-15 11:38:32 282

原创 C++之并发编程 第一章 C++并发多线程介绍

1.1 何为并发1.1.1 计算机系统中的并发单个系统中 “同时” 执行多个独立的任务。1.1.2 并发的途径多进程将应用程序分为多个独立的进程,它们同一时刻运行。进程间可以通过一些进程间通信方式(管道、信号、信号量、共享内存、消息队列、套接字等)进行信息传递。优点:操作系统在进程间提供附加的保护操作和更高级别的通信机制,编程简单;可以通过远程连接,在不同的机器上运行独立的进程。缺点:设置复杂、速度慢,运行多个进程需要的开销大。多线程在单个进程中运行多个线程。进程中的所有线程共享

2021-09-13 17:35:06 258

原创 Redis 设计与实现——对象

之前我们整理的内容是Redis用到的数据结构,但是Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。Redis 对象的类型与编码Redis使用对象来表示数据库中的键和值,当创建一个键值对时,我们至少会创建两个对象,即键对象和值对象。typedef struct redisObject { // 类型

2021-08-28 22:49:01 233

原创 Redis 设计与实现——跳跃表

跳跃表跳跃表概述跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。Redis 使用跳跃表作为有序集合键的底层实现之一: 如果一个有序集合包含的元素数量比较多, 又或者有序集合中元素的成员(member)是比较长的字符串时, Redis 就会使用跳跃表来作为有序集合键的底层实现。Redis 跳跃表的实现跳跃表是一种可以对有序链表进行近似二分查找的数据结构,redis 在两个地方用到了跳跃表,一个是实现有序集合,另一个是在集群节

2021-08-27 10:35:48 245

原创 C++ STL容器整理

STL有哪些容器?序列容器排序容器哈希容器迭代器序列容器array<T,N>(数组容器)vector<T>(向量容器)deque<T>(双端队列容器)list<T>(链表容器)forward_list<T>(正向链表容器)...

2021-08-22 22:26:34 96

原创 C++ 面试题目整理

C++的多态时如何实现的?C++之多态C++ 一篇搞懂多态的实现原理C++的智能指针C++之智能指针C++中 new 和 malloc 的区别C++中new和malloc的区别C++ 内存管理C++之内存管理C++ 类型转换C++之类型转换C++ 友元友元分为友元函数和友元类。友元函数:在友元函数内部可以访问该类对象的私有成员了。友元类:一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的private或protected成员

2021-08-18 18:36:15 89

原创 C++之多态

多态指的是同一名字的事物可以完成不同的功能,可以分为编译时的多态和运行时的多态。编译时的多态指:函数的重载(包括运算符的重载),对重载函数的调用在编译时就能根据实参确定应该调用什么函数。运行时的多态:与继承、虚函数等概念有关。当存在类的层次结构并且它们通过继承而相关时,就会发生多态性。通过虚函数进行实现。多态性意味着对成员函数的调用将导致不同的函数执行,这取决于调用函数的对象的类型。举个例子:#include <iostream>using namespace std;//

2021-08-18 18:35:44 160

原创 RabbitMQ

消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。AMQP 协议##AMQP 0-9-1 和 AMQP 模型高阶概述AMQP是什么什么是AMQP?AMQP 叫做高级消息队列协议,它是一个网络协议,支持符合要求的客户端应用和消息中间件代理之

2021-08-09 10:31:29 106

原创 Redis 设计与实现——字典

字典字典中,一个键key和一个值value关联起来,这称为键值对。字典中的每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 又或者根据键来删除整个键值对, 等等。Redis字典的实现Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。哈希表typedef struct dictht { dictEntry **table; // 哈希表数组 unsigned long

2021-08-05 17:57:05 192

原创 Redis 设计与实现——链表

链表链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现。redis> LLEN integers(integer) 1024redis> LRANGE integers 0 101) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"8) "8"9) "9"10) "10"11) "1

2021-08-05 14:29:45 112

原创 Redis 设计与实现——Redis简单动态字符串

Redis简单动态字符串Redis不直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(SDS)的抽象类型。而在Redis中,C字符串只会作为字符串字面量。redis> SET msg "hello world"OK那么 Redis 将在数据库中创建了一个新的键值对, 其中:键值对的键是一个字符串对象, 对象的底层实现是一个保存着字符串 "msg" 的 SDS 。键值对的值也是一个字符串对象, 对象的底层实现是一个保存着字符串 "hello world" 的 SDS

2021-08-05 14:06:25 116

原创 Linux内核设计与实现——第9章第10章 内核同步介绍与方法

内核同步介绍本章的意义何在?因为目前内核支持多处理器,所以共享资源一定要防止并发访问,如果多个执行线程同时访问和操作数据,就可能发生各线程之间相互覆盖共享数据情况,造成被访问数据处于不一致状态,因此我们要了解Linux内核如何解决同步问题和防止产生竞争条件。1 临界区和竞争条件临界区:访问和操纵共享数据的代码段。为了避免在临界区中并发访问,我们必须保证这些代码原子地执行,即操作在执行结束前不可被打断。但是如果发生两个执行线程处于同一个临界区中同时执行,就称为 竞争条件 ,这种情况可能会导致错误,

2021-06-16 17:19:51 93

原创 Linux内核设计与实现——第七章 中断和中断处理

为什么要有中断机制?计算机有很多的硬件设备,如硬盘、键盘、鼠标等,操作系统需要对这些硬件设备进行管理,然而处理器的速度和外围硬件设备的速度往往不在一个数量级上。如果内核让处理器向硬件发出一个请求,然后专门等待回应,性能会很差。内核应该在此期间处理其他事务,等到硬件真正完成请求的操作后再回头对它进行处理。因此,采用一种机制让硬件在需要的时候向内核发出信号。1 中断中断本质就是一种特殊的电信号,由硬件发向处理器。内核随时可能因为新到来的中断被打断。不同设备对应的中断不同,每个中断都通过唯一的一个数字标识

2021-06-13 17:51:41 149

原创 Linux内核设计与实现——第五章 系统调用

主要介绍Linux系统调用的规则和实现方法。1 与内核通信系统调用在用户空间进程和硬件设备之间添加一个中间层,其作用有:为用户空间提供了一种硬件的抽象接口系统调用保证系统的稳定和安全在Linux中,系统调用是用户空间访问内核的唯一手段,也是除异常和陷入外,内核唯一的合法入口。2 API、POSIX 和 C 库一般情况,应用程序通过API而不是直接通过系统调用编程。而最流行的应用编程接口是基于POSIX标准,是由IEEE的一组标准组成,目标是提供一套大体上基于Unix的可移植操作系统标

2021-06-01 21:02:08 116

原创 LeetCode 前缀和问题

一维前缀和连续子数组问题很多连续子数组问题都可以使用一维前缀和进行解决,1、连续子数组和问题给定一个数组和目标值,求连续子数组的和等于目标值的个数。数组中的值都大于0这种题就比较简单,可以使用双指针来判断。def solve(nums, target): n = len(nums) if n == 0: return 0 if target == 0: #如果都为正数,不可能和为0 return 0 l, r = 0,0 #

2021-06-01 10:06:35 344

原创 LeetCode 动态规划专题

这是整理的LeetCode上的动态规划专题,按照codeTop上的频率顺序从高到低进行整理并按照别人整理的再次整理。

2021-06-01 10:02:49 117

原创 LeetCode 链表专题

这是整理的LeetCode上的链表专题,按照codeTop上的频率顺序从高到低进行整理。

2021-06-01 10:01:45 187

原创 LeetCode 二分专题

这是整理的LeetCode上的二叉树专题,先按照codeTop上的频率顺序从高到低进行整理,然后按别人整理的进行再次整理。

2021-06-01 10:00:16 203

原创 LeetCode 二叉树专题

这是整理的LeetCode上的二叉树专题,按照codeTop上的频率顺序从高到低进行整理。

2021-06-01 09:53:24 145

原创 LeetCode 位运算专题

477. 汉明距离总和两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.在计算汉明距离时

2021-05-28 10:06:45 67

原创 LeetCode 字符串专题

字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式// 模拟整数相加class Solution {public: string addStrings(string num1, string num2) { string.

2021-05-27 11:12:37 81

原创 C++之类型转换

类型转换隐式转换先根据类型转换规则将运算对象的类型统一后再求值。算术转换:把一种算术类型转换成另一种算术类型。整型提升:将小整数类型转换成较大的整数类型。显式转换显式地将对象强制转换成另一种类型。命名的强制类型转换 cast-name<type>(expression); 其中,type为转移的目标类型,expression是要转移的值,cast-name是static_cast, dynamic_cast, const_cast, reinterpret_cast的一种。sta

2021-05-25 10:50:07 79

原创 C++ 内存管理

我查了一些资料发现C++内存结构有如下两种说法:栈、堆、全局或静态区、常量区、代码区栈、堆、全局或静态区、常量区、自由存储区两种说法的区别在于代码区和自由存储区,而实际上自由存储区我们可以假定它和堆区没有本质的区别,但是需要知道:堆区是操作系统维护的一块内存,其由程序员自己创建并维护,使用C语言中的malloc 库函数 就可以从堆上动态分配内存;而到了C++我们有一种 关键字 叫做 new ,它是在自由存储区上为对象动态分配内存,它完成两件事,首先底层调用malloc分配内存,然后调用构造函

2021-05-25 10:44:21 56

原创 C++之智能指针(shared_ptr, unique_ptr, weak_ptr)

动态内存与智能指针C++动态内存是通过new(在堆中为对象分配空间并返回一个指向该对象的指针)和delete(接受一个动态对象指针并销毁它释放内存)完成。使用动态内存容易出问题:会忘记释放内存从而内存泄漏在还有指针引用内存时候就释放了它从而产生引用非法内存的指针。C++11 提供了两种智能指针类型来管理动态对象。它与普通指针类似,只是它负责自动释放所指向的对象。shared_ptr类多个指针指向同一个对象,当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr类会

2021-05-25 10:17:59 135 1

原创 高性能MySQL——第五章 创建高性能的索引

什么是索引?索引在MySQL中也叫作“键 key”,它是存储引擎用于快速找到记录的一种数据结构。当表中数据量越来越大,索引就非常重要!!索引优化是对查询性能优化最有效的手段(可以提高几个数量级)。索引基础索引就像一本书的目录,想要理解索引,最简单的方法就是去看看《高性能MySQL》这本书的“索引”部分,找到对应的页码。在MySQL中,存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。对于这段sql语句查询:SELECT first_name FR

2021-05-24 21:10:12 113

原创 手撕排序

快排void quick_sort(vector<int>& nums, int l, int r){ if(l < r){ int i = l, j = r; while(i < j){ while(i < j && nums[j] >= nums[l]) --j; // nums[l] 作为分界 while(i < j && num

2021-05-12 13:39:38 92

原创 Linux内核设计与实现——第四章 进程调度

调度程序负责决定将哪个进程投入运行,何时运行和运行多长时间。进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。多任务多任务操作系统就是能同时并发地交互执行多个进程的操作系统。多任务系统分类两类:非抢占式多任务除非进程自己主动停止运行,否则它会一直执行。进程主动挂起称为“让步”抢占式多任务在此模式下,由调度程序来决定什么时候停止一个进程的运行。这种强制的挂起动作叫“抢占”。进程被抢占前有一个预先设置好的时间——进程的时间片,它是分配给每个可运行进程的处理器时间段

2021-05-11 17:29:10 117

原创 LeetCode 异或题

首先介绍一下异或运算:异或的一些性质:x XOR y = z,那么 x = y XOR z。x XOR x = 0x XOR 0 = x1720. 解码异或后的数组未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 a

2021-05-11 09:56:43 294

原创 高性能MySQL——第三章服务器性能剖析

常见的三个性能相关的服务请求:如何确认服务器是否达到了性能最佳的状态找出某条语句为什么执行不够快诊断被用户描述成“停顿”、“堆积”或者“卡死”的某些间歇性疑难故障事实证明,可以通过一种简单的方法来发现一些苗头:专注于测量服务器的时间花费在哪,使用的技术是 性能剖析 。性能优化简介这里将性能定义为:完成某件任务所需的时间度量,即响应时间。性能优化假设就是在一定的工作负载下尽可能降低响应时间。如果目标是降低响应时间,那么就需要理解为什么服务器执行查询需要这么多时间,然后去减少或者消除那些对

2021-05-10 20:44:46 93

原创 高性能MySQL——第二章 MySQL 基准测试

基准测试是针对系统设计的一种压力测试,通常目标是为了掌握系统的行为。为什么要基准测试?验证基于系统的一些假设,确认这些假设是否符合实际情况。重现系统中的某些异常行为,以解决这些异常。测试系统当前运行情况。如果不清楚系统当前的性能,就无法确认某些优化的效果如何。也可以利用历史的基准测试结果来分析诊断一些无法预测的问题。模拟比当前系统更高的负载,以找出系统随着压力增加而可能遇到的扩展性瓶颈。规划未来的业务增长。测试应用适应可变环境的能力。测试不同的硬件、软件和操作系统配置。证明新采购的设备配

2021-05-10 19:14:54 67

原创 高性能MySQL——第一章 MySQL 架构与历史

本章主要了解:MySQL的服务器架构各种存储引擎之间的主要区别这些区别的重要性MySQL 逻辑架构一共三层服务:最上层并不是MySQL独有,大多基于网络的客户端/服务器的工具或服务都有类似架构。第二层包含了大多数MySQL的核心服务功能。包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图。第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信,存储

2021-05-09 20:21:28 211 4

原创 Linux内核设计与实现——第三章 进程管理

进程定义何为进程?就是处于执行器的程序。但不仅仅局限于一段可执行程序代码,通常还包括其他资源,如打开的文件、挂起的信号、内核内部数据、处理器状态、一个或多个具有内存映射的内存地址空间及一个或多个执行线程,还包括用来存放全局变量的数据段等。(即 程序不是进程,进程是处于执行期间的程序及相关资源的总称)何为线程?执行线程就是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程。对于Linux而言,线程和进程并不区分,可以说线程只不过是一种特殊的

2021-05-08 21:36:03 124

原创 Spark(Python版)——Spark概述

Spark 概述运行速度快容易使用Spark本质上计算模式也是MapReduce,但是操作不局限于Map和Reduce两个操作,提供了更多的操作类型。而且Spark会存储在内存中,磁盘IO开销很小。Spark 生态系统大数据处理主要包括:复杂的批量数据处理基于历史数据的交互式查询基于实时数据流的数据处理过去我们需要同时部署三种不同的软件,如MapReduce、Impala、Storm会存在如下问题:不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换。不同的软件

2021-05-08 19:41:59 4683 2

原创 LeetCode 滑动窗口专题

3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的

2021-05-05 21:37:52 107 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除