自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 golang 包管理机制

golang 通过goroot, gopath对项目进行管理,goroot目录安装go语言包,gopath作为workspace放项目代码。同时将goroot, gopath加入系统的环境变量即可。golang在import依赖库的时候,是使用相对于gopath/src目录下的相对路径。当使用go get命令时,会扫描源代码里面的import语句,将相应的第三方引用下载到gopath/src下对应...

2019-02-18 15:45:42 341

原创 golang channel实现

golang 在多协程之间交互,除了支持传统的通过共享数据来进行通信(公共数据加锁),更推崇通过通信来共享数据。所谓的通过通信来共享数据,借鉴于csp并发模型(两个独立的并发实体通过共享的通讯管道进行通信的并发模型),即通过共享的channel在多个goroutine之间传递数据,达到共享数据的需求。这里主要谈谈channel是如何实现的,先看看源码:type hchan struct ...

2019-01-28 16:17:08 294

原创 golang defer详解

defer 在golang 中充当try catch捕获异常的作用,这里详细叙述一哈defer的用法和注意事项。1.在一个函数中存在多个defer ,defer 采用先入后出的顺序执行。2.defer在声明时,会优先执行函数中的参数,延迟执行的是函数体。3.函数在中途panic的时候,只会执行当前代码行之前的defer,如果之后还有defer则不会执行。4.如果os.exit()强...

2019-01-03 15:21:04 391

原创 golang 内存分配

golang 的内存分配类似于tcmalloc(全局缓存堆和进程所属私有缓存)内存分配策略,大致采用三层内存分配模式。其中主要分为mheap, mCentral, mCache.mheap:直接向操作系统申请内存,申请对象以页为基础单位,同时还负责大内存的直接分配。mCentral:作为上级mheap, 下级mCache的中间项,起承上启下的作用, 当下级mCache内存不够时,mCach...

2018-12-11 16:08:27 616

原创 golang slice map 的一些常见坑

