自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(249)
  • 资源 (2)
  • 收藏
  • 关注

原创 Java的内存结构

什么是运行时数据区(就是我们java运行时的东西是放在那里的)

2024-07-23 00:41:37 740 4

原创 Java多线程

进程:每个进程拥有自己的一整套变量。一个进程可以包含多个线程。线程:线程属于进程,多个线程会存在共享数据的情况发生,也就是多个线程会共享同一块内存区域。一个例子:打开word是一个进程,打开qq音乐又是另外一个进程,两进程之间不会互相影响(都有自己的一块内存区域)。但比如在qq音乐里一遍听歌,一遍又浏览排行榜,那就是在qq音乐这个进程里又有两个线程,它们之间会存在共享内存的情况。并发。

2024-07-21 14:14:33 683 1

原创 Java泛型和反射

本文重点介绍反射的概念,以及反射之于泛型的应用,如果对泛型不清楚的同学可以查看我的Java泛型程序设计一文JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

2024-07-16 02:08:53 688 1

原创 Java泛型程序设计

描述:不可以定义Pair[] pairs = new Pair[10];原因:类型擦除以后变为Pair[] pars = new Pair[10];然后我们可以赋予pairs[0] = new Pair();没有编译错误,但存在运行时错误。解决方法:使用ArrayList,ArrayList pairs = new ArrayList();

2024-07-14 16:42:14 516 1

原创 Redis之分布式锁

分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心是实现多进程之间互斥,而满足这一点的方式有很多,常见的有三种:实现分布式锁时需要实现的两个基本方法:释放锁:手动释放超时释放:获取锁时添加一个超时时间需求:定义一个类,实现下面接口,利用Redis实现分布式锁功能。简单实现redis分布式锁:改造上一章中加synchronized锁的代码:使用Redis分布式锁三、Redis分布式锁误删问题1. 误删问题分析线程1先获取锁后,由于业务阻塞还没执行完

2024-07-13 22:05:19 677

原创 事务的学习

事务 是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,这些操作要么同时成功,要么同时失败一组操作集合,不可分割,一起向系统提交/撤销,要么同时成功,要么同时失败。例子:如果a向b转账100元,总共分为三个步骤(1)检查a的手机余额是否>=100元(1)a的手机账户钱扣掉100元(2)b的手机账户增加100元。

2024-07-13 14:41:24 862 1

原创 Redis常见命令总结

对于 Redis 中的列表数据,一般是以 l 开头,为了方便记忆,可以理解成是 List,或者是 Left 中的 L,为什么要提 Left 以及说一般是以 l 开头呢,因为有一些操作是 r 开头,这个表示是对列表的右边进行数据操作。其中,value 可以是字符串,也可以是数字,对于数字 Redis 会自动识别,且可以使用一些字符串没有的操作,比如增加、减少等。对于字符串类型的数据,可以存储字符串也可以存储整数,对于整数,有一些额外的操作,比如自增1,自减1,自增n,自减n。

2024-07-09 01:23:36 980 3

原创 怎么实现Redis的高可用

我们在项目中使用Redis,肯定不会是单点部署Redis服务的。因为,单点部署一旦宕机,就不可用了。为了实现高可用,通常的做法是,将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务。Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。

2024-07-07 19:34:42 619 5

原创 Redis的持久化机制

Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。

2024-07-07 16:33:09 1128 3

原创 什么是缓存击穿、缓存穿透、缓存雪崩?

什么是热Key呢?在Redis中,我们把访问频率高的key,称为热点key。如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。而热点Key是怎么产生的呢?用户消费的数据远大于生产的数据,如秒杀、热点新闻等读多写少的场景。请求分片集中,超过单Redi服务器的性能,比如固定名称key,Hash落入同一台服务器,瞬间访问量极大,超过机器瓶颈,产生热点Key问题。那么在日常开发中,如何识别到热点key呢?凭经验判断哪些是热Key;

2024-07-06 12:43:09 832

原创 Redis为什么这么快?

虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。我们都知道内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。I/O :网络 I/O。

2024-07-03 01:28:14 604 4

原创 Redis快速入门

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。键值(key-value)型,value支持多种不同的数据结构,功能丰富单线程,每个命令具备原子性低延迟,速度快(基于内存,IO多路复用,良好的编码)支持数据持久化支持主从集群,分片集群支持多语言客户端与MySQL数据库不同的是,Redis的数据是存在内存中的。

2024-07-02 01:11:39 596 5

原创 Maven基础入门

这里我们可以对接 profile 这个单词中『侧面』这个含义:项目的每一个运行环境,相当于是项目整体的一个侧面。开发环境:供不同开发工程师开发的各个模块之间互相调用、访问;内部使用测试环境:供测试工程师对项目的各个模块进行功能测试;内部使用生产环境:供最终用户访问——所以这是正式的运行环境,对外提供服务MySQLRedisRabbitMQFastDFSNginxTomcat……就拿其中的 MySQL 来说,不同环境下的访问参数肯定完全不同,可是代码只有一套。

2024-06-23 20:50:18 1097 4

原创 牛顿迭代法(求解整数的近似平方根)

假设有函数:𝑓(𝑥)=0,要想求出其根,则可以:1: 给出一个初始点,则在该点的切线为:2: 沿着切线方向,与横轴相交,也即令则求的:3:更新,令4:按照1-3步骤迭代下去,直到精度满足要求上述算法的第1、2步,其实也就是函数𝑓(𝑥)在处的泰勒展开取前两项:上述泰勒展开式,取前两项并使之等于0,则有:,可以得到步骤2中的迭代公式。容易得出,点的切线方程为,要求,即相当于求的解。

2024-06-22 14:51:34 960 5

原创 Spring MVC详解(下)

Spring MVC默认情况下可以对基本类型进行类型转换,例如可以将String转换为Integer,Double,Float等。但是Spring MVC并不能转换日期类型(java.util.Date),如果希望把字符串参数转换为日期类型,必须自定义类型转换器。

2024-06-20 00:14:11 774 5

原创 Spring MVC详解(上)

Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能Java Web开发者必须要掌握的技术框架。

2024-06-16 13:06:32 1103 3

原创 Spring 中使用MyBatis

我这里仅定义了几个简单的增删改查。分别添加mysql-connector-java(用于连接mysql数据库)、mybatis(mybatis核心库)、mybatis-spring(在spring中使用mybatis的库)的maven依赖包。UserMapper.xml的作用是告诉mybatis您在UserMapper接口定义的方法具体使用什么样的SQL及其他约束。1、MyBatis(前身为iBatis)是一个开源的Java持久层框架,它主要用于与数据库交互,帮助开发者更轻松地进行数据库操作。

2024-06-12 01:14:49 1148

原创 Spring注解开发

Bean注解必须被扫描到才可以完成下面的操作@Bean所在的类必须加入到容器,可以加一个@Component注解,也可以添加@Configuration注解,一般是@Configuration注解非自定义Bean要通过工厂的方式进行实例化,使用@Bean标注方法即可@Bean的属性为beanName,如不指定为当前工厂方法名称@Component//将方法返回值Bean实例以@Bean注解指定的名称存储到Spring容器中如果不给@Bean添加参数呢,默认是什么名字?

2024-06-09 21:10:06 656

原创 数据结构 -- 树状数组

树状数组或二叉索引树(Binary Indexed Tree),又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 O(logn) 时间内支持动态单点值的修改。空间复杂度 O(n)。具体区别和联系如下:1.两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.

2024-06-09 01:10:19 1348

原创 Spring框架入门

由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建。可以把 Spring IoC 容器看作是一个大工厂,Bean 相当于工厂的产品,如果希望这个大工厂生产和管理 Bean,则需要告诉容器需要哪些 Bean,以及需要哪种方式装配 Bean。Spring 配置文件支持两种格式,即 XML 文件格式和 Properties 文件格式。

