自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Unity tcp多线程网络层框架(一)数据结构

Unity tcp多线程网络层框架(一)数据结构概述和大多数游戏相同,之前我们游戏的客户端采用lua的csocket作为网络底层,由于该库是采用selec和iocp作为底层库,是同步非阻塞的的io方式,所以客户端的处理是在每个update中,受限于客户端性能,仅仅处理30个包,如果服务器优化堪忧,发送大量小包,就会出现数据堆积,直到服务器踢掉客户端。为了处理该问题,我们设计了新的网络层。使用多线程,将协议解析,反序列化,解密的工作放到其他线程。对协议进行整理,同帧内的部分协议被优化。使用多线程

2020-10-07 11:13:51 664 1

原创 Asio游戏网络中间件设计(三)数据结构

文章目录Asio游戏网络中间件设计(三)数据结构临时缓存无锁队列其他数据结构Asio游戏网络中间件设计(三)数据结构网络通信中有几种必要的数据结构,满足线程安全,高可复用等要求。临时缓存用于与内核缓冲区交互,由于在实现应用层协议时,常常要添加(或移除)包头等数据,为了减少memcpy的次数,我们将数据区以外的部分作为动态区,通过控制offset来保证数据的有效区域。template <size_t SIZE>class reusabel_buffer :public std::ena

2020-09-11 20:27:27 187

原创 Asio游戏网络中间件设计(二)内存管理