1,常看到有博客或者书说道,golang内部有引用类型,这里说明一哈,golang里面所有的类型都是值类型,之所以有些用起来像引用,是在于该类型内部是用指针实现的,但是其本质就是包含指针的结构体。我们常常用错的类型就是Slice.以下是slice这个类型的实现:type slice struct { array unsafe.Pointer // 内部是分配一个连续的内存块,这个指针...

2018-12-04 10:15:37 8385 2

原创 解码mmo游戏服务器三:大地图同步(aoi)

问题引入:aoi(area of interest).在大地图中,玩家只需要关心自己周围的对象变化,而不需要关心距离较远的对象的变化。所以大地图中的数据不需要全部广播,只要同步玩家自己视野范围的消息即可。解决方案:1:灯塔法。所谓灯塔法,即将大地图划分成有限的小格子,在每个小格子中间放一个灯塔,这个灯塔管理两个队列:一个是本格子内所有的对象集合,另一个是对本灯塔感兴趣的对象集合(简称观...

2018-08-17 14:25:51 6239 1

原创 解码mmo游戏服务器二:地图自动寻路

问题引入:在mmorpg游戏中,玩家点击某一个任务,玩家就会自动跑到接收/完成任务的npc位置处,这个就是自动寻路。对于前端而言,已经不太需要了解自动寻路,因为现在引擎或者地图编辑器已经帮忙实现了这一功能,但是服务器依然需要了解并实现自动寻路。整个流程是:前端开始自动寻路,计算出路径(一组节点的集合),然后前端在这些节点的集合中选出一部分关键点,发送给服务器,服务器接收到消息,同时开始计算寻路...

2018-08-17 11:18:55 2845

原创 解码mmo游戏服务器一:时间轮的引入

问题引入:在mmorpg游戏中,群战的时候,玩家释放技能,这时候会出现技能冷却时间,每一个技能都是一个定时器,或者在slg游戏中,玩家修建房屋,创建基地,都会产生一个延时操作,等到了指定时间后,完成房屋修建等任务!!!!!轮询的尴尬:使用一个定时器,定时遍历多个链表,判定链表里面的任务是否到期! 效率低下,每一次遍历都需要筛选定时器,时间复杂度O(n).多定时器的尴尬:同时创建多个定时器,...

2018-08-17 10:49:56 1568

原创 redis

Redis 介绍Redis是一个开源的高性能的key-value存储系统。具有以下特点:1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,sorted set,hash等数据结构的存储。3、Redis支持数据的备份,即master-slave模式的数据备份...

2016-04-21 15:18:53 474

原创 linux io模型

1.同步io(synchronousio):   同步和异步,这两个概念与消息的通知机制有关。也就是同步与异步是从消息通知机制角度来说的。举例来说,当funcA 调用 funcB时,funcA必须等待funcB执行完成返回后,funcA才会继续执行,二者保证顺序执行2.异步io(asynchronous io):         异步跟同步恰恰相反,当funcA调用funcB时,f...

2015-05-28 19:08:14 539

原创 事务

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:⑴ 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。⑵ 一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到...

2014-02-18 20:49:56 923

原创 redis 三种集群模式

一:主从复制该模式下,需要一主多从, master负责读写, slave只负责read, 该模式下分摊了master的读压力,缺点是,不具备容灾能力,master挂掉,集群挂掉,slave不能代替master执行后续操作,同时主从复制不具备扩容平行扩容能力。优点是,实现简单,slave同步master的数据,可以实现读写分离.二:哨兵模式该模式是基于主从复制,在此模式下加入sentinel, sentinel的作用就是监控所有的主从服务器,当发现master挂掉后,从slave中选举一个服务器作

2020-09-16 10:51:15 183

原创 git 常用命令

git 查看最近或某一次提交修改的文件列表相关命令整理。git log --name-status 每次修改的文件列表, 显示状态git log --name-only 每次修改的文件列表git log --stat 每次修改的文件列表, 及文件修改的统计git whatchanged 每次修改的文件列表git whatchanged --stat 每次修改的文件列表, 及文件修改的统...

2020-04-07 11:08:07 199

原创 mongo profiler 进行慢日志分析

profiler 是mongo 提供的用于记录慢日志的命令的攻击,默认是关闭状态。如果开启:启动参数里直接进行设置,启动MongoDB时加上–profile=级别。   也可以在shell调用db.setProfilingLevel() 命令来实时配置。获取level等级:db.getProfilingLevel()设置level等级:db.setProfili...

2019-12-14 17:08:12 235

翻译 工厂模式

工厂模式的定义GOF为工厂模式的定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂模式的分类:(1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。(2)工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Fa...

2019-02-12 15:39:14 154

原创 观察者模式

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类图:在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;那就是一个对象要时刻监听着另一个对象,只要它的状态一发生改变,自己随之要做出相应的...

2019-02-12 11:35:30 164

原创 单例模式

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。实现单例模式的思路是...

2019-02-11 17:49:25 141

原创 解码mmo游戏服务器四:如何实现玩家状态的高同步性

问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以client B收到的消息总是滞后的,这对于高精度高技巧性的游戏的无法容忍的。解决方式:首先要实现网络对时操作,所谓对时,并不是要求客户端时间跟服务器保持一致,而是通过在数据包中加入时间戳,算出数据包...

2019-01-28 17:46:20 2353

原创 leetcode shuffle算法

// 原始的洗牌算法,遍历数组,每次随机一个,删除,再随机// 时间复杂度O(n2)func shuffle(source []int) []int { result := make([]int, 0) for len(source) > 0 { j := rand.Intn(len(source)) result = append(result, source[j]) ...

2018-11-28 20:03:22 308

原创 stl--容器

容器用来管理一组数据,通常分为两类:sequence containers(序列式容器),associative containers(关联式容器)。sequence containers指的是每个容器内的元素是有固定的位置,它的顺序和插入的顺序相同。分别包括:vector, list ,deque.associative containers 值得是容器内元素的位置取决于排序准则,与插入...

2018-08-31 22:29:02 133

原创 leetcode golang实现 给入一个无序的数组,求出数组中两个元素和为m的下标

package main/* 给入一个无序的数组,求出数组中两个元素和为m的下标*/func twoSum(array []int, sum int) (int, int, bool) { // 使用map存储对应下标的元素需要的另一半 tempMap := make(map[int]int) for i := 0; i < len(array); i++ { // ...

2018-04-03 16:58:29 451

原创 leetcode golang实现 --------------- 实现一个数的整数次方 pow(x, n)

package main/* 实现一个数的整数次方 pow(x, n)*/func pow(x float64, n int) float64 { if x == 0 { return 0 } result := calPow(x, n) if n < 0 { result = 1 / result } return result}func calPo...

2018-04-03 16:57:15 5523

原创 leetcode golang实现-----------------给出一个字符串,求出不重复的子字符串的最长长度

package mainimport ( "strings")/* 给出一个字符串,求出不重复的子字符串的最长长度*/func lengthOfLongestSubstring(s string) int { if len(s) == 0 { return 0 } // 子字符串的头尾索引 i := 0 j := 1 // 最大长度 maxLen := 0...

2018-04-03 16:54:41 768 1

原创 git用其他分支覆盖到另一个分支 and 删除远程分支

git checkout master // 切换到旧的分支git reset --hard develop // 将本地的旧分支 master 重置成 developgit push origin master --force // 再推送到远程仓库当把强制覆盖后的分支推送到远程分支时,可能会提示无权限,这个时候需查看该分支是否处于被保护状态,取消该选项就可以提交

2016-11-23 15:58:17 4644

转载 Git忽略规则及.gitignore规则不生效的解决办法

在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:?1234567# 此为注释 – 将被 Git 忽略 *.a      #

2016-08-18 11:46:17 449

原创 真正的两张图片循环滚动

现在很多教程实现的两张图片循环滚动并不是真正的a->b, b->a,a->b,b->a这样滚动,而是a->b,a->b这样循环播放。(a,b分别代表两张图片)实现这样的想法,只需要定时检测第一张图片,如果第一张超出屏幕,就把第一张图片放置在第二张后面即可,这样之后,第二张图片就变成了第一张,相当于进行了一次置换。相当于两张图片进行循环移位。void HelloWorld::update

2016-03-22 16:02:13 2247

原创 回溯法

//回溯法//8*8的格子,每个颜色由1--5组成,给定任一一个格子,求出所有与格子相邻且颜色相同的格子的个数。int map[8][8] = {{1,1,2,1,},{1,1,2,1},{1,2,1,2},{1,1,1,1},{1,1,2,1},};int dir[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };in...

2016-03-12 18:11:05 1478

原创 c++ lamdba表达式

lamdba就是一个匿名函数,是一个局部函数,也是一个闭包。基本的表达式:1:     [capture]   表示在body中以怎样的形式捕获外部变量:[]  : 不capture外部变量[=]:以传值的形式capture外部变量[&]:引用的形式capture外部变量[this]:在类方法中使用lamdba,将this提供给capture,以实现对类方法与成员变

2016-02-21 00:55:47 1327

原创 浅析c++智能指针

为了解决c++中的内存泄露问题,c++98引入了auto_prt的解决方案。void func(){classA* prt = new classA;.......//perform some operationsdelete prt;}通常我们会忘记执行delete操作,有时候即使没有忘记delete,但是如果在中途产生异常,程序会立即终止,函数即刻退出,这个时候,还

2015-11-26 15:28:05 560

转载 VC包含目录、附加依赖项、库目录及具体设置

VC包含目录、附加依赖项、库目录及具体设置包含目录:#include 中headerfile.h的搜索目录。如果有XXX.h找不到,设置这个目录可以解决。附加依赖项:C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,*.cpp,*.cc,*.c会被打包成一个.lib文件,这样可以保护源代码。所以,要使用一个库,除了要includ

2015-07-08 20:15:56 1825

原创 强制类型转换

#include #include class A{public:/* data */virtual Aoo(){printf("this  is base A function\n");}};class B{public:/* data */virtual Boo() {printf("this is base B

2015-06-23 17:46:51 782

原创 lua--函数深入:闭合函数,局部函数,尾调用

lua函数具有两大特征:函数作为第一类值,函数具有特定的词法域(Lexical Scoping)所谓第一类值:代表函数和其他传统类型的值是等价的(例如数字和字符串),函数可以同他们一样存储在变量,table中,可以作为实参传递,可以作为函数返回值。对于第一类值,需要讲明,函数和其他值一样都是匿名的,是没有名字的。而我们平时所说的函数名,如print(),都只是一种语法糖,一个持有某个函数的

2015-06-13 12:36:37 6857

原创 lua--函数.变长参数 and 具名实参

variable number of arguments :变长参数,指函数可以拥有不同数量的实参。当函数需要一个或者多个参数时,可以使用...代替这些参数。此时...为表达式,表达式...的行为类似于一个具有多重返回值的函数,返回当前函数的所有参数。e.g.       function add(...)       local s = 0                 f

2015-06-11 20:14:24 2630

原创 lua--函数之多重返回值

lua函数在调用时,必须将所有参数放在一对圆括号中,即使没有参数。但是如果参数只有一个,而且参数是一个字面字符串或者table构造式,那么圆括号就可有可无。e.g. print"hello girl"             --->           print("hello girl")        print'hello boy'             ---->    

2015-06-11 19:05:21 846

转载 Node isRunning函数

比如子弹的问题,当超过屏幕我们就从layer中 removeChild 将这个子弹移除掉。那么,是否有状态来判断这个子弹是否已经被移除了呢?那就是通过 isRunning函数来判断,如果这个子弹还在layer中 那么isRunning返回true;如果调用了 layer->removeChild 那么isRunning则返回false;那么 isRunning这个函数的状态是什么时

2015-05-15 00:04:06 1599

转载 关于vim复制剪贴粘贴命令的总结

关于vim复制剪贴粘贴命令的总结最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了。首先是剪切(删除):剪切其实也就顺带删除了所选择的内容,所以既可以当剪切命令用,也可以当删除命令使用。 1 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d

2015-05-12 18:49:25 2142

转载 为什么C++中的类不能定义自身类的对象,而java可以

在C++的类定义中,是不能够在类中定义自身类的对象的,但是可以定义自身类的指针对象和引用。class A{public: A () {  cout }; A aa;}; void main(){ A aaaaa;}以上代码编译提示错误,a' : uses 'A', which is being defined。如果

2014-11-12 11:29:36 1999

转载 提高你开发效率的十五个Visual Studio 2010使用技巧

相信做开发的没有不重视效率的。开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS。能够对一个IDE产生依赖,说明这个IDE确实有它的独特之处。无容置疑,VS是一个非常强大的IDE,它支持多语言编辑。支持C#,VB,C/C++,HTML......它拥有强大的调试编译功能。它让我们不用去记住那些安装,环境变量设置,服务器设置,编译的繁琐过程。高度集成化。凡事有利有弊,在敏捷开发盛行的时代

2014-04-17 10:01:42 727

转载 c++ 内部模板类如何继承

#include templatestruct A{    template    struct B {};};templatestruct C : A::template B{    C()    {        std::cout     }};in

2014-04-16 10:51:13 716

原创 判断点是否在三角形内

概述给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内。这是游戏设计中一个常见的问题。需要注意的是,这里假定点和三角形位于同一个平面内。本文介绍三种不同的方法,由浅入深一 内角和法连接点P和三角形的三个顶点得到三条线段PA,PB和PC,求出这三条线段与三角形各边的夹角,如果所有夹角之和为360度,那么点P在三角形内,否则不在,此法直观,但效率低下。二 同向法...

2014-03-31 21:52:19 588

空空如也

空空如也

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

TA关注的人

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