自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Windows游戏开发——观察坐标系的变化

3D游戏物体的改变通过矩阵的线性变化方式,左乘最终变化矩阵(列向量的情况下).对于最终变化矩阵,是由世界矩阵(对于世界坐标系),观察矩阵(对应观察坐标系),投影矩阵(在3D空间到2D屏幕的投影变化)三者组合而来的。在一些游戏场景中,世界矩阵与投影矩阵在初始化时便被定义好了,而我们在游戏中改变的通常是观察坐标系,如CS中,鼠标移动对应着观察坐标系的旋转变化,键盘W触发的便是观察坐标系的平移变化。

2024-03-06 19:38:19 382

原创 Windows游戏开发——GameTimer的创建与解析

在游戏创建中,GameTimer用于计算两个动画帧之间的资源消耗,由于不同机器的CPU的频率(f)不同,即时间周期(T)不同,它们之间计算资源消耗的基本单位数值不同,所以需要获取当前机器处理器的频率,在记录两帧之间的时间间隔Δt后,再计算两帧之间时间周期的消耗ΔT。而如何获取CPU的时钟周期和计时?即通过QueryPerformanceFrequency和QueryPerformanceCounter方法,它们正是构成GameTimer的主要部分。

2024-02-28 19:42:34 429

原创 3D中世界坐标系到观察坐标系的转换原理和实践

对3D游戏中世界坐标系与观察坐标系转换的探讨

2023-10-14 17:34:29 472

原创 获取String中的byte数组,使用反射的方式(JDK8)

正常new对象的方式,是由类到对象的形式,类加载-链接-初始化后,对象根据类的模板进行创建。而反射是由对象到模板类的形式,通过对象反向获取Class类信息,然后通过Class模板类获取类中的信息(属性,方法,父类等等Class类信息)。

2023-05-24 20:20:17 318

原创 Socket连接数据报文与TCP协议理论的对应

本文基于Java代码构建了一个网络通信的模型.模拟客户端和服务器通信的全流程,从连接到数据传输再到断开连接。一个基于TCP协议网络连接的全流程。然后运行这个模型,进行网络数据交换,同时使用WireShark抓取数据报文进行分析,以此论证TCP协议。

2023-05-09 17:55:18 446

原创 条件数据传送和条件控制转移

在阅读csapp这本书中关于第五章优化程序性能——条件数据传送和条件控制转移时,我陷入了一个误区就是:条件数据传送方法的关键汇编指令必然是cmov,条件控制转移方法的关键汇编指令必然是cmp。但对两种不同的方法编译后产生的汇编代码进行分析时却发现这个观点是错误的。

2023-03-29 16:48:27 214

原创 二进制形式的整数与负数的乘法

通常形式的二进制乘法仅仅适用于无符号的整数,当出现负数时,会出现结果值偏差。即结果值+矫正因子=期待值。

2023-03-03 21:58:42 446

原创 HotSpot8源码-类加载器的实现

JVM进行LoadClass的类加载器分三种:BootStrapClassLoader,ExtClassLoader,AppClassLoader。在不同的场景下使用相应的ClassLoader将.class字节码文件转换成JavaClass类对象,转换源码如下所示:Klass对象为C++实现的对象,在JVM读取转化.class类文件中的数据后得到的结构体,即.class类文件的元数据对象。

2023-02-15 14:09:34 336

原创 JVM初始化Main线程创建的流程(从OpenJDK8源码到Linux源码的线程创建)

JVM本质是动态链接库(Windows下为.dll文件,Linux下为.so文件),作为Java的虚拟机运行在操作系统的进程空间中,为Java语言提供类加载机制,热点编译,GC回收机制等,同时也为JDK函数的封装提供了JNI支持,即调用C/C++函数接口。此文将从JVM的启动流程开始向底层分析Main线程的创建(Linux平台下)。

2022-11-15 17:00:04 570 2

原创 JS代码对表格进行新增时无法解析HTML代码的解决方式

既然已经发现问题的所在是这段代码并没有生成一个Node节点挂载在DOM树上由浏览器内核渲染在页面中,那么我们只需要先生成一个Node节点然后再传入需要渲染的元素,最后获取到需要挂载的节点直接挂载上去即可!可以根据前端的代码发现,这东西压根就没有作为一个Node节点挂载到DOM文档树上,只是作为了一个字符强行加到了table表的最后,所以在实际效果这段HTML代码并没有被解析。这是HTML解析DOM文档的顺序,浏览器根据DOM树的父节点逐级往下解析渲染在浏览器中的。

2022-09-07 11:49:04 475

原创 JDK1.8.Java类加载,Class.forName()和ClassLoader.loadClass()的区别

