本系列博客为《游戏引擎架构》一书的阅读笔记,旨在精炼相关内容知识点,记录笔记,以及根据目前(2022年)的行业技术制作相关补充总结。 本书籍无硬性阅读门槛,但推荐拥有一定线性代数,高等数学以及编程基础,最好为制作过完整的小型游戏demo再来阅读。 本系列博客会记录知识点在书中出现的具体位置。 本系列博客会约定用【】来区别本人所书写的与书中观点不一致或者未提及的观点,该部分观点受限于个人以及当前时代的视角所限,请谨慎阅读。 再次重申,请支持正版。 以下是一些窍门:(P77 2) 1、学习在调试器中阅读及单步执行反汇编 2、运用寄存器去推理变量的值或地址 3、使用地址取检查变量及对象内容 4、利用静态和全局变量 5、修改代码 2.3 剖析工具 游戏通常是高性能的实时系统
系统内核在收发事件、消息时使用的消息传递函数。可以理解为多进程之间的一种通讯调用机制。
一、简介 使用Mybatis有一段时间了,但是一直没有专门去阅读MyBatis框架的源码,Mybatis是一个非常值得我们去阅读的框架,源码里面运用了很多常见的设计模式,如构建者模式、代理模式、模板方法模式等等 下面我们就以搭建一个源码阅读环境开始,一起来看看Mybatis的源码。 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 官网地址:mybatis.org/mybatis-3/z… 如果对Mybatis还不熟悉的小伙伴,建议还是先去官网熟悉Mybatis是如何使用的,熟悉以后我们再来看其源码实现。 下面我们搭建一个简单的Mybatis 源码Debug环境。 通过上面的示例,我们总结一下Mybatis使用的大体流程,如下图所示: 可以看到,主要分为了如上图的几个步骤,这几个步骤也是Mybatis的核心了,所以我们阅读源码也是从这几个部分切入,逐步逐步去了解里面的实现细节
SparkContext是spark的入口,通过它来连接集群、创建RDD、广播变量等等。
redux源码解析 什么是redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 源码解析 注意: 如果没有使用过redux,建议先去看看redux文档 api方法 export { createStore, combineReducers, bindActionCreators
查看InheritableThreadLocal源码 重写了getMap和createMap方法。
ThreadLocal源码比较简单,整体了解起来比较容易。
koa源码阅读[0] Node.js也是写了两三年的时间了,刚开始学习Node的时候,hello world就是创建一个HttpServer,后来在工作中也是经历过Express、Koa1.x、Koa2 用的比较多的还是Koa版本,也是对它的洋葱模型比较感兴趣,所以最近抽出时间来阅读其源码,正好近期可能会对一个Express项目进行重构,将其重构为koa2.x版本的,所以,阅读其源码对于重构也是一种有效的帮助 image.png 小记 最近抽时间将Koa相关的源码翻看一波,看得挺激动的,想要将它们记录下来。 应该会拆分为几段来,不一篇全写了,上次写了个装饰器的,太长,看得自己都困了。 koa与koa-compose 热门中间件 koa-router与koa-views 杂七杂八的轮子 koa-bodyparser/multer/better-body/static 示例代码仓库地址 源码阅读仓库地址
每个线程独有一个 Map,Map里的存储结构为 Entry <ThreadLocal,Object> 数组
ioredis源码阅读[1] 上次针对 redis 的源码阅读涉及普通的 client,这次针对 cluster 模式下的 client 源码进行分析。 具体的源码路径就是在 lib/cluster 目录下了。 127.0.0.1", }, { port: 6381, host: "127.0.0.1", }, ]) cluster.get('someKey').then() 从源码上来看
ConcurrentHashMap源码阅读1.ConcurrentHashMap1.71.存储结构Java7中ConcurrentHashMap由很多个Segment组合,而每一个Segment是一个类似于 3.put接着上面的初始化参数继续查看put方法源码。展开代码语言:JavaAI代码解释/***Mapsthespecifiedkeytothespecifiedvalueinthistable. ss,u))==null){//使用CAS赋值,只会成功一次if(UNSAFE.compareAndSwapObject(ss,u,null,seg=s))break;}}}returnseg;}上面的源码分析了 3.put直接过一遍put源码。 4.getget流程比较简单,直接过一遍源码。
openldap-clients openldap-servers gd gd2 gd-devel gd2-devel perl-CPAN pcre-devel libicu-devel wget # 下载指定版本源码 RUN mkdir ~/php71 && tar -xvf /tmp/php.tar.gz --strip-components 1 -C ~/php71 # 安装目录 /var/php71 # 源码目录 已挂载进容器 docker-compose exec centos bash php-fpm nginx # 查看 worker 进程号 ps aux | grep fpm gdb --pid=xxx 阅读工具 推荐使用Understand 尝试过CLion和Visual Studio 很多代码都不能进行跳转 需自行下载一个与Dockerfile中PHP版本相同的源码用于阅读 增加扩展(可选) 依赖 下载已经安装的 PHP按本的PHP源码 进入扩展源码目录比如curl cd ~/php71/ext/curl 执行phpize(编译PHP扩展的工具,主要是根据系统信息生成对应的configure文件) /var/
List-1中,根据类型来调用不同的处理,我们以insert为例子分析,调用的就是如下的List-2,首先将传入Mapper方法上的参数转换为SQL参数,之后调用SqlSession的insert方法,注意这个SqlSession是SqlSessionTemplate,我们来看SqlSessionTemplate的insert方法,如List-3:
public void onFailure(Call<ResponseBody> call, Throwable t) { } }); 2.源码解析
我们一起阅读一下其源码,学习它是如何实现的。 整篇文档分下面几个部分: 项目结构 api 模块 sessions 模块 models 模块 adapters 模块 小技巧 1、项目结构 本次阅读代码版本是 2.24.0, 从github上clone 命令查看历史信息,找到tag=2.24.0的标签,切换版本: git checkout 0797c61fd541f92f66e409dbf9515ca287af28d2 可以使用下面的方法简单判断一下代码量,这样阅读完成后会更有成就感 , True) return request('get', url, params=params, **kwargs) 这种get-request的api的封装方式,和我们之前读过的redis源码类似
golang源码的工具链中提供了可选参数coverprofile参数,可以生成覆盖率文件,方便我们快速查看,哪行代码被覆盖了,哪行代码还需要验证,但是只支持单测环境。 于是https://github.com/qiniu/goc就诞生了,它借鉴了golang官方覆盖率统计方案和部分代码,核心原理是在编译打包的时候创建一个临时目录,将源码插桩后放到临时目录,然后编译成带覆盖率的包 下面开始研究下源码: 入口文件是goc.go,它只是注册了各种命令行参数,使用了spf13包,具体源码参考往期博客,这里不再详述。 string Singleton bool } 核心代码分为下面三步:1,根据参数列出需要处理的包 2,调用AddCounters进行源码打桩 ,将计数代码的赋值逻辑按照源码的作用域进行打桩 3,将打桩依赖的变量声明放到一个单独的包里,让各个桩代码引用。
ioredis源码阅读[0] 最近因为工作需要,要去搞一个 Node.js 端的 Redis Client 组件出来,暂时选择通过 ioredis 来作为 fork 对象。 因为之前有遇到过 Redis 在使用 twemproxy 时会一直出现无法连接服务器的问题,详情见 issues:https://github.com/luin/ioredis/issues/573 所以会修改源码修改这一问题 ,不过在修改完成之后跑单元测试发现,事情没有那么简单,并不只是 info -> ping 这样,所以只好去熟悉源码,然后针对性地调整一下逻辑。 ioredis 项目结构 从项目中看,源码都在 lib 文件夹下,是一个纯粹的 TS 项目。
【概述】 ---- 在很多技术交流群里,都看到过同样一个问题:如何阅读源码? 很多情况下,我们对一些开源的组件会用、或者通过官方文档、实际部署测试对其原理有一定程度的理解就可以了,不一定需要进行源码的阅读。因为阅读源码确实是一件非常耗精力的事情。 ,这里就来谈谈自己阅读源码的一些方式方法和技巧。 本文主要提到的方法如下图所示: 【按业务流程】 ---- 一种阅读源码的方式是完全按业务流程来,比如阅读消息队列服务(rocketmq、kafka、rabbitmq等)的源码,一个通用的流程是服务端如何接收生产者发送的消息并持久化存储的 对主流程的相关源码有一定了解后,可以进行一些扩展和加入一些异常因素继续阅读相关的源码。
自己对着源码敲一遍练习,写上注释。发现NIO编程难度好高啊。。
reselect源码阅读 之前就听闻了reselect是一个用于react性能优化的库,并且源码只有100多行。 可谓短小精悍,今天来阅读一波膜拜大佬们的思想 import { createSelector } from 'reselect' const shopItemsSelector = state = 下面开始阅读探读部分 先说几个简单的工具函数吧 首先是默认的比较函数,代表比较方式,可以根据业务需求换的。默认是进行全等比较 /** * 默认的比较函数,只进行一层全等比较。