- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 【二】Fast-DDS编译、安装、运行
Fast-DDS是ROS2核心组件,是ROS2底层通信框架,通过剖析Fast-DDS不仅能了解Fast-DDS实现、了解DDS协议,更为后续了解ROS2及如何实现一个可靠的分布式系统打下坚实基础。
2024-12-21 17:37:27
482
原创 【一】Fast-DDS是什么
全称前身实现规范:DDS规范,即数据分发服务规范,由OMG定义的一种用于分布式软件应用程序通信的以数据为中心的通信协议。主要特点:高性能、可扩展性、实时性、安全性、多语言支持(如C++、Java、Python等)和高度可定制性。综上所述,Fast DDS是一种高性能、可扩展的数据分发服务,它实现了DDS规范并提供了丰富的功能和特性。通过Fast DDS,开发人员可以轻松地实现实时数据通信和消息传递,为分布式系统和实时控制系统提供可靠的数据分发平台。
2024-11-17 16:59:54
789
原创 [深入解读LRU I]分桶式LRU
触发热数据令牌桶发现热数据如果是冷数据还触发LRU,两次访问之间请求的时间大于数据缓存的超时时间,那就是必然的冷数据。最后可能就只会只是多判断了一个缓存,结果是每次访问都会击穿缓存。分桶式,减少锁竞争...
2020-10-19 19:26:25
681
原创 [redis源码]底层文件删除原理
基于这样的一个事实,redis在重命名文件时(重命名文件,目标文件可能会被删除),先调用了一次open,将引用计数加1;后台再通过I/O线程,异步将文件删除;这样就不会阻塞redis的主逻辑线程(因为redis本身是单线程
2020-09-06 19:43:20
548
原创 游戏服务端之C++封装Mysql
很多缺少实际工作经验的同学会认为,操作Mysql还需要封装?!直接写sql语句操作就可以了。其实封装Mysql有以下的好处:1、更加安全。即使你是相当谨慎的一个程序员,就算在几百处甚至几千处地方写sql操作Mysql也避免不了会出现写错表名,字段名写错了或者写少写多了,符号写错等等。封装可以解决这些问题。2、更好的移植性。封装其实就是一些共性的集合,这样当然具有更好的移植性了(这样能方便像
2020-08-18 21:16:33
4101
原创 [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
5460
原创 [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
302
原创 [redis]Glob模式匹配
Glob模式匹配,它不像正则表达式这样具有丰富的语法,但是,它是一种相当简洁高效的一种模式匹配。代码简单,规则简单,因此其运行效率同样非常高效。其广泛应用于不同的系统,例如我们常用的Linux ls 命令。通配符描述*匹配任意长度字符?匹配一个字符\\匹配转义符 \[a-z]匹配大于等于a,小于等于z;适用任何字符[0123456789]匹配大于等于0,小于等于9;相当于[0-9][^]非,匹配不相等字符[^a-z]不匹配大
2020-08-02 19:32:45
896
原创 一个简单高效的命令解析代码
管理命令:GM(game manager),直播管理命令;一般是运营,管理人员,管理场景,管理房间等使用。调试命令:例如实时查看进程信息,机器资源使用情况,打印详细日志等等。权限命令:例如实时开通白名单/黑名单,给用户分配临时权限等等。调度命令:人为实时更改函数调度,进程调度,机器调度等,流量分发、流量限制等,服务升降级等等。
2020-07-18 13:06:53
445
原创 [go设计模式]工厂方法模式
简单工厂就是生产整个计算器,而工厂方法只生产计算器的一部分;原有的简单工厂可以生'+' '-' '*' '/' ;但是如果添加新的部件'%',厂房就需要扩充、修改很可以会影响原来部件的正常生产,这就违背了开放封闭原则;而工厂方法则不存在这个问题;我新开一个工厂专门生产'%'就可以了。package mainimport ( "fmt")type Operation interface { Exe(int, int) int}type FactoryAdd struct{
2020-06-07 19:07:02
264
原创 适配器模式lua实现
--[[ 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——Gang of Four 应用: 例如跨国公司开会,每个地区的领导说着不同的语言,但与会者却是不同地区的人,因此领导人需要翻译,这个翻译就是适配器。 例如我们玩游戏,特别玩以前不同平台的游...
2019-10-11 21:27:55
2891
原创 [go设计模式]简单工厂模式
优点工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。缺点由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了...
2019-10-06 22:31:41
425
原创 一个C++的ElasticSearch Client
ElasticSearch官方是没有提供C++的client的;因此决定自己写一个,命名为ESClienthttps://github.com/ATinyAnt/ESClient(手下留星 star)优势是简单易用:*封装大幅度减少了直接写DSL的机会,避免了一些非逻辑错误*只需要包含头文件 request.h即可以使用因为...
2019-07-17 22:05:24
3176
3
原创 游戏中的离线玩家
一般的游戏架构都有 数据库 + 缓存 这样的存储机制,而这个机制决定了离线玩家的实现方式。其中一种很常用的做法是将所有玩家的信息全部都加载到内存中,当要查找离线玩家信息时,直接可以在内存中获得,不需要再到数据库中查找。其实我一直觉得这其中有一些问题,那就是随着时间的推移,内存的有效利用率越来越低。原因很简单,(从趋势上来讲)整个游戏的玩家活跃度会随时间慢慢降低。特别是合服之后,这种负面效果将会加倍
2015-09-04 11:24:07
2790
原创 堆 在游戏中的运用
* 定时器的应用与原理:游戏中,活动的状态、游戏数据的保存与加载、BOSS刷新时间等等,都可能会用到定时器。而堆对于定时器的实现有着至关重要的作用。定时器的工作原理其实不难,就是内部保存多个时间及其回调函数,当系统时间达到我们保存的时间值时,就执行回调函数;从而达到定时工作的效果。同时,判断是否达到指定时间时,只需要判断最早的时间(最早的时间没有达到,更晚的时间肯定不会达到),因此需要对时
2015-07-09 00:04:11
2053
原创 redis client protocol 实现
在官网中http://redis.io/clients有许多已经实现好的redis client;有需要可以参考一下。其实前一篇http://blog.youkuaiyun.com/yitouhan/article/details/46612925 redis client protocol 解析,我已经对RESP做主要的解析。下面是解析RESP的所有函数,其中对外函数是RedisProtoc
2015-07-01 13:25:16
1688
原创 redis client protocol 解析
在官网http://redis.io/topics/protocol有对redis通信协议有做说明。基于下面的一些原因,我想解析redis client protocol:1、足够了解通信协议,有助于做出更好的系统设计。2、学习RESP的设计思想,不仅能扩展我的思维,也许将来能应用于我的代码中。3、因为有些人想将redis client直接并入自己已有的系统中;包括我在内。这个
2015-06-24 00:14:04
3173
原创 A*寻路算法(曼哈顿距离)
前一些天,在群有人问到A*算法的问题。之前我已经有实现过,并将之放到github上(https://github.com/ATinyAnt/A_Star);有兴趣的可以下载下来看看。这里上传了一个相当好的A*算法演示程序,大家可以下载下来看看效果:http://download.youkuaiyun.com/detail/a374826954/8781185。下面描述是摘自清华大学出版社《人工智能》一...
2015-06-08 00:00:15
21104
原创 游戏中的随机--转换思维
文章中的标题是“游戏中的随机--转换思维”,有一个关键词是“随机”;但是随机这个说法过于笼统,因此我主要说一个具体化实例:随机坐标。随机坐标在游戏中相当常见,例如掉落、怪物生成、采集生成或者是一些活动中的藏宝地点。随机出一个坐标不难。那随机出一个不重复的坐标呢?其实也不难!还能好好说话吗?就是要讲述如何做出一个高效及简洁的随机坐标模块!我知道相当一部分人设计随机坐标模块的思
2015-04-15 13:30:44
1913
1
原创 序列化的作用
前言:本文以C++语言作为讲解序列化的作用。序列化是什么?一般说到序列化,其实是包含了反序列化。以C++为例,序列化就是将结构体(或者是类)等复杂的数据结构的各个属性有序地保存到字符数组。而反序列化就是将有序的字符数组还原回结构体(或者是类)等复杂的数据结构。序列化作用1、方便网络传输我们都知道,socket的数据都是以字符串进行传输,而序列化的作用就是
2015-03-12 09:16:15
8679
2
原创 使用桥接模式时要注意的问题
什么是桥接模式?举个例子:平时我们我们的USB(Universal Serial Bus(通用串行总线)),其实其设计的模式就是桥接模式。桥接模式的作用就是:将抽象部份与它的实现部份分离,使它们都可以独立地变化。也就是说无论USB插的是U盘,还是小风扇。都只是外部的独立变化,电脑内部是不受影响。不扯远了,这里不是主要说桥接模式的用法。下面看看使用桥接模式需要注意一个小小的问题。http://blo
2014-11-26 00:06:29
3988
2
原创 用gdb调试游戏服务端
前言说说gdb的重要性一般来说,提到gdb,都是用命令来调试。“命令”,这个对于用户来说几乎等同于繁杂的词语。尽管事实确实如此,但实际的开发调试必须用到gdb。现在,大多数Linux系统是存在于服务器当中。我们想操作这些系统时,一般是通过Terminal来操作。也就是说这些Linux系统不具有图形界面。而调试一般分两部分,开发时调试和运行时调试。当我们的程序部署到Linux上时,那就需要忘
2014-11-17 00:15:00
4086
原创 一种有效避免死锁的互斥锁设计
下面是摘自网络的一段话,我觉得很好;对认识锁很有帮助。“为什么要加锁?加锁是为了防止不同的线程访问同一共享资源造成混乱。打个比方:人是不同的线程,卫生间是共享资源。你在上洗手间的时候肯定要把门锁上吧,这就是加锁,只要你在里面,这个卫生间就被锁了,只有你出来之后别人才能用。想象一下如果卫生间的门没有锁会是什么样?什么是加锁粒度呢?所谓加锁粒度就是你要锁住的范围是多大。比如你在家上
2014-06-29 00:39:34
4004
1
原创 用python写makefile
温馨提示:阅读本文的同学最好能了解makefile和python的编写规则。不懂的同学可以先保存在收藏夹,以便日后查看。其实之前我一直很懒,我不想了解makefile规则,因为在linux下开发我一直使用Qt creator。(很多时候正是一些“懒人”的创造力,解放了我们的双手,显然
2014-06-14 00:13:11
13673
原创 游戏服务端为什么需要登录服?!
注:这篇文章不仅会说登录服,还会说一些其它游戏相关的事哦!我们都知道,很多游戏在上线时,都会大肆宣传,最近宣传比较多的就是《激战2》了。(当然我不是《激战2》的水军)很多玩家都会提前坐在电脑前,等候游戏官方给出的开服时间,抢点进入游戏,因为这样能占据时间的红利,可以在游戏中占个好排名
2014-05-31 00:03:27
3973
2
原创 我的服务端之有限制使用Thread
前言:多线程是一把双刃剑,不要盲目使用多线程!使用多线程的优点:1、支持并发。2、提高程序执行效率,这里又可以分为两种情况:单线程情况下,I/O操作会让CPU处于"等待"状态,因此多线程能更好利用CPU;多核CPU的出现,让多线程程序有更好的执行效率。缺点:1、造成一定的线程切换开销。2、资源容易出现竞争,甚至死锁。3、多个线程"同时"对某块内存进行读写,容
2014-02-08 00:04:08
2508
1
原创 游戏服务端之内存池
内存池(Memory Pool)一、前言1、操作系统的内存分配方式1.1、连续分配方式顾名思义,这种分配方式,会将进程分配在连续的空间。连续分配方式一般可以分为固定分配方式、动态分配方式和伙伴系统(固定分配方式与动态分配方式的折衷方案)。1.2、基本分页存储管理方式1.3、基本分段存储管理方式注:以上说的分配方式,自个可以到网上去搜索一下,方便理解以下内容。
2014-01-05 00:03:23
6246
3
原创 游戏服务端之AOI概述
AOI(Area Of Interest),中文就是感兴趣区域。通俗一点说,感兴趣区域就是玩家在场景实时看到的区域;也就是AOI会随着英雄的移动改变而改变。一般在游戏的中,游戏的世界都是由各种场景组成,场景中有着各种各样的Obj(英雄、怪物、NPC和掉落物品等等)。当英雄在移动的时候,玩家需要看到其它在自己视野内玩家的英雄;需要看到在自己视野内的怪物;需要看到打BOSS掉落的物品;……。有
2013-12-29 00:27:53
13184
原创 游戏服务端之xml类型转换
上一篇博文我已经说明了服务端添加tinyxml的基本操作及基本用法。我的服务端之添加xml解释器http://blog.youkuaiyun.com/yitouhan/article/details/17453159但是可以看出tinyxml读出的数据是不做类型匹配的,也就是说tinyxml读出的数据都是字符串。但是在实际应用中,我还需要其它的数据类型,例如整型和浮点型。这里主要要说明的是istr
2013-12-23 00:02:15
3130
原创 游戏服务端之添加xml解释器
在游戏服务端中,我们会将可变的东西写数据库里,而将一成不变的东西写在配置里。在现实开发过程中,大多数开发者会选用xml作为服务的配置。原因是xml树形结构化表示、标记清晰及易于理解和方便移植。下面我将会为我的服务端添加tinyxml。tinyxml是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用。同时tinyxml也是免费开源的。因此我会将tinyx
2013-12-21 00:04:22
10377
原创 游戏服务端之C++网络库对外接口
大多数的情况下,游戏的服务端都是在Linux下运行,但是Linux下做开发C/C++的开发相对来说是比较困难的。所以一般来说,游戏的服务端都是做成可移植的,这样方便在Windows下做开发。也就是说,服务端既可在Windows下运行,也可以在Linux下运行。说了这么多,看似与网络链接半毛钱关系都没有。其实不是这样的,就像Lua一样,既可以在Windows下调用它,也可以在Linux调用它,关
2013-12-15 00:01:41
4662
原创 游戏服务端之C++游戏服务端防崩溃
在游戏开发当中,不用我多说了,游戏的稳定性是相当重要的。为了追求游戏的稳定性,很多开发者都会选择脚本语言作为游戏的主要开发语言。因为使用脚本语言,即使游戏出现重大的bug,由于脚本支持热更的天然优势,使开发者更迅速地解决问题;而且脚本的良好容错性,也会使游戏系统不会轻易崩溃。但是,一些即时性游戏需要更高性能的,开发者可能会选择C/C++作为开发语言,但是怎样来保证游戏的稳定性呢?关键词是
2013-12-07 00:03:41
6114
1
原创 设计模式总结
创建型模式简单工厂模式lua实现工厂方法模式lua实现原型模式lua实现建造者模式lua实现单例模式lua实现抽象工厂模式lua实现结构型模式装饰模式lua实现代理模式lua实现外观模式lua实现适配器模式lua实现组合模式lua实现桥接模式lua实现享元模式lua实现行为模式策略模
2013-11-27 08:42:19
4644
1
原创 访问者模式lua实现
--[[ 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。 2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。 3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)
2013-11-26 08:47:35
2006
原创 解释器模式lua实现
--[[ 解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,用这个解释器使用该表示来解释语言中句子。 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 AbstractExpression 抽象解释器:具体的解
2013-11-25 08:48:03
2506
原创 享元模式lua实现
--[[ 设计模式中的享元模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External Stat
2013-11-24 02:28:49
2591
原创 职责链模式lua实现
--[[ 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 应用: 1、有多个对象处理请求,到底怎么处理在运行时确定。 2、希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。 3、可处理一个请求的对象集合应该被动态指定。]]--Handler = {}funct
2013-11-22 08:47:20
2463
原创 Visual Studio自动定位文件
也就是说,当你点击这个标签页的时候,VS会自动定位到工程的文件,用起来相当方便。之前一直在使用这个功能,但是重新安装Visual Studio,老是忘记在哪里从新设置回来。所以决定记下来,方便自己查阅。工具->选项->项目和解决方案->常规->在解决方案资源管理器中跟踪活动选项;勾上这个就可以了。我用的是VS2010,其它的大小异同。
2013-11-21 14:54:46
5896
3
寻路算法演示程序(A*,BFS,Dijkstra )
2015-06-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人