2024-06-04 23:57:36 808

原创 从集合论到位运算

本文将扫清位运算的迷雾,在集合论与位运算之间建立一座桥梁。在高中,我们学了集合论(set theory)的相关知识。例如,包含若干整数的集合 S={0,2,3}。在编程中,通常用哈希表(hash table)表示集合。例如 Java 中的 HashSet,C++ 中的 std::unordered_set。在集合论中,有交集 ∩、并集 ∪、包含于 ⊆等等概念。如果编程实现「求两个哈希表的交集」,需要一个一个地遍历哈希表中的元素。那么,有没有效率更高的做法呢?该二进制登场了。

2024-06-02 12:06:02 869

原创 Java中的内部类

一个类定义在另一个类内,那么这个类就是一个内部类,比如:在类A中定义一个类B,B就是内部类,而B可以当做A的一个成员看待。从种类上说,内部类可以分为四类:成员内部类、静态内部类、匿名内部类、局部内部类。

2024-05-26 20:07:02 878

原创 前缀和与差分算法

前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。

2024-05-25 11:53:57 854

原创 TypeScript的类型描述文件d.ts

接口和类型别名是定义自定义类型的重要工具。接口用于描述对象的形状,而类型别名用于为类型定义一个别名。x: number;y: number;我们可以使用接口或类型别名来约束对象的结构,并通过类型注解将其应用于变量、函数参数等。

2024-05-19 13:21:07 878 1

原创 消消乐算法总结

最近在工作中遇到一个问题,做一个消消乐的demo项目,连续相同数目超过四个后就要消除。我在网上看了很多解决方案,有十字形,横向,纵向,梯形搜索。越看越迷糊。这不是用一个BFS就能解决的问题吗?为什么要设定这么多情况?难道是为了优化吗?但是用BFS的同时用一个矩阵记录已经寻找过的元素不就可以提高效率吗?鉴于网上的解决方案如此的低级,还有的需要收费,或者说我没有找到。所以今天我就讲讲我的解决方案并附上代码,希望能有人从我的文章获得收益。消消乐其实也就是两个算法的组合:消除算法,填充算法。

2024-04-23 23:11:55 1145 2

原创 实时渲染 -- 流明(Lumen)

首先我们需要知道Lumen需要解决哪些问题。很多人都会问,既然已经有了硬件的Raytracing ,我们为什么还要Lumen呢。这是由于很多硬件并不支持 Realtime Raytracing,对于支持的那些硬件, N 卡还算是勉强可以,而 A 卡支持的比较糟糕。并且实际测试中,3080大概 1 秒钟能做10 个billion 的计算,这个实际的计算量用来做GI 的话,实际还是比较费力的。

2024-04-15 11:36:34 814 2

原创 实时渲染 -- 全局光照(Global Illumination)

我们今天的课程主题是动态全局光照和Lumen ,在讲Lumen之前,我们需要首先需要了解GI(Global Illumination),如果不把GI讲清楚,大家将会陷入Lumen复杂深邃的技术细节中。如果不了解GI的发展演变,大家会感觉Lumen中的某些细节处理是凭空从天上掉下来的。但其实不然,Lumen中的很多算法和思想在之前的一些GI算法中都有出现和实践过,因此Lumen更像一个各种GI算法的集大成者。我们只有理解GI最宏观的体系结构,你才能理解Lumen 是怎么产生的。

2024-04-14 16:27:26 995

原创 图形学物体拾取:CPU VS GPU

消耗性能低;对于射线碰撞,没有精度问题;但是只能拾取Mesh这种粒度;除了拾取Mesh还可以拾取图元,比如三角形;依靠物理系统,消耗性能比较高;会有精度问题,比如图纸放大缩小上百倍很难拾取(本人因放大缩小图纸感受到了精度问题);打通了引擎Runtime和编辑器开发的桥梁,通过物体的拾取就可以挂载其他辅助的组件,例如Gizmos,进而编辑场景。或者通过脚本来调用raycast对场景的物体进行射线检测或者动画拾取。

