自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 命令输错后出现internal/modules/cjs/loader.js:983

这个报错,是因为命令输错,在没有安装脚手架的情况下把项目的启动命令输成了npm run xxx此时,可以看到,整个node_modules已经乱套,只能提取代码,新建夹子,从而借尸还魂。一定要分清,没装脚手架要用node run dev! ! !...

2022-02-18 22:59:21 1181

原创 Windows 编程注意事项 || 自用

1. Window API 函数Windows API 提供的函数,有ANSI和UNICODE 版本的,需要注意的是,你调用一个函数时,这个函数名可能是定义好的一个macro罢了#define MessageBox MessageBoxA#define MessageBox MessageBoxW#undef MessageBox 取消macro注意你使用的是什么编码2.cl 调用Windows 函数的过程一般,你在.cpp文件中使用到的函数,都是CRT去间接调用的,为什么间接?因为,不是操

2021-06-06 13:17:09 172 1

原创 微软cl Compiler Switches 手册 || 自用

/Zi 产生调试文件,.pdb 等文件,之后可以用shell命令devenv foo.exe 进入Visual Studio,他会为你创建一个Dommy solution,提供调试的接口。

2021-06-06 12:11:58 139

原创 进程与线程 || process & thread

一、二者区别进程包含线程。二个进程间的数据是相互独立的,会把程序已定义的变量函数,再定义一次。两个线程间数据是共享其父亲进程的Code/Data/File…,共享的内容不包括Registers/Stack,因为每个线程都有自己的Register和Stack状态;这样就产生了线程的内存访问问题,比如,1、同时对进程中的某个数据进行访问,就互斥了解决方案: 死锁...

2021-05-07 12:31:34 69

原创 浏览器工作原理个人理解 | | CSS 解析过程总结

一、浏览器工作原理部分HTML、CSS、JavaScript解析是三个需要处理的部分,为了加快页面的渲染,浏览器的渲染引擎部分,会有自己的渲染逻辑顺序。目的是为了快速的提升页面渲染速度。浏览器接收到HTML文件后的动作:1、HTML解析成DOM树2、CSS解析成CSSOM树3、若写了JavaScript代码块,且非async,则中断DOM构建,反过来执行JS,因为JS可能会修改DOM的结构内容这是网页文件送达后,三个关键资源的首要阶段,也叫关键阶段。之后的过程,会根据不同浏览器的内核而不同。大

2021-02-09 20:42:01 157

原创 腾讯云-轻量应用服务器centOS 使用 || Nodejs后台运行

一、腾讯云-轻量应用服务器常见问题一般,提供的默认端口是符合每个协议规范的,比如HTTP:80HTTPS:443Windows登录:3389linux登录:221、端口的防火墙问题要在这样的服务器上搭建自己的服务,就要开启自定义的端口;注意:你在程序中开启端口后,也不一定真的能实现端口的通信,还要注意防火墙,TX的服务器一般都保留了上面的默认端口,允许流量出入;如果自己在编写的程序里面使用了自定义的端口,那么就要在腾讯云的后台去设置防火墙,才能实现流量互通。否则直接504访问不到端口。

2021-01-27 11:41:51 636 1

原创 按下键盘后,OS怎么做回应?

首先,按下key后引发中断,键盘的IRQ #1,会找到处理标号为1 的键盘中断处理函数。键盘的中断处理函数,无非就是与内存上与PIC连接的port地址进行通信,告诉PIC,这个键盘的中断我CPU已经完成了,可以从你的PIC队列里面delete释放了。但是,按下一个key却是触发了2个中断,一个是key press,一个是key release,这时候就会往键盘驱动规定的内存port地址中发送2个键盘state,这个state是个字节型数据(00~ff)。注意:一个按键,对应两个state,对应两个不同

2020-11-19 21:33:27 117

原创 8259 PIC 编程应用

