自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (2)
  • 收藏
  • 关注

原创 老友小明哥-个人简介

b站个人主页(可以看看免费视频):老友小明哥的个人空间-老友小明哥个人主页-哔哩哔哩视频

2023-11-21 10:48:51 82

原创 [深入解读LRU I]分桶式LRU

触发热数据令牌桶发现热数据如果是冷数据还触发LRU,两次访问之间请求的时间大于数据缓存的超时时间,那就是必然的冷数据。最后可能就只会只是多判断了一个缓存,结果是每次访问都会击穿缓存。分桶式,减少锁竞争...

2020-10-19 19:26:25 485

原创 [redis源码]底层文件删除原理

基于这样的一个事实,redis在重命名文件时(重命名文件,目标文件可能会被删除),先调用了一次open,将引用计数加1;后台再通过I/O线程,异步将文件删除;这样就不会阻塞redis的主逻辑线程(因为redis本身是单线程

2020-09-06 19:43:20 473

原创 游戏服务端之C++封装Mysql

很多缺少实际工作经验的同学会认为,操作Mysql还需要封装?!直接写sql语句操作就可以了。其实封装Mysql有以下的好处:1、更加安全。即使你是相当谨慎的一个程序员,就算在几百处甚至几千处地方写sql操作Mysql也避免不了会出现写错表名,字段名写错了或者写少写多了,符号写错等等。封装可以解决这些问题。2、更好的移植性。封装其实就是一些共性的集合,这样当然具有更好的移植性了(这样能方便像

2020-08-18 21:16:33 4031 7

原创 [redis源码]LZF压缩算法

文件lzf.hlzfP.hlzf_c.c (压缩)lzf_d.c (解压)压缩默认模式是VERY_FAST核心思想对重复值进行压缩通过hash表来判断是否重复数据三种模式模式(压缩)时间(压缩后)空间ULTRA_FAST极端快大VERY_FAST非常快中普通快小变量LZF_HSLOT_BIAS 64位系统,是in_data的起始地址ip 输入游标op 输出游标hval 整型,当前游标的4位数值ip[

2020-08-16 14:16:53 4890

原创 [go算法]左括号补全-双栈法

输入:1+2)*33-44)*555-666)))输出:((1+2)*((33-44)*(555-666)))双栈法,顾名思义,就是用两个栈来实现整个算法。一个栈保存数据,另外一个栈保存运算符。代码实现及注释:package main import "fmt" /* 左括号补全算法*/ type stackString []string func (s *stackString) Push(v string) { *s = append(*s, v)}

2020-08-06 22:30:15 236

原创 [redis]Glob模式匹配

Glob模式匹配,它不像正则表达式这样具有丰富的语法,但是,它是一种相当简洁高效的一种模式匹配。代码简单,规则简单,因此其运行效率同样非常高效。其广泛应用于不同的系统,例如我们常用的Linux ls 命令。通配符描述*匹配任意长度字符?匹配一个字符\\匹配转义符 \[a-z]匹配大于等于a,小于等于z;适用任何字符[0123456789]匹配大于等于0,小于等于9;相当于[0-9][^]非,匹配不相等字符[^a-z]不匹配大

2020-08-02 19:32:45 707

原创 一个简单高效的命令解析代码

管理命令:GM(game manager),直播管理命令;一般是运营,管理人员,管理场景,管理房间等使用。调试命令:例如实时查看进程信息,机器资源使用情况,打印详细日志等等。权限命令:例如实时开通白名单/黑名单,给用户分配临时权限等等。调度命令:人为实时更改函数调度,进程调度,机器调度等,流量分发、流量限制等,服务升降级等等。

2020-07-18 13:06:53 370

原创 [go设计模式]工厂方法模式