2024-04-09 01:05:06 739

原创 JS中bind、call与apply 区别

我们就可以使用call方法调用obj.sayHello, 并将obj.sayHello中的this修改为obj1,把 ‘设计师’, ‘画画’ 这两个参数出给obj.sayHello。区别在于传参形式不同,apply接受两个参数,第一个参数是要指向的this对象,第二个参数是一个数组,数组里面的元素会被展开传入fn,作为fn的参数。关于call、apply、bind函数,它们主要用来改变this指向的,在很多框架中常有用到,而且也是面试官喜欢问到的问题:多数会问道三者的区别, 以及手动实现它们。

2024-04-08 21:18:05 277

原创 JS变量声明var、let、const详解

varletconst函数级作用域块级作用域块级作用域重复声明不可重复声明不可重复声明变量提升不存在变量提升不存在变量提升值可更改值可更改值不可更改全局变量挂载到window全局变量不会挂载到window全局变量不会挂载到window不使用varconst优先,let次之i

2024-04-08 20:26:47 1758

原创 实时渲染 -- 体素化(Voxelization)

我们之前讨论的大部分问题都是关于面表示的。由于这些方法不需要显式地表示物体的内部空间,所以非常高效。体建模方法表示的是实体而不是表面。使用体模型可以产生更丰富的仿真效果,如物体的运动学行为和半透明光照效果。

2024-04-05 13:05:54 1527

原创 实时渲染 -- 材质(Materials)

(1) 非负性:fr(ωi ->ωr ) ≥ 0(2)线性:BRDF可以分成多项分别计算后相加(类似Blinn-Phong模型分成高光+漫发射+环境光)(3)可逆性:调换BRDF的入射光和出射光,返回值是一样的(4)能量守恒:不能违背能量守恒原则。下面公式,其实可以看做是半球上所有方向入射光的能量Li总 的一个系数,这个系数必须满足 ≤ 1(5)各向异性/各向同性BRDF:不管是各项同性还是异性材质都遵循光的可逆性,互换出入射光,BRDF返回值不变。

2024-04-04 15:10:25 1075

原创 游戏引擎中的物理应用

而在更多情况下,动画和物理的区分并不像上述一样清晰,而是直接互相融合,比如抱着一个小女孩跑步的过程,一方面小女孩自身拥有一定的晃动动画,另一方面随着整体位置的移动,动画带来的角色物理信息会一起输入到物理系统去更新最终呈现出来的融合效果,使得避免动画单纯重复(只动画)和小女孩乱晃(只物理/布娃娃)。3维物体的切割也是类似。分割3维物体的一个难点是处理切割处的纹理问题,一般有两种方式:1、直接制作对应的三维纹理,切割时直接用(麻烦、贵)2、离线计算好这些纹理,一旦破碎则切换到对应的纹理,(要瞬时处理)。

2024-04-03 11:41:02 1331

原创 游戏引擎中的物理系统

在这个基础上,优化方法是取凸包A的某条边a做轴时,直接将凸包B的所有顶点投影到a的垂线上,因为这样可以保证凸包A的所有顶点都在垂线上a的一侧,所以只需要判断凸包B上所有顶点在垂线上的投影是否在另一侧就行。这种方法下,由于实际游戏中的时间片Δt不可能和现实中一样小,所以会导致能量不守恒(变多)(如图中右侧所示,实际位移是偏多的),误差越来越大,物体逐渐甩出去。但实际游戏中时间不是连续的,而是由一帧帧实现的,所以通常需要解决的问题是在已知当前物体位置和速度的前提下获取之后某时刻的物体位置和速度信息。

2024-04-02 23:29:02 1521 1

原创 游戏引擎之高级动画技术