文章目录Asio游戏网络中间件设计(二)内存管理目标对象池线程缓存线程生命周期管理线程安全的单例线程安全内存池用例Asio游戏网络中间件设计(二)内存管理目标网络层中会产生大量内存碎片,而且频繁地申请内存也影响效率,所以需要设计内存池来管理。为了避免线程context切换时的开销,设计中尽量避免使用锁。对象池namespace parallel_core{ template<class T> class ObjectPool { public: ObjectPool()

2020-09-11 19:52:57 280

原创 Asio游戏网络中间件设计(一)并发设计

文章目录Asio游戏网络中间件设计(一)并发设计需求来源网络库选择并发结构设计逻辑的有序性Job systemAsio游戏网络中间件设计(一)并发设计需求来源公司的游戏服务器网络层采用的是第三方闭源的静态库,然后在实际生产中出现了一些问题如下:网络流量很高,在目标容量为千人的momo游戏服务器上,达到了30m/s以上的流量。在高频次的小包发送时,客户端容易出现网络中断被kick的情况。延迟较高,在内网测试时,达到单边30-50ms的延迟。由于网络层是闭源的,难以准确定位问题,只能凭黑盒测试

2020-09-11 17:13:33 460

原创 XLua-Unity框架初探

文章目录前言应用场景XLua 常用 API框架实例搭建需求实现实例,实现一朵云的运动其他前言Lua由于其简单易用,方便热更等性质,一直是游戏行业的首推脚本语言。Unity引擎也诞生了很多款为其适配的Lua虚拟机运行环境,主要有XLua,SLua,ToLua和ULua,本文不会着力比较这几种框架的实现差异,只讨论其中背靠大厂腾讯的XLua框架。应用场景UI逻辑代码Hotfix网络层除...

2019-08-01 01:15:40 3698 1

原创 c++小工具,字符串 hash map

std::unordered_map该容器在使用const char*作为key时,会将char*作为指针,将指针指向的地址作为生成hashcode的值,所以对于每一个unordered_map&lt;const char*&gt;,只要不是相同值(a == b),会找不到值。所以定义了一个宏来实现字符串类型的hash map。struct const_char_cmp{ bool op...

2019-02-21 18:17:17 214

原创 游戏引擎架构随笔(一)异步加载

浅谈游戏Assets加载现代游戏往往需要加载大量的资源,而游戏资源的加载往往是阻塞的行为,一般来说有两种方案,分帧加载和异步加载,分帧加载对于每种游戏甚至每个不同的场景都有不同的解决方案,不在本文的讨论范围。对于第二钟加载方案,下面有些简单的理解。目的和方法游戏IO有几个特点:随机性,加载数据可能随时发生。多样性,数据源的类型可能是多样的,文本,模型,图片,甚至是网络资源。重复,...

2019-02-20 13:57:01 372

原创 导航图寻路(三)--Dijkstra代码实现

前言前一篇我们描述了Dijkstra的算法,这篇文章中我们会将它变成c#代码。纠正几个错误之前我们的文章中,存放边界顶点用的数组,应该是栈,这样便于代码描述,但是如果想优化速度,可以使用数组,我们将在下面说明如何优化。之前我们在重载EdgeBase类的==运算符时,没有加入对null类型的判断,应该改为: public static bool operator ==(EdgeBase self

2017-01-17 16:54:32 1853

原创 导航图寻路(二)--Dijkstra

前言之前的几篇文章我们描述了图作为一种容器的基本属性和作为树形结构的基本算法。 在探讨Dijkstra算法之前,请准备好笔和纸,我们一起来画一画该算法的解决过程,否则你将很难理解该算法。先行知识问题: 求一个带权无向图两个顶点b,e的最短路径p P {b - e} = P {b - … k - … - s … - e},k和s为路径p上的两个顶点 如果P为最短路径,那么这条路径的部分路

2017-01-13 17:20:46 727 1

原创 导航图寻路(一)

通用算法我们先来讲基础的算法,树形结构基本都能使用的算法。辅助函数辅助函数和类,为了书写方便,path使用了类似c++迭代器的设计。int nextEdge(VertexBase v, List<bool> visited) { for (int i = 0; i < v.Edges.Count; ++i) {

2017-01-13 11:08:37 548

原创 导航图,无向稀疏连通图

前言数据成员从xml加载保存添加和删除顶点添加和删除边清空根据id获取顶点To be continued前言我们上一篇描述了需求,这一篇详细地实现图类。数据成员public class SparseGraph:GraphRemote { protected Dictionary<int, object> _objects = new Dictionary<in

2017-01-12 18:05:51 666 1

原创 图论,导航图基础(c#版)

前言图论基础1储存方式算法提要应用无向稀疏连通图的实现通用性的考虑索引节点图的顶点图的边稀疏图类To be continued前言依然在公司实习,但是待在一个比较成熟的项目组(战地风暴invasion),没什么机会着手项目代码,只能拿着项目代码自己琢磨,学习,然后由于最近玩莉莉丝的art of conquest,被它的垃圾寻路气哭了,所以想自己写写寻路系统,此版本的代码是为了u

2017-01-12 17:38:11 1338

原创 Unity中的trigger

前言最近在一家公司实习,公司用unity做项目,所以开始抛弃cocos,步入unity的深坑,笔主在研究unity时,发现网上很少有人会去分析引擎内部的实现,更加偏向于“是什么”而不是“为什么”,笔主接下来的一段时间可能都会写一些关于unity的个人理解,由于看不到源码,笔主只能通过类比cocos和UE来猜想unity的实现。trigger的概念trigger被称之为触发器,但其实这个翻译不太准确,

2016-12-26 14:27:28 7136

原创 cocos场景替换顺序(坑)

填坑最近在写一个投篮的游戏,由于自己写了一个简单的物理模块,实体内存管理没有使用cocos的内存池,然后在场景替换时遇到了一些坑。onEnter和onExit1、cocos的onEnter是在init函数执行之后执行的,所以常常把一些逻辑放到onEnter中开始执行,比如schedule,这样可以避免cocos的node还没加载就进行逻辑判断。 2、在执行replaceScene时,cocos先加

2016-11-07 14:58:51 697

原创 复合类型的混合使用--右左法则和替换规则

复合类型的混合使用c++的基本复合类型主要有三种:数组,引用和指针。由于语法上的自由性,导致这三者嵌套的情况下变得十分复杂,虽然我们可以用更加简便,易于阅读的方案替换一些复杂声明,但是我们还是有必要掌握复杂程序的阅读能力。举个栗子: int* ( *( *func )( int* ) )[10];是不是觉得很无厘头,放心,今天我们就来

2016-09-04 16:09:54 742

原创 深入分析const关键字模型

前言const和define宏constconst是编译期的行为const声明占用内存const是伪常量const和复合类型顶层const和底层const概念拷贝操作const和其他关键字constexprauto前言最近在复习c++ primer,把以前没注意到的都深入研究了一下。 此篇博客的结论都建立于c++11或者c++14的新标准上,编译器为VS2015 comm

2016-08-29 20:59:15 477

原创 Qiuck_Cocos实战(一)

我们之前说了要做飞机大战的项目,就从这篇开始吧。Bullet类子弹类是这样一种类,它由飞机发出,直线运动,撞到物体后消失,超出地图后也会消失。-- Bullet-- 构造函数里面有很多参数,根据这些参数,我们可以实现不同样式的子弹local Bullet=class("Bullet", function(filename,poX,poY,style,parentNode

2016-07-16 20:41:39 315

原创 Quick_Cocos基础(三)

前言这个系列的前面几篇我不准备系统地讲,我们先写一写小例子,然后再从体系结构上来分析cocos lua自动滚动地图我们新建一个场景,把它作为游戏的主场景。local MainScene = class("MainScene", function() return display.newScene("MainScene")end)function MainScene:ctor() --

2016-07-15 16:58:33 306

原创 Qiuck_Cocos基础(二)

前言上一篇文章我们讲了一点无聊的东西,今天我们来讲easy的东西,关于cocos的常用类,为了配合这一点,我们讲一个实际项目:飞机大战 此项目已经在github上开源https://github.com/YoungForLong/WXDFJ场景场景是一个游戏的基本结构,所有的内容都附着于场景local StartScene=class("StartScene",function() ret

2016-07-13 01:54:59 422

原创 Qiuck_Cocos基础(一)

前言最近学校和触控科技合作,组织了一次qiuck_cocos的教学(非常感谢触控科技的小强老师,笔者暂时不知道他的博客,以后会告知大家),笔者有幸参与其中,领略了脚本语言lua的实用性和cocos引擎的便捷开发流程,在此把一些感悟想和大家分享。此篇文章不会太过详细地向读者讲解lua语言的基本特性,由于lua语言特别简单,有任何面向对象基础的人和c语言基础的人都可以很快上手();如果大家想了解quic

2016-07-13 00:57:40 461

原创 c++小工具,运用于游戏中的多叉树

多叉树的用途在游戏中我们常常会使用树形结构,而且由于游戏数据的复杂性,常常使用多叉树甚至图。比如类型树,状态树(状态树多用二叉树,但是我觉得很多时候二叉树并不能解决问题),决策树etc. 为了满足一些特定的用途,特意写了一个小的树形容器(此处容器的算法没有用STL风格,而是采用了回调函数的形式来做)。几个算法主要的算法有几个:常用的遍历,查找(查找节点或其父节点),组合树,逆序追踪(该算法主要是为

2016-07-12 23:38:31 412

原创 c++小技巧,宏定义工厂函数

这几天在写鱼类抽象的时候,发现原来使用父类指针创建,替换,转化子类对象的方法原来叫工厂模式,以前常常用这种方法,终于发现原来是有学名的。(●’◡’●)这里介绍一种使用宏定义函数来创建工厂函数的方法,借鉴了cocos的宏。1、首先,我们要避免创建一个不能实例化的抽象父类,除去用RTTI,使用类id,我们还可以用如下方案:template <typename T>struct IsAbstract{

2016-05-27 23:28:52 1564

原创 游戏AI--决策(1)

机器学习的引入机器学习最近由于AlphaGo和数据挖掘的大热而变得流行起来,然而我们可以让它变得更加cool,在接下来的模块中,我将讲述我对游戏中应用机器学习的理解以及我的现有成果。应用机器学习的意义游戏进行中,尤其是网络游戏,会积累大量的数据,数据赋予了计算机行为意识,而我们如果能“告诉”计算机数据归纳总结的方法,那计算机可能会产生惊人的思维能力,而机器学习就是这样的一种神奇的工具。前景目前的游戏

2016-05-26 12:00:51 1446

原创 GeoHash补充

最近在逛cocoa的时候发现有一些小细节可以优化的 - 我们在设定二分精度时可以设置精度为个体的影响范围为精度,这样我们在搜索的时候可以直接用“==”而非“like” - 我们可以不用进行base32编码,直接将其转化为unsinged long,可以大大减少计算,数据库使用字符串是因为很多数据库对字符串类型有很好的支持,c上面用字符串效率低得可以 - 之前那个写得仓促,有很多错误没整理,这次

2016-05-09 16:03:31 538

原创 游戏底层逻辑,空间划分

前言 不知道大家注意到之前有一个寻找相邻个体的方法叫做getNeighbors没有,该方法的实现如下: - 遍历所有个体,计算距离是否小于一定范围,确定邻居 我们可以预知,该方法在个体总数较小的时候效率较高,一旦个体数突破上百个,就很容易造成极大的cpu开销,所以此处我们需要研究出另外的索引方案来得到邻居。空间划分的方案主流的有很多,例如四叉树,八叉树,bsp树,四叉树主要用于

2016-05-07 14:17:54 2741

原创 游戏底层逻辑,运动&&寻路(五)

终于要开始激动人心的Flocking集群行为了,不过在讨论集群行为之前,我们要先来探讨一些很有意思的哲学逻辑。Emergent Behaviors涌现行为这里先安利一本神作《失控》,看了这本书,我相信对整个人工智能,社会学,人类学和分布式理论都会有极大地认知提高。我们先讲一讲蜂巢现象: 一群蜜蜂,他们并没有中枢参与控制,蜜蜂仅仅能做一些基本行为,例如:四处乱飞,找到视野里的花朵,接收一定范围内其

2016-04-20 00:32:36 1261

原创 游戏底层逻辑,运动&&寻路(四)

接着上次的来,我们在群体算法之前把基本的个体运动解决掉。9、WallAvoidance避开墙壁此处的墙被抽象为一条线段,不论你的游戏使用的是一条线段作为墙面的碰撞检测,或者用一个几何形状作为墙面,几何形状我们可以看作多条线段的集合,都可以用此方法。墙类的实现首先是线段类,作为基类,拥有几种几何计算的方法,便于计算平面线段的交点,不多说。struct Seg{ Seg(Point p1, P

2016-04-19 13:17:31 1568

原创 游戏底层逻辑,运动&&寻路(三)

上篇文章我们解释了几种基本的控制力,今天我们会讨论几种较为复杂的行为,涉及了碰撞,以及辅助图形进行运动控制。7、Wander徘徊(巡逻)徘徊(四处巡逻)是一种很常见的行为,但是要得到smoothly平滑的转向行为,并不是特别容易,这里有一种借用辅助圆实现的平滑移动。如图,我们在物体前面构造了一个辅助圆,我们控制目标点,从而用seek方法控制运动行为,如果我们让目标点在圆周上运动,就可以产生一个力,他

2016-04-16 10:42:07 4321

原创 游戏底层逻辑,运动&&寻路(二)

目标驱动产生控制力我们知道一个合理的物理世界的运动不是自发的,也不能是突发的。我们不能突然的moveTo。我们首先知道,由牛顿定理可知,物体的变速需要力的作用,而在游戏世界里,力不是由其他物体施加的,而是由目标驱动的,这一原则将是接下来运动的基本哲学。运动物体我们先抛开实体的详细设计,在控制力实现过程中逐步添加实体属性。 这里有一个简单的可运动物体的设计(省略了ctor&set&get):Movi

2016-04-12 09:32:36 851

原创 游戏底层逻辑,运动&&寻路(一)

从今往后的项目,由于需要图形化界面,所以建立在cocos2d 3.4引擎基础之上。 说到运动,不得不复习一下平面向量的有关知识(忘完了,尴尬 ^_^;) 这里我就不多做讲解了,向量方面需要用到点乘,内积,外积,矩阵变换,转角之类的,还好基本的引擎都带有matrix和vector2d的库。先给大家展示一下《游戏人工智能编程》中的例子(自己的还没写好) 此例子中呈现了

2016-04-07 21:07:15 1139

原创 游戏底层逻辑,MainLoop&&FSM&&MSG(四)

Entity–实体今天我们把游戏逻辑集成起来,看一下状态机和消息分发具体的引用过程。 BaseEntity.hclass BaseEntity{public: BaseEntity(int IDcount) { setID(IDcount); } ~BaseEntity(){}; int ID() const {

2016-04-06 21:02:32 654

原创 游戏逻辑底层,MainLoop&&FSM&&MSG(三)

FSM–有限状态机今天我们来探讨一下Finite State Machine,有限状态机,简称FSM,有兴趣的同学可以看一下《游戏编程中的人工智能》这本书,写得很经典(无论从代码上来说还是思维上来说),此次的例子基本是在此书的思想结构上来编程的。FSM的基本思想我不多赘述,我们只关注代码的实现。首先是State基类 State.htemplate<class Type>class State{

2016-04-06 09:49:29 573

原创 游戏底层逻辑,MainLoop&&FSM&&MSG(二)

MSG消息机制准备写一个有关游戏底层算法物理算法以及AI重点是机器学习在游戏中的应用的长篇博客欢迎大家指正交流MSG–消息机制学过操作系统的同学们都知道,windows底层的数据传递有一个完善的消息机制(当时读书的时候也是烦透了PeekMsg这种东西,不过不得不说现在想起来其实操作系统是一门很有用的软件架构设计的书,操作系统基本包含了所有的基本软件体系架构),好了,闲谈无多,我们来看看代码。 首

2016-04-06 09:07:00 540

原创 游戏逻辑底层,MainLoop&&FSM&&MSG(一)

MainLoop–游戏主循环简单的程序主要分为两个线程,一个线程负责处理界面刷新(一般需要较高FPS),另一个线程负责处理程序逻辑(刷新频率较低),此篇文章主要介绍游戏的逻辑线程,我称之为GameMainLoop(以下简称ML)。 基本的ML很简单,定义逻辑刷新频率,定义刷新执行事件,我们直接来看代码MainLoop.h//headers...typedef std::function<void(

2016-04-06 00:47:34 837

原创 cocos2d-x大型地图实现(续)

上次向大家介绍了底层的地图逻辑,这次来看看视觉层面,也就是地图图片的绘制。大型地图肯定不能一次绘制,我的方法是运用缓存然后绘制出“看得到”的地图部分。· 地图分为很多张屏幕大小的图片,在我这里是1000*500,每次只需要绘制四张图片必然能包括屏幕的所有范围,如图: 中间的黑色线框为屏幕,黑白色的方块为地图图片下面是具体实现:#ifndef _VISION_MAP_H_#define _VISI

2015-11-23 16:27:27 1298

原创 cocos2d-x大型地图的实现

所谓大型地图,是指类似于pc端沙盒游戏那样的地图。需要加载大量的图片资源。而cocos并不是针对这样的游戏设计(现目前手机端很少有2d的类似游戏)。笔者最近再开发一款类似《饥荒》的生存类游戏,所以涉及到大型地图的实现,下面来和大家聊一聊我自己的实现方式。· 首先是底层地图实体的逻辑,要实现物体的碰撞,我使用了方格数组来储存地图的相应信息:struct MapRect{ LandType l

2015-11-23 15:33:27 1328

原创 Cocos2dx解决VS无法加载pdb符号库问题

首先禁用windows远程符号服务器,工具->选项->调试->符号,吧Microsoft符号服务器的勾取消。然后去下载windows开发者调试符号包:http://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/Windows_Win7SP1.7601.17514.101119-1850.AM

2015-10-25 22:02:02 577

原创 cocos2dX 3.x获取渲染Image

cocos2dx 3.x开始采用了异步渲染机制,以前在2.x版本采用重绘获取图片Image对象的放法会出现一点小bug,最近查找资料解决了这个问题,有一点思考:bool ControllerLayer::getNewImg(Sprite* img){ img->retain(); RenderTexture* pRender = RenderTexture::create(img-

2015-10-03 14:56:55 2659

空空如也

空空如也

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

TA关注的人

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