PIC = programable interrupt controller是一个与硬件中断有关的chip,负责将中断信号拦截,让拦截的信号等着cpu去处理,中断信号是有等级的。按下键盘后PIC的行为首先,按下一个键后,PIC会收到一个电流以及中断线 (IRQ #1);之后,会把IRQ #1翻译成系统中断,给CPU发中断信号;接下来就是OS的中断服务程序了8259 PIC的中断服务程序早先有8种IRQ中断类型,这些中断服务子程序的地址是由BIOS来存储(寻址)的;后来为了扩展IRQ类型,只能

2020-11-18 18:47:26 187

原创 汇编I/O操作指令

一、OUTx在一个I/O的地址上写数据,关键字"a"表示,要在这条asm语句执行前,就把val的值放到eax寄存器中;关键字"Nd“表示,允许一个字节的常量值可以被汇编称为一个常量,这样就释放了edx让其他程序使用。static inline void outb(uint16_t port, uint8_t val){ asm volatile ( "outb %0, %1" : : "a"(val), "Nd"(port) ); }二、INx从一个I/O地址读取数据,把por

2020-11-18 16:49:43 1037

原创 Rec02 | JavaScript 数据结构

除了原生的数据类型,还有object类型,它类似于结构体属性类型比如,console.log的这个log属性,只是访问console对象的log属性当然,所有的JavaScript值都具有一定属性,比如、str.length,但是null和undefined没有属性;访问属性有两种办法,用str.length、或者str[length]区别是[length]需要估值,计算[]内的值,再转化成string作为属性object 类型定义let day={ today:monday,

2020-11-02 22:04:12 115

原创 Rec01 | JavaScript 变量、函数

一、变量整型包括浮点数和整数,都是64位。NaN表示not a number,当出现0/0时就会出现这个结果。浮点数分符号位、小数位、整数位。Infinity,-Infinity都表示无穷,Infinity-1仍是Infinity,Infinity-Infinity是NaN。字符串字符串可用“abc”,‘abc’ 来表示,双引号与单引号没多大区别;字符串的运算只有+,例如,”a"+‘b’=“ab”但是,如果在字符串中使用"abc 100/2“,此时就会计算{100/2}“,此时就会

2020-11-01 22:15:11 818

原创 CSS | 04 font 操作,family、style、size

一、font-family一般超过两个单词的字体就用" ";浏览器会从第一个参数开始检测,直到检测到可以使用的字体,就apply it;body{font-family : "Times New Roman",serias,double-serias;}二。font-style斜体。加粗之类三、font-size...

2020-09-07 16:44:04 174

原创 CSS | 03 元素选择优先级的计算

一般来说,内嵌的Css属性优先级最高,元素选择Css属性最低。求出下列属性的优先级值:#foo{color = Black;}//注意,这是类选择器的一种写法[id= "foo"]{color = White;}.Container h1{color = Red;}div h1{color = Yellow;}10010112...

2020-09-07 16:25:33 60

原创 CSS | 02 嵌套标签的父子css属性descendence、child selectors

如果这样,那么ul里所有的li会变成白色ul li{color:white;}如果这样,那么仅次于ul下的li会变成黑色,li里面的li不会做任何改变ul > li{color : black;}

2020-09-06 22:18:48 371

原创 CSS | 01 Gradient 渐变、shadow 阴影

这个css gradient 可以 让浏览器展示2个及以上颜色的流畅渐变。css 中给出了2种类型的渐变:linear 渐变radial 渐变shadow 可以让某个标签元素带有阴影比如text-shadow;box-shadow

2020-09-06 21:41:34 165

原创 Makefile 使用日记

GPPPARAMS = -m32objects = loader.o kernal.o%.o :%.cpp//标识创建什么//具体创建过程 g++ $(GPPPARAMS) -o $@ -c $< mykernal.bin: linker.ld $(objects) ld $(LDPARAMS) -T $< -o $@ $(objects)表示从.cpp文件中产生.o文件,利用g++完成。最后一行表示,以linker.ld 为基础,创建mykernal.bin 文件...

2020-08-20 15:43:14 152

原创 13、多线程程序测试

在windows上开启一个线程需要用到一个函数,返回一个handle之类的东西,handle 可以控制线程。目的,看看多线程在一个进程中的执行情况:实现思路:先开辟8个线程,之后,把 8个 works 添加到 工作队列中,让线程自己碰运气去执行队列里面的works。其中,8个线程都有各自的id,如果某个线程执行了一次打印,那么就会输出 该线程,并且输出 它执行的work是什么类型。#include<stdio.h>#include<windows.h>#in

2020-08-17 18:23:10 127

原创 12、进程、线程及中断、core、hyperthread、C++ struct内存布局

1、进程一般,CPU在执行指令前,要知道一些信息包括(1、开始执行的指令是那个2、内存布局(因为Virtual memory,需要知道物理disk地址)3、寄存器状态)这样,就可以map到物理地址,去做实际的事情。每次运行一个.exe文件,都会开启一个进程,用来告诉CPU 这个程序的内存是怎么布局的,因此,运行中的程序的内存布局方面是完全由进程控制的,进程就是个内存布局的状态。进程包含 内存、翻译buffer、地址表。2、线程进程中包含很多个线程,线程是存储了asm 指令集、寄存器信息

2020-08-15 20:58:45 242

原创 11、dll 在程序中的加载方法

一般程序要使用到dll中的函数,但是实际的dll中函数地址 的提供方法分两种,runtime提供dll直接在runtime 提供dll,在程序运行过程中,先把dll载入到内存,此时如果卸载该dll,例如,freedll(dllname);程序照样运行,这时你就可以写个新的dll,又加入到内存,再把上一次用到dll 中函数地址的指针变一下(指向其他内存),就可以继续用新的dll,于是有了新的功能,并且不用去关闭程序,做到实时的dll更新。#define GET_STATE(name) DWORD WIN

2020-08-07 20:54:57 577

原创 6、网课系列 | OpenGL 纹理Texture实现

把图片送到gpu ,作为一个纹理,进而,在drawing步骤是,可以调整 shader去读取照片的纹理,因此,fragment shader就会读取gpu上的texture内存,并攫取出像素的每个纹理的颜色。总体来说,就是加载图片,在OpenGL中创建纹理,再在渲染时bind那个纹理,调整shader到各种的bind,当然也在shader中对纹理进行采样,sample。于是,draw rectangle时后就会看到纹理了。详细步骤png格式图片,里面存储着照片的纹理,1、加载png图片到内存第一步

2020-08-03 14:00:52 131

原创 5、网课系列 | OpenGL 什么是VAO?

一般,当连接vertex buffer 到vao对象时,会做很多预备动作。1、首先要创建一个vao对象以供连接使用,2、创建vertex buffer,并绑定到gl_array_buffer一旦使用到vertex AtriibPointer 时,(0,)第一个参数0 是指定到当前所绑定到gl_array_buffer VBO对线,也就是vertex buffer,因此,这样就说明了VAO对象buffer的内部,下标为0指向的是一个vertex buffer于是就把vertex buffer 连接到

2020-07-28 11:55:53 267

原创 6、C++ Mooc | 宏是什么macro?

当编译c++程序时,首先发生的是预处理器 阶段,实际上是个文本编辑阶段。最终得到的是一个可以送给compiler的文本。自定义macro:一般在visual studio 的项目属性中,选择所有配置,在c/c++选项里面选择预处理器,加上自己定义的宏,比如,Apple;然后在cpp中可以利用,#ifdef Apple(do something)#else(do something)#endif这个时候,Apple已经在预处理器里面定义,所以直接进入第一个()。还有很多宏,比如__decl

2020-07-28 10:45:40 120

原创 4、网课系列 | OpenGL 从CPU传数据到Shader的方法(uniform)

如何将CPU上的C++程序数据,送到shader程序中,uniform ,是GLSL结构化语言中的关键字。步骤:1、先在shader中声明一个uniform变量,比如,uniform vec4 U_color2、再到cpp文件中,获取shader程序中uniform的location及变量名int location = glGetUniformLocation(shader,"U_color");glUniform4f(1.0f, 0.0f, 0.0f , 1.0f);注意,这个传入的s

2020-07-27 16:12:35 265

原创 3、网课系列 | OpenGL检查错误信息并输出

有两种方法,本次直接用最常用的一种1、GL get error思路:先检查并处理别的错误,实际上并没有做错误处理,只是把错误卡到一个while(1)中,以此来说明还没运行某测试代码时,前面的代码已经出错。如果没有错误,则跳出,执行测试代码,执行玩后,会去用assert捕捉错误,并打印,然后break程序。所有的这些宏讲解都会放在C++ Mooc系列。#define ASSERT(x) if(!(x)) __debugbreak();#define GLCall(x) GLClearError(

2020-07-27 15:37:29 428

原创 5、C++ Mooc | 利用静态lib、动态lib

静态linking就是 直接把lib中使用到的代码全部 copy 到exe中;动态linking就是 在runtime的时候把用到的lib 进行连接使用,(其中windows可以提供相应的接口,加载dll——dynamic link library)lib都是配合头文件使用,一般的函数声明放在头文件中,具体执行放在lib中,链接器会找到附加库目录中的附加依赖项,然后进行静态连接。...

2020-07-26 10:58:50 90

原创 4、C++ Mooc | 运算符和运算符重载

运算符实际上是函数,因为早先使用函数做运算不方便阅读,因此出现了运算符,本质是函数。struct vector1{ float x,y; vector1(float x,float y) :x(x) y(y) {} vector1 Add(const vector1& other) const { return vector1(x+other.x , y+other.y); } //重载 vector1 operator+(const vector1 &oth

2020-07-26 10:16:24 59

原创 3、C++ Mooc | 智能指针(unique、shared、weak)

使用智能指针先包含#include 智能指针是一个unique 指针,是指向一块内存的指针,能自动free,但是不能两个unique指针指向同一个内存,因为当其中一个被destroy后,就free了,另一个就指向free的内存。1、创建智能指针int main(){ { std::unique_ptr<char> charactor(new char); std::unique_ptr<char> charactor=std::make_unique<char&

2020-07-26 00:00:42 106

原创 2、网课系列 | OpenGL图形管道、Shader

shader 是显卡驱动上的一个小程序,比如intel驱动、GPU 内部有4个shaders,如下图:注意,并不是所有的data都做相同处理,不同的shader接收不同数据只要数据从CPU通过 OpenGL送到了GPU上,数据就立即被OpenGL的图形管道处理,图形管道的处理分6步:1、Per-Vertex Operation每一个vertex都通过空间矩阵表进行转换,高效的把3D坐标转成别的坐标,2、Primitive Assembly通过一种特定的规则来连接vertex,进而构建出一

2020-07-23 11:01:19 117

原创 2、C++ Mooc |继承、虚函数、接口、visibility

一、继承类之间的继承是 最基础的 。继承可以给 不同的类 进行层次体系划分,换句话说,可以给一个包含公用函数的基础类,并创建它的一个子类。

2020-07-19 12:42:56 139

原创 1、DirectX 系列之 Direct 2D

为什么要用DirectWrite,因为要自己做一个文本编辑器,需要用到1、对文本的渲染、2、分辨率无关轮廓字体、3、完整的Unicode文本、4、布局支持DirectWriteAPI支持多格式文本的测量、绘制和点击测试。...

2020-07-17 23:17:13 424

原创 1、C++ Mooc | C++工作原理

源文件经过编译器,可以产生lib 、dll、 exe 。运算符<<就是函数而已,如下:std::cout<<" dump duck ! "<<std :: endl;等价于 ==std ::cout.print(" dump duck !").print(std ::endl);visual studio 中的solution 配置,是定义了如何为当前平台 编译的规则。函数的声明与定义:如果声明,没定义,那么就可以过编译,但是过不了linker所以,lin

2020-07-16 14:17:03 187

原创 1、网课系列 | OpenGL 配置好OpenGL,并且查看版本(4.4.4)

OpenGL只是操作显卡进行渲染的一个“接口”,或是一种 控制显卡 的途径。控制的方法都写在了 GPU driver 上,这是显卡厂家在出厂时就把driver程序写好的,就好比你的主板总得有个BIOS吧。我们学习OpenGL的目的就是,进入Driver程序,得到函数声明,使用里面的函数,于是就要访问driver 的dll 库,用它来返回在dll中的函数指针。具体做法,访问driver ,取出函数 都要用win32 api 调用,或者foreign windows。但是,这已经是OpenGL 1.1.

2020-07-15 23:21:43 532

原创 10、day10 | 程序设计中的文件I/O操作

文件I/O 操作 分成两类1、加载 只读文件,比如游戏声音、asset、3Dmodel。核心思想,把文件从driver上拿到下来,放到内存上供程序使用。2、保存程序的运行(游戏)状态,比如,调整窗口的全屏,声音增大之类的,即写入,也读取。也就是对只读文件操作,和,对读写文件操作。...

2020-07-15 19:30:31 71

原创 3、OpenGL | 自定义着色器shader class(to be continued)

这是学习 着色器shader 的最后阶段:目标:构建一个shader class ,读取硬盘上写好的shaders,并且编译 链接这些shaders程序。步骤:1、在 .h 头文件中,创建shader class,class 结构定义如下:#ifndef SHADER_H#define SHADER_H#include <string>#include <fstream>#include <sstream>#include <GL/glew.h

2020-07-14 14:16:03 172

原创 OpenGL中的插值是什么 | interpolation

一般,绘制一个三角形,需要三个顶点,并且要输入rgba值,才能渲染出三角形的色彩。但是,rgba只是给定了3个颜色值(R,G,B)是怎样的,并没有给出一整个颜色板,如果你设RGB为(0,1,0),那么整个三角形都是绿色的。这是fragment shader中 片段插值 的结果,当进入到渲染三角形的 光栅化阶段时,通常会产生很多fragments ,比你初始定义的顶点还多,于是光栅器 就根据这些fragments 在三角形上的相对位置 ,基于这个位置,光栅器就 插值所有 fragment shader

2020-07-14 13:08:46 549

原创 2、OpenGL | 着色器Shaders in the Graphics Pipeline

一、GL SL (shading language)是一中类似C的语言,包含了专门针对向量和矩阵操作的有用特性。着色器代码编写,总是以版本声明开始,然后是输入和输出变量的列表,uniform和Main函数。结构如下:#version version_numberin type in_variable_name;in type in_variable_name;out type out_variable_name; uniform type uniform_name;int main()

2020-07-13 23:32:54 101

原创 2、链接器Error | error LNK2019: 无法解析的外部符号 “void __cdecl “该符号在函数 _WinMain@16 中被引用

情形再现:连接器错误#include<stdio.h>#include<myself.h>void main(){ myself();//在头文件中的函数}一般,若定义在 .h 头文件里的函数,如果不是static类型,那么就会遇到这个无法解析的链接错误,改成static后,就行了;但是,改成static 可能又报错,说未定义头文件myself中的函数,这时候,直接include myself.cpp ,不要头文件了,就行了...

2020-07-09 22:21:19 812

原创 1、编译器Error | 静态函数“void something”已声明但未定义

情形再现:编译时出错#include<stdio.h>#include<myself.h>int main(){ myself();//在头文件中return 0;}一般,你自己写.h 文件,再到main.cpp中#include时,在.h 文件 定义的函数是不可能找到实体的,因为你没include .cpp文件因此,直接include 另外一个.cpp 到main.cpp 里头就行了。...

2020-07-09 22:06:35 333

原创 1、OpenGL | 坐标如何转化为有颜色的像素

OpenGL是一个图形接口函数库,他是用来跟GPU驱动打交道的。在OpenGL中,所有的图形都是3D的,所有的2D图形都是从3D转过来的,转化的方法是通过一个叫图形管道的东西,你输入一个3D坐标,就立马给你转换成2D 像素。转换过程分两部:1、3D坐标转2D2、2D坐标转成有颜色的像素这个转换并渲染的过程,要用到一个叫shaders(着色器)的东西,实际上他不是个东西,只是个小程序,你用GL shading language写成的,给GPU去执行的程序罢了。有些shaders是我们可以自主编写

2020-07-08 17:20:23 563

原创 9、day09 在win32平台写的代码如何实现跨平台性?

在以前,会用编译预处理语句,比如#if 。。。#else 。。。#endif来实现跨平台的程序运行,比如:#if GameLOL_Win32{Windows代码}#else if GameLOL_Linux{Linux代码}#endif把这些变量都初始化为 0 ,只需要在编译的时候,利用编译器选项去获得变量的值,比如,GameLOL_Win32 = 1,于是就跑Win32的代码了。把操作系统虚拟化出这个游戏外。...

2020-07-07 18:27:00 111

空空如也

空空如也

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

TA关注的人

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