自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 《RabbitMQ实战指南》读书笔记

第一章 RabbitMQ简介1.1 什么是消息中间件消息(message)是指在应用间传递的数据。消息队列中间件(Message Queue MidMiddleware,简称MQ),是指提供平台无关的、高效可靠的消息传递机制的中间件。MQ通常又两种传递模式:点对点模式(P2P, Point-To-Point):即一对一模式。该模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。发布/订阅模式(Pub/Sub):即一对多模式。发布订阅模式

2024-03-05 13:45:19 651

原创 全链路监控

当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,全链路监控组件就在这样的问题背景下产生了。

2024-03-05 13:03:40 938

原创 分布式缓存

反向代理缓存可以缓存原始资源服务器的资源,而不是每次都要向原始资源服务器请求数据,特别是一些静态的数据,比如图片和文件,很多Web服务器就具备反向代理的功能,比如Nginx。假设更新操作先删除了缓存,此时正好有一个并发的读操作,没有命中缓存后从数据库中取出老数据并且更新回缓存,这个时候更新操作也完成了数据库更新。FIFO通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。

2024-03-05 11:53:18 1020

原创 《Unity Shader 入门精要》第10章 高级纹理

在图形学中,是环境映射 (Environment Mapping) 的一种实现方法。和之前见到的纹理不同,立方体纹理一共包含了6张图像,这些图像对应了一个立方体的6个面,立方体纹理的名称也由此而来。立方体的每个面表示沿着世界空间下的轴向(上、下、左、右、前、后)观察所得的图像。对立方体纹理采样我们需要提供一个三维的纹理坐标,这个三维纹理坐标表示了我们在世界空间下的一个3D方向。

2023-04-19 18:47:36 589

原创 《Unity Shader 入门精要》第9章 更复杂的光照

第9章 更复杂的光照9.1 Unity 的渲染路径在 Unity 中,渲染路径(Rendering Path)决定了光照是如何应用到 Unity Shader 中的。Unity 支持以下几种渲染路径:前向渲染路径(Forward Rendering Path)延迟着色渲染路径(Deferred Shading rendering path)旧版延迟渲染路径(Legacy Deferred rendering path)顶点光照渲染路径(Vertex Lit Rendering Path)

2023-04-11 22:17:23 583 1

原创 《Unity 入门精要》第8章 透明效果

透明效果

2023-01-31 11:59:41 2074 1

原创 《Unity Shader 入门精要》 第7章 基础纹理

基础纹理应用

2023-01-29 23:42:44 479

原创 《Unity Shader 入门精要》第6章 Unity 中的基础光照

Unity 基础光照模型

2023-01-23 21:00:37 1678

原创 《 Unity Shader 入门精要》第5章 开始 Unity Shader 学习之旅

Unity Shader 入门

2023-01-19 22:13:44 1775

原创 《 Unity Shader 入门精要》 第3章 Unity Shader 基础

Unity ShaderLab 基础

2023-01-16 15:48:44 563

原创 《Unity Shader 入门精要》第2章 渲染流水线

渲染管线基础概念

2023-01-15 23:15:48 546

原创 mac配置GLSL(OepnGL Shading Language)开发环境

由于xcode过于臃肿,不利于日常学习使用,所以本文采用vscode作为IDE。1 安装vscode前往vscode官网下载安装即可。2. vscode 安装Shader languages support for VS Code扩展如下在vscode扩展商店中搜索相关插件并安装:3. 安装 glsl-canvas扩展此插件主要用于展示预览我们的GLSL着色器。4. 安装配置GLSL Lint此插件主要用于代码提示以及错误检查。4.1 安装vscode插件4.2 配置glslang

2021-07-28 14:16:46 1108

原创 go语言规范 阅读笔记

引言这是一份阅读Go语言手册的读书笔记。Go语言中文手册可见Go中文手册。Go是一种强类型化的语言,具有垃圾回收机制,并显式支持并发编程。 程序由包构造,以此来提供高效的依赖管理功能。当前实现使用传统的“编译-链接”模型来生成可执行的二进制文件。词法元素注释注释与C++一致,有如下两种形式:行注释 以// 开始,至行尾结束。一条行注释视为一个换行符。块注释 以 /* 开始,至 */ 结束。 块注释在包含多行时视为一个换行符,否则视为一个空格。注释不可嵌套。标记标记构成Go语言的词汇,

