自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

丁香枝上,豆蔻梢头

提出问题,解决问题,是我前进的动力

  • 博客(100)
  • 问答 (2)
  • 收藏
  • 关注

原创 C++多态(上)——虚函数、虚表

OOP的核心思想是多态性(polymorphism)。其含义是“多种形态”。我们把具有继承关系的多个类型称为多态类型。引用或指针的静态类型和动态类型不同这一事实正是C++语言支持多态性的根本所在。 多态性:当用于面向对象编程的范畴时,多态性的含义是指程序能通过引用或指针的动态类型来获取类型特定行为的能力。多态性在C++中是通过虚函数来实现的。首先我们先来强调几组概念: 静态多态和动态多态、静

2017-04-18 15:42:31 1144 1

原创 C++继承详解三 ----菱形继承、虚继承

今天呢,我们来讲讲菱形继承与虚继承。这两者的讲解是分不开的,要想深入了解菱形继承,你是绕不开虚函数这一点的。它俩有着什么关系呢?值得我们来剖析。 菱形继承也叫钻石继承,它是多继承的一种特殊实例吧,它的基本架构如下图: 在我们的设想中,D所对应的对象模型应该如下图所示: 下面我们来用一段代码验证一下: class A{public: A() { cout

2017-04-17 23:01:25 979

原创 智能指针(下)-----boost库智能指针,定制删除器、循环引用

上一篇我们已经详细讲解了智能指针的基础性知识和auto_ptr的模拟实现。 今天呢我们来讲解boost库的发展。 在C++11标准出来之前,C++98标准中都一直只有一个智能指针auto_ptr,我们知道,这是一个失败的设计。它的本质是管理权的转移,这有许多问题。而这时就有一群人开始扩展C++标准库的关于智能指针的部分,他们组成了boost社区,他们负责boost库的开发和维护。其目的是为C++

2017-04-15 16:54:48 547

原创 智能指针(上)-----动态管理内存问题,auto_ptr的模拟实现

今天我们来详解C++中一个重要的知识点——智能指针。文章主要以下面几点来展开:智能指针定义及动态内存的管理智能指针作用auto_ptr的模拟实现智能指针定义 智能指针简单理解就是智能的指针,它可以智能/自动化的管理指针所指向的动态内存的释放。 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制(利用了RAII技术),这样做的目的是为了使得智能指针可以方便的管理一个对象

2017-04-13 09:22:29 923

原创 模板2——顺序表的实现(现代写法的进一步解析,更深层次的深浅拷贝)

之前我们讲解了关于模板方面的知识,今天我们用模板来实现顺序表。 这次顺序表的实现和之前没有太大区别,但还是有几点需要我们来重点进行详解。 我们先来看下面这段代码#include<iostream>#include<string>#include<assert.h>using namespace std;template<typename T>class SeqList {pub

2017-04-11 11:45:20 472

原创 粘滞位(SBIT)

一.什么是粘滞位? 粘滞位(stickybit),又称黏着位,是Linux文件系统权限的一个特殊权限(有三个:SUID,SGID,SBIT)。最常见的用法是在目录(只能是目录,文件无效)上设置粘滞位,如此一来,只有目录内文件的所有者或者root才可以删除或移动文件。如果不为目录设置粘滞位,任何具有该目录写和执行的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般用于/tmp目录

2017-03-28 00:27:57 1716

原创 三子棋的实现

三子棋的实现还是比较简单的,在写代码之前,你先构建一下游戏的架构,这样写的时候思路比较清晰,不容易思想卡克,很容易就完成。再一个,你写的代码并不是孤芳自赏的,而是要拿出来给别人看,别人可以清楚地看懂你的代码,这才是好代码。我们先来看三子棋的架构如何实现,这就看你的思维逻辑能力了。下面代码很清晰的展现了这一架构: void game()

2016-11-24 01:58:27 1335 1

原创 Cookie和Session学习

Session机制可以放在文件,数据库或者内存都可以,是以键值对的形式存储。使用场景当客户端向服务器端发送一个请求时,服务器端首先会先检查请求里是否包含一个Session标识(sessionID),如果包含,说明之前已经为此客户端创建过session,然后就检索出来使用,如果没有,服务端会为此客户端创建一个session,并将sessionID在本次响应中返回给客户端保存。session保存方法1,cookie保存服务器通过设置cookie的方式将sessionID发送给客户端,如果不设置过期时

2021-06-21 21:35:15 146

原创 HTTP学习

概念简介超文本传输协议(HyperText transfer Protocol),他是基于TCP/IP协议的应用层协议,一般用于B/S架构。特点1,支持客户端/服务端模式(C/S)2,简单快速:请求服务时只需传送请求方法和路径。常用的方法:GET,HEAD,POST,PUT,DELETE3,灵活:可以传输任意类型的数据对象(标记:Content-Type)4,无连接:每次连接只处理一个请求。一次请求响应完成后断开连接。后面通过connection:keep-alive实现长连接5,无状态:是一

2021-06-21 15:30:24 172

原创 UDP与TCP高频面试题

**1,特点与区别**UDP(用户数据报协议):无连接,不可靠,快,面向数据报(对应用程序传下来的报文不合并也不拆分,只添加UDP首部),没有拥塞控制,支持1:1,1:n,n:1,n:n。TCP(传输控制协议):面向连接,可靠,慢,面向字节流(对应用程序传下来的报文看成字节流,组织成大小不等的数据块),有流量控制,拥塞控制,提供全双工通信,支持1:1。2,TCP的三次握手和四次挥手-> 见我的另一篇文章3, TCP短连接和长连接区别与应用场景短连接:完成一次读写后就可以关闭了,管理简单

2021-06-18 17:15:39 240 1

原创 Redis学习

1,数据存储概况redis是内存数据库,数据结构数据库,kv数据库内存数据库(性能出色,容量限制于物理内存):redis特点:1,单线程的(文件事件分派器队列的消费是单线程的,4.0后有了多线程概念(多线程删除对象),6.0在网络ID处理方面上了多线程,执行命令的核心模块还是单线程)2,性能出色;3,支持丰富的数据类型;4,支持事务。都是原子操作;Redis支持主从模式:分布式读写分离模型:master用来插入数据,slave提供检索服务。为了避免masterDB的单点故障,集群一般采用

2021-06-15 20:37:16 122 1

原创 ETCD学习

1,ETCD是一个键值对数据存储系统(开源,分布式)2,用途:提供共享配置、服务发现。3,leader选举非常优秀,leader选举更换对前端是无感知的。(raft算法)4,读写数据在ETCD上,支持快照及查看历史事件5,数据模型:一个持久的并发控制数据模型,适用于较小的元数据键值对的处理功能介绍本身状态查看(集群成员信息、集群状态、leader状态等键值数据的读写:set,get租约:带有Id的定时器,可以和多个存储键值关联(自动过期删除)观察者:分布式系统中间有大量的信号同步,这个就可

2021-06-10 03:14:51 544

原创 STL容器总结

序列式容器:vector:变长容器,可以根据数据的插入删除来重新构建容器容量。它是由三个迭代器来表示(起始字节位置,最后一个元素位置,占用的所有内存末尾位置),底层存储接口还是数组。array:(c++11新加的):和普通数组一样,都属于定长容器。只是封装了许多常用的接口,方便使用。注:vector和array提供了size和判空获取机制;vector和array提供了两个容器对象内容交换方法;迭代器失效问题。list:有双向链表实现(有的是双向循环列表),内存数据是不连续的,所以需要指针

2021-06-08 18:27:07 91

原创 CSP并发模型

不要以共享内存的方式来通信,相反,要通过通信来共享内存Go语言的并发模型参考的是CSP理论(Go推荐的,通信顺序进程,一种并发编程模型),另一种就是多线程共享内存,在访问共享数据时,通过锁来访问,因此衍生出了许多方便的数据结构,叫做“线程安全的数据结构”。Go的CSP并发模型CSP = goroutine + ChannelGoroutine实际并发执行的实体,它底层是使用协程(coro...

2020-03-31 00:08:40 389

原创 游戏上线问题总结

1,Log问题(吃过亏才会重视)游戏上线后,随着玩家数据量的剧增,许多bug就会随之出现,但同时有些bug是很难复现的,这时候定位问题就不可能通过打断点来进行查找,这时候完整的log信息才是定位问题的关键。log等级:Trace:Debug:Info:Warn:Fatal:2,recover使用(循环时处理/加锁时处理)3,线程panic崩溃,使得channel读端出错,导致ch...

2019-10-31 00:27:16 400

原创 批量GM指令处理

1,在游戏目录中新创建一个txt文件2,编辑文件内容,如下(根据自己需求):#unlock#setquest 13606#setlevel 29#additems 1001 13,解析文件内容发送服务端,逻辑如下(Lua):local GMFilePath = "GMFile/"function splist(str,reps) local result = {} stri...

2019-10-18 12:06:49 281

原创 Go问题

//错误代码this.tombPlayerData = make(map[AvatarID]TTombPlayerData)this.ParentZone.GetSpaceHolder().ForeachPlayer(func(player INodePlayer) bool { this.tombPlayerData[player.GetAvatarID()].RoleName = pla...

2019-08-20 18:49:21 417

原创 Git/SVN工作中常见问题

1,(Git)commit时勾选了不需要提交的文件,想撤销commit解决方案:输入指令:git reset --soft HEAD^(回到上一个版本,或者可以是HEAD~1)git reset --soft HEAD^(回到上一个版本,或者可以是HEAD~1,如果进行了两次commit,就使用HEAD~2)这里有几个参数注意:--mixed (不删除工作空间改动代码,撤销gi...

2019-08-14 10:39:07 212

原创 地图的可拖动功能以及点击寻路坐标问题

需求:由于地图中展示的元素增加,导致地图图片被放大,在地图界面不能完全显示,所以添加可拖动功能。解决方案很简单:prefab调整, 逻辑编写(打开地图,玩家的图标尽可能靠中心位置)一,在prefab上进行的调整注:上图中m_MapBG_img是地图界面中地图显示框,m_miniMap_img是地图资源在第一层级中添加两个组件(自查):Rect Mask 2D 和 scroll Rect...

2019-08-12 21:57:38 770

转载 MYSQL表(表数据)删除

  本文主要讲mysql中三种删除表的操作,delete语句、truncate语句以及drop语句的区别:delete1、删除整张表的数据:delete from table_name;2、删除部分数据,添加where子句:delete from table_name where...;3、说明   1)、属于DML语言,每次删除一行,都在事务日志中为所删除的每行记录一项。产...

2019-06-10 14:07:53 305

转载 Unity3D 文章收藏

1,UGUI——RectTransform详解https://blog.csdn.net/serenahaven/article/details/788268512,

2019-05-06 13:11:53 190

原创 版本管理与控制之分支介绍

GIT鉴于我们一般在idea中进行git操作,因此,使用idea作为git的可视化操作工具举例,其它的工具(比如SourceTree大同小异)。如下图,这里表示你当前所处的分支(图例中为master)1,创建本地分支单击"master",根据你的本地分支情况,大致出现如下图:其中,Local Branches为你当前的本地分支,Remote Branches为远程分支。如果你以前创建...

2019-04-01 15:15:19 672

原创 lua队列、栈,字典实现

简单队列实现--@class LuaQueueLuaQueue = class("LuaQueue")function LuaQueue:ctor() self.front = 1 self.last = 0 self.count = 0 self.objects = {}endfunction LuaQueue:EnQueue(object) self.last = se...

2019-03-30 15:41:48 1035

原创 lua层与C#层的交互

在我现在参与的这个项目中,游戏前端代码主要用Lua进行逻辑书写,C#提供许多接口。这里呢我来简单举个例子来进行说明。1,在C#层写一个简单测试代码,如下:public class Test : MonoBehaviour{ public Transform Tip; --在Unity界面可以直接通过拖动对应组件进行赋值 // Start is called before ...

2019-03-26 10:48:55 379

原创 Unity 之 Canvas

Canvas.ForceUpdateCanvases 强制更新画布描述强制更新所有画布的内容。在最后一帧画布执行布局和内容生产的计算,仅在渲染之前,为了确保在该帧期间发生的最新的改变在画布上。这意味着在返回调用开始和首次更新返回调用时,画布下的布局和内容可能不是最新的。...

2019-03-23 17:19:48 984

原创 有关时间戳的整理

提供一个很好的在线工具网站:https://tool.lu/c/developer 什么是时间戳? Unix时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。获取当前时间戳 Go:import ( "time")int32(time.Now().Unix())C#:(DateT...

2018-04-16 23:13:13 307

原创 Unity3D游戏中Android本地推送通知整理

现在手游中出现了越多的定时通知的需求,因为是固定时间推送,所以不需要通过服务器进行推送,只需要利用各个平台自己的本地推送机制就可以实现这个功能。 在Unity3D官方提供的API中,UnityEngine.iOS中有一个类:LocalNotification 它只实现了iOS的本地推送,即仅适用于iphone/ipad/ipod Touch. Unity3D API链接:https://do...

2018-04-16 23:00:16 3717 2

原创 lua常用函数库汇总

lua库函数 assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 collectgarbage() - 垃圾收集器. (新增于1.10.1) date(format, time) - 返回当前用户机器上的时间. error(“error message”,level) - 发生错误时,...

2018-04-04 20:57:55 1643

原创 猜数字游戏(Go实现)

后面会使用Unity3D加上UIpackage mainimport ( "fmt" "bufio" "os" "strconv" "math/rand" "time")var RANGENUM int = 20func CreateRangeNum(num int) int { ret := rand.New(

2018-04-04 18:57:23 395

转载 高可伸缩的游戏服务器架构

水平扩展是高可伸缩的首要条件,因此,在设计之初就必须考虑好水平扩展考方案。事实上这一部分几乎花了我1整个月的时间来设计,在此期间我重写了3版才总算确定下来我认为可用的方案。第一版设计方案如下:将服务器分为3类,分别是GateServer, LoginServer, LogicServer。GateServer管理客户端链接,数据包的加密、解密、广播、转发等与业务逻辑无关的操作。当压力过...

2018-03-14 17:15:54 513

原创 Lua中常见的数据结构

—————————————-arraya = {} –数组大小不确定,可动态增长for i = 1,1000 do a[i] = 0end–可以用构造器在创建数组的同时初始化数组:a = {1,2,3,4,4,5,6}—————————————-矩阵和多维数组 –表示矩阵的方式1:数组的数组mt = {}for i = 1,M do mt[i...

2018-03-13 11:52:47 591

转载 Lua ——闭包问题

当一个函数被写入另一个函数时,它可以完全访问函数中的局部变量; 这个特征被称为词法范围。虽然这听起来很明显,但事实并非如此。在编程语言中,词法范围界定和一流功能是一个强大的概念,但很少有语言支持该概念。让我们从一个简单的例子开始。假设你有一个学生姓名列表和一个将姓名与成绩联系起来的表格; 你想根据他们的成绩(首先是更高的成绩)对名单进行排序。您可以按如下方式完成此任务:names = ...

2018-03-06 14:05:06 363

原创 golang defer

在Go中,defer语句用于延迟一个函数或方法(或者当前创建的匿名函数)的执行。它会在外围函数或方法返回之前但是其返回值(有的话)计算之后执行,这样就有可能在函数内部修改函数的命名返回值。 如果一个函数或方法中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。 最常用的用法: 1,保证使用完一个文件后将其成功关闭; 2,将一个不再使用的通道关闭; 3,捕获异...

2018-02-28 13:39:58 134

转载 golang channel

&lt;p&gt; Go语言内置了书写并发程序的工具。将go声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并发线程。这种线程在Go语言中称作goroutine。在这里我要提一下,并发并不总是意味着并行。Goroutines是指在硬件允许情况下创建能够并行执行程序的架构。 &lt;/p&gt; 让我们从一个例子开始: fu...

2018-02-27 14:14:47 376

转载 golang: string与byte的区别

golang string和[]byte的对比为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) int?string和[]byte,底层都是数组,但为什么[]byte比string灵活,拼接性能也更高(动态字符串拼接性能对比)?今天看了源码探究了一下。以下所有观点都是个人愚见,有不同建议或...

2018-02-26 15:44:36 2498 1

转载 Go语言中的interface理解

1、interface 是一种类型 首先 interface 是一种类型,从它的定义可以看出来用了 type 关键字,更准确的说 interface 是一种具有一组方法的类型,这些方法定义了 interface 的行为。go 允许不带任何方法的 interface ,这种类型的 interface 叫 empty interface。如果一个类型实现了一个 interface ...

2018-02-26 11:20:13 341

原创 海量数据处理(面试题)

1.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?! 解题思路:哈希分桶法。 1,将100G文件分到1000个文件中,然后将每个IP地址映射到对应文件(IP地址转换为整数,对文件个数进行取余,然后根据结果放入对应文件,这样保证相同的IP肯定在同一文件中); 2,统计每个文件中出现次数最多的IP,然后比较取最大

2017-08-21 21:16:58 556

原创 每日一题——判断二叉树是否平衡,求一棵二叉树的镜像

1,判断一棵二叉树是否平衡 一棵树平衡是指它根节点到叶子节点的最长路径与最短路径只差不超过1。bool IsBanlance(Node* root,int& depth){ if(root == NULL) { depth = 0; return true; } int leftDepth = 0; int rightDep

2017-08-10 22:04:46 338

原创 每日一题——求二叉树的高度,销毁二叉树

1,求二叉树的最大高度:int length(Node* root){ if(root == NULL) return 0; int leftLength = length(root->left); int rightLength = length(root->right); return (leftLength>=rightLength?(leftLe

2017-08-10 09:52:34 445

原创 每日一题——求二叉树叶子节点个数,第K层节点个数

1,求叶子节点个数int leafnum(Node* root){ if(root == NULL) return 0; if(root->left == NULL && root->right ==NULL) return 1; return leafnum(root->left)+leafnum(root->right);}2,第K层节

2017-08-09 23:49:36 515

空空如也

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

TA关注的人

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