- 博客(67)
- 资源 (6)
- 收藏
- 关注
原创 golang 调度之wakep和M创建
说说wakep和m的创建吧wakep调用时机和作用作用:wakep的作用是添加一个P来执行goroutinue时机:在有G变为runnable的时候 如:newproc ready wakep中调用startm来启动一个新的mstartm首先如果传递过来P是nil,则需要获取一个idle P,如果获取不到,直接返回调用mget获得一个已经睡眠m如果没有获得m,则调用newm创建一个新的
2019-04-30 08:38:41
2811
原创 golang 栈的扩大和收缩
栈扩大stack.go中的常量,用于检查goroutinue的状态 uintptrMask = 1<<(8*sys.PtrSize) - 1 // Goroutine preemption request. // Stored into g->stackguard0 to cause split stack check failure. // Must be greater
2017-04-20 16:00:04
5357
原创 golang 启动流程
找到启动函数在linux使用objdump反汇编可以看到golang编译的exe的启动代码首先使用objdump -f exe 可以看到start address 0x0808c760然后使用objdump -d exe > t.asm打开t.asm文件查找上面的start address 可以看到入口函数是_rt0_386_linux入口函数分析接下来就是找到这个入口函数了,这里因为我现在使用
2017-04-20 15:57:52
4635
2
原创 lotou详解二:service注册和单节点消息发送
代码地址lotou中通过core/handler.go来管理单机节点中注册的service注册和移除注册registerService为一个service分配一个唯一的serviceId serviceId由16的节点id和46位的本机唯一的id组成。unregisterService移除一个service,同时将serviceId写会cache。这里为了避免服务器长时间运行,频繁增删servic
2017-03-30 22:55:36
859
原创 lotou详解一:基本概念
lotou是一个基于golang的支持分布式的轻量级游戏服务器框架,主要提供游戏服务器集群的消息转发代码仓库 lotou提供了三种不同的消息发送方式: 1.Send 用于普通的消息推送,不需要返回,发送之后就不再关注 2.Request 异步非阻塞请求响应模式,request接收一个回调函数和一个超时时间,当远程服务通过respond响应或者远程服务响应超时的时候,回调函数会被唤醒。 3.
2017-03-25 23:20:23
2821
原创 7个go的基本注意事项
传递参数的时候不传递interface而传递具体类型不适用io.Writer & io.Reader, 而使用具体类型(和第一点有点重复了)传递一个很大的interface,应该传递只需要用到的interface什么时候用函数什么时候用方法:当需要状态或者修改状态的时候使用方法,如果只是逻辑,则使用函数。pointer receiver还是value receiver。指针receiver可
2017-03-12 10:06:45
702
原创 go 自己实现一个gob编解码
代码库为什么要写这么一个编解码golang内部也实现了一个gob的二进制编解码,接口简单,使用方便,但是它对interface的支持不是很好, 比如如下代码:var in []interface{} = []interface{}{1, 1.5, "abc", "123", map[int]int{1: 1, 2: 2, 3: 3}}enc.Encode(in)var out []interf
2017-03-10 16:56:20
2508
原创 go 实现一个简单的UUID生成器
查看源代码实现方法:UUID 通过三部分组成 curtime << 22 | generaterid << 12 | sequenceid具体原理如下:首先每一个UUID生成器有一个id在生成UUID的时候先取当前时间距离1970的秒数作为高位,generaterid作为中间如果本次生成的时间和上一次的时间相同,则sequenceid +1,否则sequenceid位0然后把sequenceid作为
2017-03-09 18:24:06
2790
原创 go 语言中的继承
go 语言中可以通过匿名field来实现继承的效果,type T1 struct { A int}func (t T1) Log() {}func (t *T1) Print() {}type T2 struct { T1}t2 T2{}继承效果可以通过t2.Log()直接访问T1的method,就像面向对象的继承之后一样访问,不过这里要注意的传递到Log的是T1而不是T2匿
2017-03-09 15:15:26
1343
翻译 go 用slice模拟vector功能
appendVectora = append(a, b...)copyb = append([]T(nil), a...)b = make([]T, len(a))copy(b, a)cut删除一段范围i~jcopy(a[i:], a[j:])for k, n := len(a) - j + i, len(a); k < n; k++ { a[k] = nil //or the zero
2017-02-10 11:43:46
3140
原创 go语言实现IOS OTA安装应用
现在的IOS OTA安装应用需要使用https才能安装。 要使得服务器支持https,服务器必须要有https证书。证书可以同过购买获得或者自己生成。 这里我们使用自己生成的证书,使用自己生成的证书必须在iphone上手动安装之后才能访问https服务器,否则iphone会拒绝访问未受信任的https服务器。使用openssl创建https证书生成服务器的私钥 mkdir /private/
2017-01-23 10:42:40
1037
原创 cocos2dx中的class的实现以及C++的__index搜索
metatable要理解lua的class,首先要先理解metatable的作用和__index以及lua调用table里面的函数的时候搜索函数的逻辑: 1、直接当前表里面搜索函数 如果存在,直接调用,不存在继续 2、如果表里面不存在调用的函数,会查找表的metatable的__index a、如果__index是一个表,则在该表里面查找,回到第一步 b、如果__
2017-01-11 11:40:28
1001
原创 cocos2dx增加front层并优先响应listener
需求在游戏中会有一些提示性的消息需要显示在UI的最上层,即使是在scene切换的时候也不能消失掉。比如当服务器推送某个消息的时候,需求一个弹窗来展示,但这个时候游戏刚好进行了scene切换,就会导致添加在上一个scene的弹窗消失掉,导致该提示消息无法展示。解决方法我们可以为看到cocos2dx中的调试时候的帧率就是一直显示,哪怕切换场景。这里也使用与之相同的方法。显示修改Director使之包含
2017-01-11 09:14:57
408
原创 go 判断一个文件是否存在
通过下面的代码可以判断一个指定的路径在系统是否存在。if _, err := os.Stat(path); err != nil { if os.IsNotExist(err) { // file does not exist } else { // other error }}
2017-01-04 09:10:08
15028
原创 go实现一个简单的游戏服务器框架(lotou)多节点
代码仓库在这个什么都流行分布式、大并发的时代,不支持点多节点也太说不过去了。 lotou的多节功能主要是建立在network和core模块之上的。 主要分为slave和master。在lotou的多节点中,有一个master和多个slave组成。因为lotou里面主要是针对服务进行通信,所以只要master和slave的主要功能就是对服务间 的消息进行转发。 基于多节点网络,lotou还实现
2016-12-22 14:30:00
1548
原创 go实现一个简单的游戏服务器框架(lotou)编码
代码仓库在lotou中实现了两种二进制编码方式。binary一种是普通的C/C++模式的小端编码方式,每一个数据都被依次编码进一个二进制流中,基本用法如下:编码 binary.Encode(v) binary.Encode(v)解码 binary.Decode(&v) binary.Decode(&v)使用非常简单,编码方式也很简单。还有一种是为了用于lotou内部通信(后面即将实现的
2016-12-12 14:53:41
1304
原创 go实现一个简单的游戏服务器框架(lotou)网络通信
代码仓库,目前代码比较粗糙,欢迎各种改进建议。 网络通信相关代码请查下以下链接(https://github.com/sydnash/lotou/tree/master/network/tcp)目前网络通信只实现了基于go的tcp的通信。go的tcp相关的主要接口net.JoinHostPort 将一个host和port组成一个合法的网络地址(host:port)net.ResolveTCP
2016-12-09 10:37:44
4549
原创 go实现一个简单的游戏服务器框架(lotou)基本设计
代码仓库,目前代码比较粗糙,欢迎各种改进建议。 以为go语言原生支持高并发(goroutine)和通信机制(channel),所以首先想到的就是使用这两个东西来构建我的消息分发机制。 核心思路:有一个core模块维护了所有的服务当有消息发送的时候,通过该core模块将消息发送到对应服务器的接收channel中服务中开一个goroutine来从channel取出消息并处理主要函数: co
2016-12-08 16:08:01
4483
原创 go实现一个简单的游戏服务器框架(lotou)起源
最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的skynet框架,从而对于一个游戏服务器框架有了一个基本概要了解。先来说说我对于skynet的一些理解吧。skynet理解skynet只完成了服务器最核心的一部分功能,必须消息分发,必须服务的创建、销毁以及服务间的通信。 skynet中最核心的两个部分,网络和消息分发。消息分发skynet中有一个消息队列的队列,这个队列保存了每一个服务的消
2016-12-08 15:30:30
7135
原创 go 内置函数
go 的内置函数不拥有前面提到的go的标准类型,因此内置函数不能作为一个函数值赋值给函数类型的变量。closeclose用于关闭一个channel,使用close函数要注意以下几点:关闭一个只接受的channel会导致错误在一个已经关闭的channel上发送数据会导致panic关闭一个nil channel会导致panic在一个channel关闭之后,如果channel已经没有剩余数据等待接
2016-12-08 13:54:45
2565
原创 正则表达式*和?的一个错误认识
这两天再看go的正则表达式的时候,看到关于unicode匹配的方式\p{Name}不是很明白,所以就想写程序来尝试一下,因此而引出博文标题提到的一个误区。 首先还是先解释下\p{name}到底是什么意思。 这里的{name}指的是unicode的类型对象名称,具体可在RE2 syntax中查看。其中{Han}可以用来匹配中文字符,因此下了下面的程序来验证。package mainimport
2016-12-07 09:34:30
495
原创 go控制流和一些特殊语句
send和receive语句send、receive操作是针对channel的 send : ch <- a receive: a := <- ch++和--语句在go中++和--是一个赋值语句,而不是一个表达式因此不能像C/C++那样编写如下代码: a = b++ 同时在go中只有后置,没有前置写法。a++a--if语句ifif是编程语言中最简单的条件分支判断语句,几乎所有语言都有,所
2016-12-06 14:40:44
610
原创 GO声明和作用域
作用域go语言一共有如下几个作用域:全局作用域:所有的关键字和内置类型、函数都拥有全局作用域package作用域:一个包中声明的变量、常量、函数、类型等都拥有包作用域,在同一个包中可以任意访问文件作用域:一个文件中通过import导入的包名,只在当前文件有效函数作用域以及for、if、{}自定义作用域,函数的参数、reciever、返回值都拥有函数作用域,for、if、{}内部的变量只拥有最
2016-12-06 10:49:37
2735
翻译 go语言的type的比较和赋值
type的比较两个类型要么相同要么不相同。如果两个命名类型起源于同样的声明;一个命名类型和不具名类型永远不相同;两个不具名类型相同如果他们拥有同样的字面结构且对应成员有相同的类型。具体的规则如下:两个array type相同如果他们拥有相同的element type和同样的数组长度两个slice type相同如果他们拥有相同的element type两个struct type相同如果他们
2016-12-05 22:57:08
3201
原创 go语言基本数据类型
初识GO语言go是一门新语言,他在语言级提供了并发的支持(goroutine)和通信工具channel,同时它也是一门编译型、强类型的语言,拥有内存GC机制。程序的模块通过package来组织。GO基础整数十进制整数,使用0-9的数字表示且不以0开头。八进制整数,以0开头,0-7的数字表示十六进制整数,以0X或者是0x开头,0-9|A-F|a-f组成100 1234550100 0600
2016-12-05 15:50:48
3820
3
原创 cocos2dx-lua里面class的实现的一些问题记录和思考
首先要理解lua的class,要先理解metatable的作用和__index以及lua调用table里面的函数的时候搜索函数的逻辑:1、直接当前表里面搜索函数 如果存在,直接调用,不存在继续2、如果表里面不存在调用的函数,会查找表的metatable的__index a、如果__index是一个表,则在该表里面查找,回到第一步 b、如果__index是一个
2016-04-14 14:41:12
3485
原创 opengl VAO and VBO
VBO用于存储顶点数据,包括顶点颜色、坐标、法线,以及顶点的indices。VAO则用于存储图形处理器将怎么使用VBO里面的数据,及顶点数据中哪些是坐标、哪些是颜色、哪些是法线等信息。之前对于这些总是不是太明白,因此我猜测也有一部分跟我一样不明白,所以我准备通过Cocos2d-x的renderer代码来说明有VAO和没有VAO的时候的区别,来加深对VAO的理解。首先我们来看初始
2015-08-08 09:29:20
5528
原创 在cocos2dx中,横版游戏关于相机移动的方式整理
在做横版游戏的时候,不可避免的要使用到相机移动,并且一般在2D横版游戏中为了能够模拟一些3D的效果,会使用分层移动的方式(即每一层的移动速度有一定的区别,以模拟3D中的物体越远移动越缓慢的效果。 在cocos2d中,提供了parallaxNode来实现不同层次有不同的移动速度的功能。这个node通过对加入的物体设置一个移动的scale来控制其移动速度,其实现原理是当对paral
2015-08-02 13:31:05
8047
原创 cocos2dx clippingNode的实现原理
clippingNode是利用opengl的裁剪缓冲区实现的,因为最近有使用这个功能需要,顺便把这部分实现看看了看。 opengl的裁剪主要有以下几个步骤:1、开启裁剪缓冲区2、设置裁剪缓冲区中的mask。3、正常绘制图形,这个时候会根据裁剪缓冲区的值和设置好的比较函数进行计算,根据通过与否选择是否会知道framebuffer4、绘制完成之后关闭裁剪缓冲区这几个步骤在c
2015-07-04 13:57:58
4907
1
原创 C++可变参数
这个东西很少用,每次都要到处找,所以这里做个记录。 可变参数值得是类似c语言里的printf(const char* format, ...)这样的参数,其中...表示参数个数可变。 宏也同样支持这样使用: 宏中的用法:#define LOG_OUT(format, ...) printf(format, __VA_ARGS__) 其中__VA_
2015-07-04 08:27:37
784
原创 cocos2d的armature绑定到其他armature骨骼上的bug
在armature的骨骼上可以绑定另外的armature,在我的项目中使用了该功能来完成骑乘功能,但是在使用过程发现了如下的bug,特写在这里做一下记录。首先说说cocos2dx的代码。在cocos2dx的骨骼的update函数中有如下代码用于骨骼的矩阵更新。 if (_boneTransformDirty) { if (_dataVersion >= VER
2015-06-08 22:55:16
1796
原创 cocos2d-x 3.0的clone函数
在3.0中,将使用clone函数来代替老的copy函数,在不久的将来copy函数将被删除。在使用clone的函数
2014-04-04 22:35:07
9981
原创 设计模式之abstract factory(抽象工厂)
1、意图创建一系列相关或互相依赖得对象得接口。2、参与者关系3、效果a、当提供库得时候,使用这种方式来创建对象,可以使得客户只和类得接口打交道,而隐藏其实现。b、当需要更换另一系列得产品时,只需要重新实现一个子类,并且在创建工厂实例得时候改变以下代码,其余代码都保持不变,也可以在运行状态通过一个参数来改变创建工厂实例得行为。c、保证一个应用只使用同一系列得产品,因为
2014-04-02 22:35:53
806
原创 cocos2d-x自动内存管理
cocos2d-x管理内存主要是通过如下三个函数来管理:1、retain2、release3、autorelease其中:autorelease函数是将对象加入到cocos2d-x的自动内存释放池中,然后在程序mainloop中每次循环中都会通过调用自动内存释放池的pop函数来释放管理池中引用次数只有1的对象。调用类的create函数创建对象,然后加入到au
2014-04-02 21:53:41
1110
原创 关于keypad_dispatcher中的dynamic_cast的问题
在CCKeypadDelegate.cpp文件中,有这样一句关于dynamic_cast的引用dynamic_cast(m_pDelegate)->release();其中,m_pDelegate的声明如下:class CC_DLL CCKeypadDelegate{public:virtual void keyBackClicked() {}virtual void
2014-04-02 08:58:28
709
原创 cocos2d-x 2.0+eclipse+winxp配置
配置cocos2d-xandroid开发环境。1、在andorid developer官网下载adt-bundle-windows-x86-20131030.zip该文件继承了eclipse和CDT ADT以及android sdk,这个文件直接解压,不要移动解压之后的文件的位置。加压完成之后进入加压目录会有eclipse和sdk两个目录。进入eclipse目录启动ecl
2014-04-02 08:53:58
1850
原创 calcHist的使用
opencv提供了calcHist函数来计算图像直方图。 其中C++的函数原型如下:void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArrayhist, int dims, const int* histSize, const float**
2012-04-11 20:21:28
39606
1
原创 一种使用QThread线程的新方法QObject::moveToThread
昨晚在一个邮件列表里面看见一个关于在线程种使用signal/slot的讨论,由于回复太多,这里就不贴出原文了。 主要是关于怎样从一个线程发送信号到另外一个线程的问题。其实这个也不是什么复杂的问题,在qt的asstant里面已经描诉的比较清楚了。当我们链接信号的时候使用qt::queuedConnection就能使slot在它自己的线程里面运行。 另我惊讶的是在其
2012-04-04 17:24:11
72242
5
转载 GIT server build up
GIT server build up前几天说的任务启动了,虽然server还在采购流程中。但已经在一台PC机上搞起来,供小组内部测试啦。在此把过程记录下来吧:硬件需求:一台linux电脑,在公司局域网下有独立IP,并且保证小组每个人都能ping通;软件需求:git-core, gitosis, openssh-server, openssh-client安装git和o
2012-02-01 16:42:58
1655
原创 设置QTableView的默认行高
通过调用QTtableView的verticalHeader()->setDefaultSectionSize(15)可以设置tableview所有行的默认行高。
2012-01-16 09:26:38
15811
敏捷软件开发:原则、模式与实践
2011-07-01
linux设备驱动程序示例源代码
2010-12-25
数据结构与算法分析-c语言描述
2010-12-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人