虽然线性插值本身简单,但其实现的一个重要前提是能够找到两个clip中匹配的对应pose(帧)去做插值,因而我们需要艺术家在做DCC(Digital Content Creator)时确保两个clip的节奏相同,这样可以在归一化后保证每一帧都对应一样的动作(比如取时间t时走的pose是踏在地上,跑也是一样,只是动作有所不同)。简单讲就是blending总是以additive的形式去融合,比如直接在眼睛的位置上加上闭着的眼睛,而不会将睁着的眼睛和闭着的去做插值。event概念引用于UE,即事件。

2024-04-02 19:52:41 3718 2

原创 判断点在多边形内的算法

在计算几何中,判定点是否在多边形内,是个非常有趣的问题。

2024-04-01 14:08:54 1440 8

原创 游戏引擎中的声音系统

多普勒效应(Doppler effect)是波源与观察者有相对运动时,观察者接受到波的频率与波源发出的频率并不相同的现象。生活中比较常见的例子是远方急驶过来的火车鸣笛声变得尖细(即频率变高,波长变短),而离我们而去的火车鸣笛声变得低沉(即频率变低,波长变长),这就是多普勒效应现象,同样的现象也发生在私家车鸣响与火车的敲钟声,音频参见[声的多普勒效应]。三维场景中有无数的声源,每个声源从不同的方向,不同的距离表现的效果都不一样。高频的声音衰减的快,低频的声音衰减的慢。不同的材质对声音的吸收也不同。

2024-04-01 12:33:31 1685 2

原创 游戏引擎中的粒子系统

当我们渲染普通场景时,由于Z-buffer的帮助,其实只需要渲染接触到的场景的第一个物体(其他被遮挡不需要渲染),但粒子效果有时候(最差情况下)会在一瞬间产生叠满整个分辨率好多层的粒子,而且它们不存在完全遮挡关系,所以相当于一下子要进行超大量的渲染。当时间跳转到下一次tick时,会新建一个alive list1,并依序检索alive list中的粒子,如果发现某个粒子死亡了,就会把这个粒子序号移到死亡列表中,并且在渲染时也跳过这个粒子,如果仍存活就照抄到alive list1中。

2024-04-01 11:33:57 1246

原创 游戏引擎中的大气和云的渲染

从而导致原方法LUT参数中的高度 h 以及太阳顶角 η都不需要参与预计算(因为都实时更新了),所以新方法的LUT表中只需要计算出观察的天顶角 θ 和一个水平方向环绕360度的夹角 ϕ (对应原来太阳到观察视角水平方向的夹角)即可。因为上述缺点,一种更简化的多次散射方案被提出,其特点在于认为任何散射都是各向同性的,向所有方向均匀散射,所以对一个介质来说,其所有邻居介质收到来自它的散射能量都是相同的,因而一次散射带来的结果只是整体削减(吸收)了固定百分比。实际计算时,Ray Marching是最常用的方法。

2024-03-31 18:49:01 990

原创 Unity -- 遮挡剔除

勾选后,由下图可见,刚才视锥内保留的好多物体又消失了,这是因为相机处于室内,室内墙不透明,视锥内的室外物体都被室内墙挡住看不见,使用遮挡剔除后,那些物体也被剔除掉了,所以不可见了,但是对比下图右下角游戏视图的内容和前面没有任何剔除以及视锥剔除后游戏视图的内容,完全一样,也就是说,遮挡剔除后,也不会改变游戏视图的内容,但是在视锥剔除的基础上,又进一步大幅度降低了相机的渲染量,运行时作品会更加流畅,因为被剔除物体的几何、材质、光照贴图、粒子系统等都不再被渲染了。简单地说,就是把被遮挡住的物体剔除掉。

2024-03-28 09:37:02 1682

WebGL实战学习代码

WebGL实战

2024-06-09

动物军团小游戏项目工程

cocos制作的对战类小游戏,微信搜索动物军团

2023-07-11

基于Django框架的毕业生就业推荐系统

基于Django框架的毕业生就业推荐系统

2023-05-06

MySQL数据库.docx

mysql学习笔记

2021-12-09

Unity知识点.docx

包含unity基本,进阶所有知识点

2021-10-04

空空如也

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

TA关注的人

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