ClassLoader.loadClass()public class test { public static void main(String[] args) { Class loader = loader(); System.out.println("loader = " + loader); } public static Class loader(){ ClassLoader classLoader = Thread....

2022-04-28 14:41:44 884

原创 Mini框架使用演示

代码Gitee路径:1. 导入pom这里已将源码中的com包放入了maven本地仓库的根路径下。<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.

2022-04-22 13:27:01 1047

原创 求出一个数的N次方,时间复杂度优化为logN的算法

求num的N次方常规解法是,使用一个for循环,让num*num执行N次,该时间复杂度为O(N)1. 思路分析这里假设求2的75次方,这里75用二进制表示0100 1011,则2^75 = 2^64 * 2^8 * 2^2 * 2^1。只有当二进制位为1的时,才会带入结果进行计算...

2022-03-28 13:51:00 2065

原创 斐波那契数列的暴力递归方法使用动态规划进行优化

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34…从第二位开始,每一位都符合一个特征:f(n) = f(n-2) + f(n-1)。1. 暴力递归解法 /** * 时间复杂度为:O(2^n) * @param n 第几位数 * @return 返回第n位上的斐波那契数 */ public static long fibonacci(int n){ if(n < 1){ ret.

2022-03-08 17:48:48 377

原创 解析Java中的递归套路

最简单的递归俗称"自己调自己",在一个方法内部调用相同方法的行为。** 递归套路解析**如下,这是一个基础的递归函数,当传参为3时候,打印结果为0 1 2。 public static void recursion(int i){ if(i == 0){ return; } i--; recursion(i); System.out.println(i); }首先从JVM的角度.

2022-03-04 15:17:16 704

原创 数据结构之使用双向链表或数组实现环形队列

1. 环形队列分析环形队列是一种复用性极高的数据结构,被使用在许多场景中,如在MySQL的InnoDB存储引擎中被使用于的Redo log日志,在DB挂了的时候,提供即使的数据恢复,保证了其持久性。默认便是有四个文件循环记录修改信息。又例如Disruptor消息队列,其任务队列便是一个环形队列,循环写入,写满即覆盖继续写。逻辑图如下:环形队列的一个主要特性便是当队列满了之后,回到头部继续push,这里可采用两个指针pushPoint和popPoint进行实现。分析图如下。2. 代码实现双向

2022-01-17 15:43:49 1134

原创 JDK1.8源码分析LinkedList和ArrayList根据index进行增加和删除时的时间复杂度和空间复杂度

时间复杂度:衡量算法流程中发生了多少次常数时间操作,额外空间复杂度:衡量算法流程中必须开辟的空间。1. LinkedList基于链表实现。/** * Inserts the specified element at the specified position in this list. * Shifts the element currently at that position (if any) and any * subsequent elements to .

2022-01-15 15:00:42 922

原创 5.7版本的MySQL对于数据量为100w的用户表根据创建时间进行分区

1. 何为分区?分区概念图如下,分区类型包括列分区:包括范围分区(如create_time,大于1998可分为一个区,小于它又 可分为一个区)和列表分区(如age in (31,32,33),当插入数据,age=31时为a区,age=32时为b区,age=33时为c区)哈希分区:通过取模运算进行分区key分区::ey进行进行分区,也使用了取模运算子分区:即在分区的基础上还能继续进行分区官方文档对于分区(Partitioning)的解释2. 进行分区测试这里为了突出对比,分为两张

2022-01-08 18:23:49 1146

原创 “屎山”代码如何优化——控制层接收参数篇

在一次偶然的机会,写出了一个“屎山”代码,秉着严谨的态度(看着实在不舒服),尝试了一下优化,并用博客记录一波1. 优化前@PostMapping("/confirmUserAddress")public Map<String,Object> confirmUserAddress( boolean checked, String city, String detail, String district, St.

2021-12-12 21:43:39 824

原创 MySQL下的Performance_schema性能板块监控 (附博主开源项目)

Performance_schema性能板块监控1.简单介绍MYSQL的Performance_schema用于监控MySQL server 在一个较低级别的运行过程中的资源消耗,资源等待等情况MySQL默认开启,可以用 SHOW VARIABLES LIKE ‘performance_schema’ 查看性能模板是否开启。基于Performance_schema的监控项目Gitee路径:mysqlMonitor提供了一种在数据库运行时实时检查server的内部执行情况的方法,performa

2021-11-23 11:57:21 1195

原创 从DruidPooledConnection连接池手动获取的连接是否需要关闭?

我刚开始在百度搜索的时,看到一些回答是从Druid的连接池中获取的连接是也由它进行管理,不用会自动回收。但实践后发现从DruidPooledConnection连接池手动获取的连接是需要关闭的,如果不手动close()关闭会造成连接"泄露",类似内存泄露,也就是不会被回收掉,就占据在哪里,当连接数"达标"——即超过在Druid连接池中配置的最大连接数,即获取不到连接,从而报错。1. 从Druid连接池中获取连接由于业务需要测试SQL语句同时获取结果,而项目整体用的是Druid的连接池,我需要从Dru.

2021-11-16 21:10:48 7801 3

原创 JDK自定义的ThreadPoolExecutor类中四种线程池的分析

1. ThreadPoolExecutor线程池的七大参数这里直接上ThreadPoolExecutor线程池构造器的源码//1.corePoolSize-线程池中的核心线程数//2.maximumPoolSize-线程池中允许的最大线程数,当核心线程数占满后,若最大线程数还未满,则启动非核心线程//3.keepAliveTime-超时时间,当线程数大于核心线程数,这是多余线程也就是非核心线程在等待新任务的最长时间//4.unit – keepAliveTime参数的时间单位//5.workQu

2021-09-26 11:25:46 132

原创 Mybatis源码全流程切割分析

1. Mybatis本文mybatis源码的分析大致思路围绕着下列代码进行开展的 //获取SqlSession工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis-Config.xml")); //工厂生成一个SqlSession会话 SqlSession session = factory.openSession(tr

2021-09-25 13:40:23 308

原创 vue|Element,前端哪些奇奇怪怪的需求——el-tree结合el-select实现通过多选框选定一级目录展示该目录下的所有子集分支

1. 需求分析将多个一级目录存放在el-select多选框,选定该目录,则在el-tree中展示中该一级目录下的所有子集选项,通过多选框过滤el-tree的数据,大致效果图如下所示:2. 代码分析首先展示数据解构://数据 data: [ { id: 1, label: '理论课', children: [

2021-09-19 20:09:53 1004

原创 vue|Element的el-table条件遍历问题:只过滤了数据,没有过滤相应数据所在行,导致空行现象

1. 产生原因由于el-table中是el-table-column=>template=>span这个逐级模式,优先遍历完所有column行,然后再在span的中进行条件过滤,这就导致了“空行”现象的产生。2. 解决方案第一次尝试的方式把template放column行外,控制遍历次数,但报错了,因为template需要依赖行获取是数据,把template放在外面直接导致了scope.row访问不到数据,从而读取parentId值报错。最终解决方案是基于css的display:non

2021-09-13 17:04:24 1613 2

原创 Java并发编程-CAS与Synchronized的使用场景

1. CAS简单介绍Compare And Swap,比较和交换,在JDK1.8中定义在Unsafe类下用于比较,交换元素,以及重新重试(该过程称为自旋) ,图解如下。例如,m=1,此时一个线程使用CAS对该m执行自增加一操作,此时期望值是m本身1,新值是自增后的值2,比较:m==期望值,执行交换:m=NewValue,但如果此时在比较之前,一个新线程对m执行了一个自增加一的操作,m变为2,但m的期望值仍然为1,在比较时,由于m!=Expected,就不会执行交换,而是执行自旋(重试)操作,此时m的期望值

2021-07-30 12:44:20 958 2

原创 volatile的可见性实现原理分析

1. Volatile的定义Java语言规范第三版中对Volatile定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性地更新,线程应该确保通过排他锁单独获得这个变量。在多线程的场景下,当一个线程修改一个被Volatitle修饰的变量,另外一个线程也能读到该变量修改后的值,该变量即为共享变量,被所有线程共享。因此可以提出Volatile具有可见性。2. Volatile的使用场景package com.hnjd.test;import com.hnjd.entit

2021-07-18 12:49:12 2260 4

原创 深度分析Mybatis中org.apache.ibatis.executor.ExecutorException: No constructor found异常

1. 产生原因该异常为实体类数据类型与数据库字段类型映射不匹配异常,当Mybatis开始获取返回对象并映射结果集时。如果在实体类中配置了所有参数的构造器,则会在获取返回对象时会通过构造器的方式赋值,但Mybatis在使用构造器赋值处理中并没有调用到类型处理器,而是直接抛出了该异常。由于实体类中使用到所有参数的构造器,Mybatis使用构造器方式映射数据库字段值。直接从Mybatis封装结果集对象开始深入,在getRowValue方法中记录了大致的执行流程。package org.apache.

2021-06-13 18:21:41 1503 1

原创 通过Mybatis拦截器实现覆盖配置类

通过Mybatis拦截器实现覆盖配置类1. 拦截器的简介 Mybatis将拦截器定义为插件,在执行过程中的某一点进行拦截调用,在这一点上加上自己的代码逻辑。默认情况下,Mybatis拦截的方法调用包括Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)——执行器,负责增删改查以及事务的提交和回滚,默认使用 SimpleExecutorParameterHa

2021-04-24 18:33:29 629

空空如也

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

TA关注的人

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