2021-05-08 13:46:18 190 2

原创 《linux命令行与shell脚本编程大全》 读书笔记

第一章 初识linux shell1.1 什么是linuxLinux可划分为四部分Linux内核GNU工具图形化桌面环境应用软件1.1.1深入探究Linux内核Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。内核主要负责以下四种功能:系统内存管理软件程序管理硬件设备管理文件系统管理1.系统内存管理操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在

2021-04-26 15:20:57 294

原创 git学习笔记

起步关于版本控制系统什么是版本控制系统?版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本

2019-05-15 15:29:03 423

原创 解决windows"必须键入文件名"的问题

最近在学习git的使用要在本地建一个“.gitignore”的文件。但是如果用新建的txt文件进行改名,会弹出错误“必须键入文件名”(因为系统判定文件名中只有后缀),如下图:然后就试了下命令行直接生成文件,发现是可行的,特此记录。windows cmd/powershell 有两种命令生成文件,如下:echo some-text > filename.txtfsutil file...

2019-04-28 17:38:44 8344

原创 设计模式学习总结:原型模式(Protetype)

1.场景分析2.意图用原型实例指定创建对象的类型,并且通过拷贝这些原型创建新的对象。3.适用性当一个系统应该独立于它的产品创建、构成和表示时。当要实例化的类是在运行时刻指定时,例如动态加载。为了避免创建一个与产品类层次平行的工厂类层次时。当一个类的实例只能有几个不同状态组合中的一种时。4.结构5.优缺点优点:可以在运行时刻增加和删除产

2018-01-12 17:17:09 351

原创 设计模式学习总结:生成器模式(Builder)

1.场景分析2.意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。3.适用性在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配模式时。当构建过程必须允许被构建的对象有不同的表示。4.结构 Director:构建一个使用Builder接口的对象。 Builder:为创建一个Product对象的各个部件指定抽象接口。 C

2018-01-12 12:04:43 360

原创 设计模式学习总结:模板方法模式(Template Method)