简单工厂就是生产整个计算器,而工厂方法只生产计算器的一部分;原有的简单工厂可以生'+' '-' '*' '/' ;但是如果添加新的部件'%',厂房就需要扩充、修改很可以会影响原来部件的正常生产,这就违背了开放封闭原则;而工厂方法则不存在这个问题;我新开一个工厂专门生产'%'就可以了。package mainimport ( "fmt")type Operation interface { Exe(int, int) int}type FactoryAdd struct{

2020-06-07 19:07:02 212

原创 适配器模式lua实现

--[[ 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——Gang of Four 应用: 例如跨国公司开会,每个地区的领导说着不同的语言,但与会者却是不同地区的人,因此领导人需要翻译,这个翻译就是适配器。 例如我们玩游戏,特别玩以前不同平台的游...

2019-10-11 21:27:55 2767

原创 [go设计模式]简单工厂模式

优点工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。缺点由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了...

2019-10-06 22:31:41 378

原创 一个C++的ElasticSearch Client

ElasticSearch官方是没有提供C++的client的;因此决定自己写一个,命名为ESClienthttps://github.com/ATinyAnt/ESClient(手下留星 star)优势是简单易用:*封装大幅度减少了直接写DSL的机会,避免了一些非逻辑错误*只需要包含头文件 request.h即可以使用因为...

2019-07-17 22:05:24 2850 3

原创 游戏中的离线玩家

一般的游戏架构都有 数据库 + 缓存 这样的存储机制,而这个机制决定了离线玩家的实现方式。其中一种很常用的做法是将所有玩家的信息全部都加载到内存中,当要查找离线玩家信息时,直接可以在内存中获得,不需要再到数据库中查找。其实我一直觉得这其中有一些问题,那就是随着时间的推移,内存的有效利用率越来越低。原因很简单,(从趋势上来讲)整个游戏的玩家活跃度会随时间慢慢降低。特别是合服之后,这种负面效果将会加倍

2015-09-04 11:24:07 2627

原创 堆 在游戏中的运用

* 定时器的应用与原理:游戏中,活动的状态、游戏数据的保存与加载、BOSS刷新时间等等,都可能会用到定时器。而堆对于定时器的实现有着至关重要的作用。定时器的工作原理其实不难,就是内部保存多个时间及其回调函数,当系统时间达到我们保存的时间值时,就执行回调函数;从而达到定时工作的效果。同时,判断是否达到指定时间时,只需要判断最早的时间(最早的时间没有达到,更晚的时间肯定不会达到),因此需要对时

2015-07-09 00:04:11 1990

原创 redis client protocol 实现

在官网中http://redis.io/clients有许多已经实现好的redis client;有需要可以参考一下。其实前一篇http://blog.csdn.net/yitouhan/article/details/46612925 redis client protocol 解析,我已经对RESP做主要的解析。下面是解析RESP的所有函数,其中对外函数是RedisProtoc

2015-07-01 13:25:16 1629

原创 redis client protocol 解析

在官网http://redis.io/topics/protocol有对redis通信协议有做说明。基于下面的一些原因,我想解析redis client protocol:1、足够了解通信协议,有助于做出更好的系统设计。2、学习RESP的设计思想,不仅能扩展我的思维,也许将来能应用于我的代码中。3、因为有些人想将redis client直接并入自己已有的系统中;包括我在内。这个

2015-06-24 00:14:04 3061

原创 A*寻路算法(曼哈顿距离)

前一些天,在群有人问到A*算法的问题。之前我已经有实现过,并将之放到github上(https://github.com/ATinyAnt/A_Star);有兴趣的可以下载下来看看。这里上传了一个相当好的A*算法演示程序,大家可以下载下来看看效果:http://download.csdn.net/detail/a374826954/8781185。下面描述是摘自清华大学出版社《人工智能》一...

2015-06-08 00:00:15 20032 1

原创 游戏中的随机--转换思维

文章中的标题是“游戏中的随机--转换思维”,有一个关键词是“随机”;但是随机这个说法过于笼统,因此我主要说一个具体化实例:随机坐标。随机坐标在游戏中相当常见,例如掉落、怪物生成、采集生成或者是一些活动中的藏宝地点。随机出一个坐标不难。那随机出一个不重复的坐标呢?其实也不难!还能好好说话吗?就是要讲述如何做出一个高效及简洁的随机坐标模块!我知道相当一部分人设计随机坐标模块的思

2015-04-15 13:30:44 1828 1

原创 序列化的作用

前言:本文以C++语言作为讲解序列化的作用。序列化是什么?一般说到序列化,其实是包含了反序列化。以C++为例,序列化就是将结构体(或者是类)等复杂的数据结构的各个属性有序地保存到字符数组。而反序列化就是将有序的字符数组还原回结构体(或者是类)等复杂的数据结构。序列化作用1、方便网络传输我们都知道,socket的数据都是以字符串进行传输,而序列化的作用就是

2015-03-12 09:16:15 8463 3

原创 使用桥接模式时要注意的问题

什么是桥接模式?举个例子:平时我们我们的USB(Universal Serial Bus(通用串行总线)),其实其设计的模式就是桥接模式。桥接模式的作用就是:将抽象部份与它的实现部份分离,使它们都可以独立地变化。也就是说无论USB插的是U盘,还是小风扇。都只是外部的独立变化,电脑内部是不受影响。不扯远了,这里不是主要说桥接模式的用法。下面看看使用桥接模式需要注意一个小小的问题。http://blo

2014-11-26 00:06:29 3873 5

原创 用gdb调试游戏服务端

前言说说gdb的重要性一般来说,提到gdb,都是用命令来调试。“命令”,这个对于用户来说几乎等同于繁杂的词语。尽管事实确实如此,但实际的开发调试必须用到gdb。现在,大多数Linux系统是存在于服务器当中。我们想操作这些系统时,一般是通过Terminal来操作。也就是说这些Linux系统不具有图形界面。而调试一般分两部分,开发时调试和运行时调试。当我们的程序部署到Linux上时,那就需要忘

2014-11-17 00:15:00 3973

原创 一种有效避免死锁的互斥锁设计

下面是摘自网络的一段话,我觉得很好;对认识锁很有帮助。“为什么要加锁?加锁是为了防止不同的线程访问同一共享资源造成混乱。打个比方:人是不同的线程,卫生间是共享资源。你在上洗手间的时候肯定要把门锁上吧,这就是加锁,只要你在里面,这个卫生间就被锁了,只有你出来之后别人才能用。想象一下如果卫生间的门没有锁会是什么样?什么是加锁粒度呢?所谓加锁粒度就是你要锁住的范围是多大。比如你在家上

2014-06-29 00:39:34 3937 5

原创 用python写makefile

温馨提示:阅读本文的同学最好能了解makefile和python的编写规则。不懂的同学可以先保存在收藏夹,以便日后查看。其实之前我一直很懒,我不想了解makefile规则,因为在linux下开发我一直使用Qt creator。(很多时候正是一些“懒人”的创造力,解放了我们的双手,显然

2014-06-14 00:13:11 13282

原创 游戏服务端为什么需要登录服?!

注:这篇文章不仅会说登录服,还会说一些其它游戏相关的事哦!我们都知道,很多游戏在上线时,都会大肆宣传,最近宣传比较多的就是《激战2》了。(当然我不是《激战2》的水军)很多玩家都会提前坐在电脑前,等候游戏官方给出的开服时间,抢点进入游戏,因为这样能占据时间的红利,可以在游戏中占个好排名

2014-05-31 00:03:27 3810 4

原创 我的服务端之有限制使用Thread

前言:多线程是一把双刃剑,不要盲目使用多线程!使用多线程的优点:1、支持并发。2、提高程序执行效率,这里又可以分为两种情况:单线程情况下,I/O操作会让CPU处于"等待"状态,因此多线程能更好利用CPU;多核CPU的出现,让多线程程序有更好的执行效率。缺点:1、造成一定的线程切换开销。2、资源容易出现竞争,甚至死锁。3、多个线程"同时"对某块内存进行读写,容

2014-02-08 00:04:08 2441 5

原创 游戏服务端之内存池

内存池(Memory Pool)一、前言1、操作系统的内存分配方式1.1、连续分配方式顾名思义,这种分配方式,会将进程分配在连续的空间。连续分配方式一般可以分为固定分配方式、动态分配方式和伙伴系统(固定分配方式与动态分配方式的折衷方案)。1.2、基本分页存储管理方式1.3、基本分段存储管理方式注:以上说的分配方式,自个可以到网上去搜索一下,方便理解以下内容。

2014-01-05 00:03:23 6096 15

原创 游戏服务端之AOI概述

AOI(Area Of Interest),中文就是感兴趣区域。通俗一点说,感兴趣区域就是玩家在场景实时看到的区域;也就是AOI会随着英雄的移动改变而改变。一般在游戏的中,游戏的世界都是由各种场景组成,场景中有着各种各样的Obj(英雄、怪物、NPC和掉落物品等等)。当英雄在移动的时候,玩家需要看到其它在自己视野内玩家的英雄;需要看到在自己视野内的怪物;需要看到打BOSS掉落的物品;……。有

2013-12-29 00:27:53 12942 2

原创 游戏服务端之xml类型转换

上一篇博文我已经说明了服务端添加tinyxml的基本操作及基本用法。我的服务端之添加xml解释器http://blog.csdn.net/yitouhan/article/details/17453159但是可以看出tinyxml读出的数据是不做类型匹配的,也就是说tinyxml读出的数据都是字符串。但是在实际应用中,我还需要其它的数据类型,例如整型和浮点型。这里主要要说明的是istr

2013-12-23 00:02:15 3065 1

原创 游戏服务端之添加xml解释器

在游戏服务端中,我们会将可变的东西写数据库里,而将一成不变的东西写在配置里。在现实开发过程中,大多数开发者会选用xml作为服务的配置。原因是xml树形结构化表示、标记清晰及易于理解和方便移植。下面我将会为我的服务端添加tinyxml。tinyxml是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用。同时tinyxml也是免费开源的。因此我会将tinyx

2013-12-21 00:04:22 10263

原创 游戏服务端之C++网络库对外接口

大多数的情况下,游戏的服务端都是在Linux下运行,但是Linux下做开发C/C++的开发相对来说是比较困难的。所以一般来说,游戏的服务端都是做成可移植的,这样方便在Windows下做开发。也就是说,服务端既可在Windows下运行,也可以在Linux下运行。说了这么多,看似与网络链接半毛钱关系都没有。其实不是这样的,就像Lua一样,既可以在Windows下调用它,也可以在Linux调用它,关

2013-12-15 00:01:41 4597

原创 游戏服务端之C++游戏服务端防崩溃

在游戏开发当中,不用我多说了,游戏的稳定性是相当重要的。为了追求游戏的稳定性,很多开发者都会选择脚本语言作为游戏的主要开发语言。因为使用脚本语言,即使游戏出现重大的bug,由于脚本支持热更的天然优势,使开发者更迅速地解决问题;而且脚本的良好容错性,也会使游戏系统不会轻易崩溃。但是,一些即时性游戏需要更高性能的,开发者可能会选择C/C++作为开发语言,但是怎样来保证游戏的稳定性呢?关键词是

2013-12-07 00:03:41 5914 4

原创 设计模式总结

创建型模式简单工厂模式lua实现工厂方法模式lua实现原型模式lua实现建造者模式lua实现单例模式lua实现抽象工厂模式lua实现结构型模式装饰模式lua实现代理模式lua实现外观模式lua实现适配器模式lua实现组合模式lua实现桥接模式lua实现享元模式lua实现行为模式策略模

2013-11-27 08:42:19 4527 3

原创 访问者模式lua实现

--[[ 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。 2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。 3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)

2013-11-26 08:47:35 1927

原创 解释器模式lua实现

--[[ 解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,用这个解释器使用该表示来解释语言中句子。 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 AbstractExpression 抽象解释器:具体的解

2013-11-25 08:48:03 2410

原创 享元模式lua实现

--[[ 设计模式中的享元模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External Stat

2013-11-24 02:28:49 2529

原创 职责链模式lua实现

--[[ 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 应用: 1、有多个对象处理请求,到底怎么处理在运行时确定。 2、希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。 3、可处理一个请求的对象集合应该被动态指定。]]--Handler = {}funct

2013-11-22 08:47:20 2358

原创 Visual Studio自动定位文件

也就是说,当你点击这个标签页的时候,VS会自动定位到工程的文件,用起来相当方便。之前一直在使用这个功能,但是重新安装Visual Studio,老是忘记在哪里从新设置回来。所以决定记下来,方便自己查阅。工具->选项->项目和解决方案->常规->在解决方案资源管理器中跟踪活动选项;勾上这个就可以了。我用的是VS2010,其它的大小异同。

2013-11-21 14:54:46 5724 2

原创 命令模式lua实现

--[[ 优点: 1.降低对象之间的耦合度。 2.新的命令可以很容易地加入到系统中。 3.可以比较容易地设计一个组合命令。 4.调用同一方法实现不同的功能。 缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。 Command类:是一个抽象类,类中对需要执行的命令进行声明

2013-11-20 08:53:13 4484 2

原创 桥接模式lua实现

--[[ 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 其实桥接模式在开发应用中使用的非常广泛,甚至即使我们没有学过桥接模式,也可能会潜意识地使用到。 例如:在游戏开发中,玩家类(Role)合成了背包(Knapsack);在背包类(Knapsack)中,又合成的物品(Item);其实这种合成就是桥接模式中的”桥“。注意的是这里是合成,而不是继承! 下面以手机为例]]-

2013-11-19 10:48:46 2461

原创 组合模式lua实现

--[[ 组合模式使得用户对单个对象和组合对象的使用具有一致性。 应用: 1.你想表示对象的部分-整体层次结构 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 定义: 1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。 2.Leaf 在组合中表示叶子

2013-11-18 13:19:00 3229

寻路算法演示程序(A*,BFS,Dijkstra )

Usage: Simply double click on server.exe and client.exe By default, the server starts on 127.0.0.1(localhost) and uses the port 31416. If you want to specify another port, add options while executing the server.py. This can be done by either executing the program in cmd or executing it via a modified shortcut. For example: server.exe -p 27183 As stated in the description section above, you can start the server on one machine and start the client on another machine, as long as these two machines are connected. If you want to connect to a remote server, add options while executing the client. For example: python client.exe -a 172.18.241.2 -p 27183

2015-06-07

空空如也

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

TA关注的人

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