Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
spine优化
项目背景项目使用unity做游戏,并使用addressables方案管理资源,基于spine作为很多unity的骨骼动画实现方案,在我们的项目中有一些不合理的地方:
使用ScriptableObject作为桥接SkeletonData和Unity的方案,导致skel文件在加载完成之后不会卸载,这导致Spine动画很多的情况下会导致很多的Native资源占用;
Spine动画使用的地方很多,但是大部分时候只会播放一个动画;
为此我们实现了两个Spine方案上的改动:
SkeletonData加载完成之后手动卸载skel.bytes文件;
按照动画名字拆分Spine文件中的动画,按需加载Spine动画文件;
下面是具体实现
spine资源卸载
该功能主要是针对skel文件加载完成之后不回收的问题
SkeletonDataAsset作为桥接Spine和Unity的承载类,主要是指定使用的Spine资源,这些资源直接使用unity的引用关系关联,加载SkeletonDataAsset的时候会自动将关联的资源加载进入内存,读取完成之后没有卸载对应的资源,导致部分TextAsset资源开 ...
kafka学习
kafka 学习windows 上的 kafka 学习和安装相关的问题
一. 下载 kafkakafka 使用 java 实现并且官方提供了 windows 的支持,所以直接下载就完事了,将其解压到一个文件夹下,如我在 D:\kafka,这里版本是 3.20,其他版本可能会有点不同.整体路径如下,分别是
bin: 提供的一些已经写好了的 shell 命令文件和 windows 下面的 bat 文件
config: 一些已经配置好的文件,如 kafka server 的配置,zookeeper 的配置,consumer 和 producer 的配置
libs: jar 包和一些依赖
licenses: 开源协议证书
二. 启动 kafka 单实例激动人心的时刻来了,我们下载了文件,安装了 jdk 环境(一般都会有环境吧),然后设置 properties 文件,在这里我随便贴一下要注意的 properties 文件,定义了后面需要用的端口:
1234# file:config/server.propertieslisteners=PLAINTEXT://127.0.0.1:9092 ...
goStringBuilder使用
go strings.Builder 使用前言本人最近在找工作,面试的时候有一个手撕题目,这里题目描述如下:
问题描述12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// 实现一个textProcessor, 要求能够将对应的文本中的tag转换为之前设置过的内容:// 示例如下// set_variable("name", "lixiande")// get_text("Dear interviewer [name], welcome to our interview! ) // 应当是Dear interviewer lixiande, welcome to our interview!// 由于最近使用go比较多,所以直接使用go实现type TextProcessor struct { record map[string]string}func NewTextProces ...
从三色旗到快排
从三色旗到快排三色旗问题使用一次遍历将一堆0,1,2的数字按序放在不同区域,形成0..01..12..2的数组,这个问题解决方法可以两个指针分别指向下一个 0 要占据的坐标、下一个 1 要占据的坐标:
123456789101112131415161718192021func partition(nums []int){ p0, p1 := 0,0 for i := 0; i < len(nums);i++{ if nums[i] == 0 { // 当前数为0则占据p0现在的位置,并将数据交换 nums[p0], nums[i] = nums[i], nums[p0] // 如果p1>p0代表最少有一个1也就是当前序列是0...0 1...1 xxxxxx // 此时p0指向的是第一个1的位置,发生替换相当于将第一个1换到了0, // 然后第一个1去了i的位置,这个时候需要换回来 if ...
Lua实现数据拦截和简单的依赖收集
仿写 vue - 实现数据拦截和简单的依赖收集简单仿写 vue
step1 拦截赋值和取值操作拦截数据访问和获取关系
123456789101112131415161718192021222324252627282930313233343536373839404142function newProxy(model) local t = {} local raw = {} if type(model) ~= "table" then return model end for k, v in pairs(model) do raw[k] = newProxy(v) end setmetatable(t, { __index = function(t, key) print("get key " .. key) return raw[key] end, ...
lua数据劫持
vue proxy实现
之前尝试实现vue数据劫持,里面有一些方法实现不是很好,经过查阅#lua.org,实现了基本操作的劫持;
基本数据类型lua作为一个脚本语言没有封装更多的数据结构,除了原生的number、string、boolean、数据结构,其他数据都是table,和js不同的是 table 没有区分出list和map两种,这里为了方便区分,封装了一个简单区分的方法
123456789101112131415---@param model tablefunction isArray(model) -- 连续数据区长度大于0 return #model > 0endfunction isMap(model) local len = #model -- 当len为0的时候 next会出错, 默认为true if len == 0 then return true end -- 除了array区域还有数据,则为map return next(model, len) ~= nilend
有了这两个数据类型我们可以按 ...
缓存设计
缓存设计
在读多写少的服务中,可以通过缓存将一些代价较为高昂的请求结果保存,比如对数据库的读取请求或者一些复杂操作结果进行保留,实现较高的性能。因而缓存是一个比较通用但是又效果良好的手段去增强我们的服务性能。
缓存结构缓存一般有三个对象即请求方、缓存、存储层;请求方一般是想要获取存储层的数据,但是存储层数据往往可能会涉及磁盘 io 导致请求时间开销较大,因而使用内存缓存请求结果,下次获取同样的数据先在缓存层获取再在存储层获取:
缓存优缺点优点
降低响应时间,内存操作一般在 100ns 之内而涉及请求或者磁盘 io 的性能一般至少在 10ms 左右,因此使用内存缓存能够极大降低系统吞吐能力和响应时间;
降低后端负载,使用缓存能够极大程度降低下游负载,尤其是对于很多服务都在用的存储层而言,降低负载能够减少存储层崩溃的可能;
缺点
增加复杂度,最简单的增加一个缓存层会增加代码层面的复杂度,增加一个缓存中间件会增加整体系统的复杂度;
数据一致性问题:缓存层和存储层中间数据同步过程中会有一定的时间出现缓存数据和存储数据不一致;
虽然如此,但是缓存的效果太好,一般而言,如果同一份数据会被请求 ...
detectron2 windows 安装过程
什么的是detectron2detectron2 是fair开发的目标检测、语义分割等的对比平台,集成了很多适合用来快速构建自己的目标检测、语义分割的模型和对应的预训练模型,但是官方文档里面只有linux和mac上的安装过程,虽然双系统很不错,但是还是windows能完成是最好的,所以这里介绍windows下需要进行的一些安装配置过程。总的来说分为一下几步:
python安装
cuda和cudnn安装
pytorch 1.3安装
detectron2 windows安装
python 安装当然,windows上需要面对很多奇怪的库的配置,和虚拟环境的需求(虚拟环境真的很重要),所以我选择conda,我电脑上安装的是anaconda3.7的版本,基本上就是截止到目前最新的版本了。但是pytorch环境的版本还是选择了目前来说最为稳定的python3.6,说句实话,几年前配置caffe的时候让我认识到版本这个东西真的很重要,差一点就等同于没有环境。那么还是那样,先创建相应的环境,在此之前先检查一下conda有没有添加到路径中:conda -v ,若是报错就是