1.场景分析茶和咖啡是两种饮料,但是它们的冲泡方法十分相似,冲泡方法如下。 茶:把水煮沸->沸水浸泡茶叶->把茶倒进杯子->加柠檬 咖啡:把水煮沸->用沸水冲泡咖啡->把咖啡装进杯子->加糖和牛奶 用代码来实现咖啡和茶,如下:class Coffee{public: //准备一杯咖啡 void prepareRecipe() { boilWater(

2017-12-18 15:45:23 218

原创 设计模式学习总结:外观模式(Facade)

1.场景分析如下图所示,我们有一个家庭影院系统,其中包含了调音器、扩音器、播放器、剧场光、爆米花机等部分: 然后我们模拟使用这个系统来播放一部电影,则我们需要进行一下操作://打开爆米花机,开始爆米花popper.on()popper.pop()//调灯光lights.dim(10)//把屏幕放下screen.down()//打开投影机projector.on()projector

2017-12-18 10:54:10 237

原创 设计模式学习总结:状态模式(State)

1.场景分析假如我们需要为一家糖果公司制作一个糖果机。糖果机的运行机制如下面的状态图所示: 从图中我们知道,状态机有四个状态:没有25分钱、有25分钱、售出糖果、糖果售罄。所以我们可以通过一个枚举类型来定义每个状态: enum class MachineState { SOLD_OUT, NO_QUARTER, HAS_QUARTER,

2017-12-14 17:45:55 255

原创 设计模式学习总结:适配器模式(Adapter)

1 场景分析假设我们先有一个鸭子类型如下:class Duck{public: virtual void quack() = 0; virtual void fly() = 0;};class MallardDuck : public Duck{public: void quack() override { cout << "mallard

2017-12-11 09:52:27 186

原创 设计模式学习总结:命令模式(Command)

1.意图将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化,并可以对请求排队或者记录请求日志,以及支持可撤销的操作。2.适用性需要抽象出待执行的动作以参数化对象。你可以用过程语言中的回调函数来表达这种参数机制。在不同的时刻指定、排列和执行请求。支持取消操作。支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。用构建在原语操作上的高层操作构建一个系统。3.结构 Comman

2017-12-08 15:33:05 224

原创 设计模式学习总结:单例模式(Singleton)

意图保证类只有一个实例,并提供一个访问它的全局访问点。适用性当类只能有一个实例而且客户可以通过一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类可扩展时结构优缺点优点1>对唯一实例的受控访问。因为singleton类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 2>缩小名空间。singleton是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名空间。

2017-11-09 20:09:49 169

原创 设计模式学习总结:抽象工厂(Abstract Factory)

意图提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。适用性一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只是想显示它们的接口而不是实现时。结构优缺点优点1>它分离了具体的类。因为一个工厂封装了创建产品对象的责任和过程,它将客户和类的实现分离。客户通

2017-11-04 18:36:11 361

原创 设计模式学习总结:工厂方法(Factory Method)

意图定义一个用于创建对象的接口,让子类来决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。适用性当一个类不知道它所必须知道创建的对象的类的时候。比如一家披萨店,店内供应很多种披萨,所以底层有两个抽象类PizzaStore, Pizza,PizzaStore会生产披萨,但是由于披萨种类很多,PizzaStore只知道创建一块披萨,但是不知道具体创建哪一种披萨。当一个类希

2017-11-03 18:07:11 271

原创 设计模式学习总结:装饰者模式(Decorator Pattern)

意图动态地给一个对象添加一些额外的职责,就增加功能而言,其比继承更为灵活。适用性在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。处理那些可以撤销的职责当不能采用继承进行扩展时结构 Component为被装饰对象,Decorator为装饰类。优缺点优点1> 比静态继承更灵活。Decorator模式提供了更加灵活的向对象添加职责的方法。可以用添加和分离的方式,用装饰在运行时增加

2017-11-02 22:13:11 268

原创 设计模式学习总结:观察者模式(Observer Pattern)

意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所以依赖于它的对象都得到通知并被自动更新。适用性当一个抽象对象有两个方面,其中一个方面依赖于另一个方面。将这两者封装在两个独立的对象中使它们可以被独立地改变与复用。当对一个对象的改变同时需要改变其他对象,而不知道具体有多少对象有待改变时。当一个对象必须通知其他对象而它又不能假定其他对象是谁时。结构 Subject为观察目标,

2017-11-02 14:49:23 290

原创 设计模式学习总结:策略模式(Strategy Pattern)

意图定义算法族,将它们分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于算法的客户。适用性许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。需用使用一个算法的不同变体算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。则可以将相关的条件

2017-10-31 14:23:24 203

原创 面向对象设计原则总结

1.封装变化2.少用继承,多用组合3.针对接口编程,不针对实现编程4.为交互对象之间的松耦合设计而努力5.类应该为扩展开发,对修改关闭6.依赖抽象,不要依赖具体类7.只和朋友交谈8.别找我,我会找你9.类应该只有一个改变的理由

2017-10-31 11:38:31 299

原创 《C++ Primer》读书笔记 第16章:模板与泛型编程

模板是C++中泛型编程的基础。一个模板就是创建一个类或者函数的蓝图或者说公式。16.1 定义模板16.1.1 函数模板定义模板定义以关键字template开始,后跟一个模板参数列表。在模板定义中,参数列表不能为空。template <typename T>int compare(const T &v1, const T &v2){ ...}实例化函数模板当我们使用一个函数模板时,编译器

2017-06-15 10:36:29 462

原创 《C++ Primer》读书笔记 第13章:拷贝控制

当定义一个类时,我们显式或者隐式地指定此类型的对象拷贝、移动、赋值和销毁时做什么,一个类通过定义五个特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数。我们称这些操作为拷贝控制操作。通常实现拷贝控制操作最困难的地方是首先认识到什么时候需要定义这些操作。13.1拷贝、赋值与销毁13.1.1拷贝构造函数  如果一个构造函数的第一个参数是自身类类型的引

2017-06-13 20:55:26 269

原创 《C++ Primer》读书笔记 第14章:重载运算与类型转换

14.1基本概念  重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。 重载运算符有以下几个要遵守的原则:重载运算符函数的参数数量与该运算符作用的运算对象数量一样多(比如重载加号运算符,则参数个数应该为两个)。除了重载函数调用运算符()之外,其他的重载运算符函数均不能含有默认形参。如果一个重载运算符函数是类的成员函数,则它的第一个运算对象(即

2017-06-13 20:22:04 376

原创 《C++ Primer》读书笔记 第7章:类

7.1 定义抽象数据类型定义成员函数  成员函数必须在类的内部声明,但是成员函数体可以定义在类内也可以定义在类外。成员函数通过一个名为this的额外隐式参数来访问它的那个对象。所以所有的非static成员函数都有一个隐式参数this指针,this指针是一个指针常量,我们不允许改变this指针中保存的地址。而且该this指针是作为成员函数的第一个形参。 class Test {

2017-06-13 17:25:58 228

原创 《C++ Primer》读书笔记 第6章:函数

6.1 函数基础我们通过调用运算符来执行函数。调用运算符的形式是一对圆括号。它作用于一个表达式,该表达式是函数或者指向函数的指针。 执行函数的第一步是定义并初始化函数的形参。 return语句用于返回值,并将控制权从被调函数转移回主调函数。 尽管函数调用过程中,实参和形参存在对应关系,但是并没有规定实参的求值顺序,编译器可以以任意可行的顺序对实参求值。要特别注意此点。 函数的形参列表可以为空

2017-06-13 16:37:06 340

原创 《C++ Primer》读书笔记 第5章:语句

前面一些简单的知识点略过swtich语句case关键字和它对应的值一起被称为case标签。case标签必须是整形常量表达式,另外要注意的是bool、char、short、枚举类型也算是整形。 switch语句中如果某个case标签匹配成功,将从该标签开始往后执行所有case分支。 每个case语句分支后都应该有break语句,以防止不必要的错误发生。如果是人为省略了break语句,则应该添加注释

2017-06-13 15:52:03 290

原创 《C++ Primer》读书笔记 第4章:表达式

4.1 基础4.1.1 基本概念函数调用也是一种运算符,它对运算对象的数量没有限制。左值与右值C++表达式要不是左值,要不是右值。当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值时,用的是对象的身份(在内存中的地址)。 在实际运算中有一个重要原则:在需要右值的地方可以用左值替代,但是不能把右值当作左值使用。当一个左值被当作右值使用时,实际使用的是它的值(内容)。 使用关键字dec

2017-06-13 15:11:56 255

原创 《lua程序设计》读书笔记 第9章:协同程序

协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西。从概念上见,协同程序与线程的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,但是一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,当一个协同程序运行时,其他协同程序的则都处于挂起状态。9.1 协同程序基础Lua将所有关于协同程序的函数放置在一个名为“co

2017-06-02 11:17:44 266

原创 《lua程序设计》读书笔记 第8章:编译、执行与错误

尽管Lua是一种解释型语言,但是Lua确实允许在运行源代码前,先将源代码预编译为一种中间形式。其实,区分解释型语言的主要功能并不在鱼是否能编译它们,而是在于编译器是否是语言运行时库的一部分,即是否有能力(并且轻易的)执行动态生成的代码。可以说,正是因为存在诸如dofile装的函数,才可以将Lua称为一种解释型语言。8.1 编译8.1.1 loadfileLua中dofile函数用于运行Lua代码块,

2017-06-01 17:39:10 254

原创 《lua程序设计》读书笔记 第七章:迭代器与泛型for

7.1 迭代器与closure“迭代器”就是一种遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数,没调用一次函数,便返回集合中的“下一个”元素。closure为迭代器提供了绝佳的支持,一个closure结构通常涉及到两个函数:closure本身和一个用于创建closure的工厂函数。 我们编写一个简单的迭代器,返回table中每个元素的值: function value(t)

2017-06-01 14:04:48 282

空空如也

空空如也

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

TA关注的人

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