自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 邮件系统的设计

服务器启动时,也只需要存储一份相同的邮件内容,而不是像原来那样,每个玩家自己存一份。当一个活动结束需要给玩家发送邮件,若玩家数量很多,则存在大量的插入表的操作,同时,还由于存在大量的字符串拷贝(每份记录都各自存了一份邮件头跟邮件内容),势必会导致服务器资源的浪费,CPU飙升!对于过期的邮件,则可以设计一个时间堆进行检测,当到达过期时间时,删除该模板及所有引用该模板的玩家个人邮件。1.内存占比大(以人数最多的1区来说,一个scene进程就占了40+GB的内存,这还是下午的时候)和一张存储玩家个人邮件状态表。

2024-04-11 23:28:29 129

原创 记录一次项目上线后遇到的坑(map相关)

开发中遇到的一个map的坑

2023-02-19 11:08:29 179

原创 【工具篇】CMake简单入门教程总结

从事linux的开发工作,不可避免的需要进行编译构建的工作,相比在Windows上的使用VS直接开发c++程序,在Linux上开发c++程序,需要直接编辑Makefile,不仅需要熟悉Makefile的语法,还需要知道依赖和推导规则,比较麻烦。而CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。学会该工具的使用,无疑是性.

2022-05-29 17:10:26 923

原创 如何根据日期计算出星期几(C++实现)

蔡勒(Zeller)公式随便给一个日期,就能用这个公式推算出是星期几。蔡勒公式如下:W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下:w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六c:世纪-1(前两位数)y:年(后两位数)m:月(m大于等于3,小于等于14,即在蔡勒公式中,

2022-04-27 18:03:02 5633 4

原创 【服务器系统设计】select函数的用法及其原理总结

在Linux上,为我们提供了三种IO多路复用的函数供我们使用,select函数是网络通信编程中很常用的一个函数。select函数一般用于检测在一组socket中是否有事件准备就绪。select的声明:#include <sys/time.h> //for struct timeval#include <unistd.h> //for select/*** return 状态变化的文件描述符的个数* @param nfds: linux上的socket也是一种

2022-04-17 16:03:36 738

原创 malloc底层实现及原理总结

总结当开辟的空间小于128KB时,会调用brk()函数,其主要时移动指针_edata(此时的_edata指的是Linux地址空间中堆段的末尾地址)当开辟的空间大于128KB时,调用mmap()在虚拟地址空间中(堆和栈的中间,称为“文件映射区域”的地方)找一块空间来开辟具体内容当一个进程发生缺页中断的时候,进程会陷入核心态,执行以下操作检查要访问的虚拟地址是否合法查找/分配一个物理页填充物理页内容(读取硬盘,或者直接置0,否则什么都不做)建立映射关系(虚拟地址到物理地址的映射关系)继续

2022-04-13 20:40:17 389

原创 【服务器系统设计】socket的阻塞模式和非阻塞模式总结

前言对socket在阻塞和非阻塞模式下各个socket函数的表现进行深入理解,是掌握网络编程的基本要求之一,也是重点和难点。在阻塞和非阻塞模式下,我们常常讨论的具有不同行为表现的socket函数一般有connect,accept,send和recv。定义阻塞模式:指的是当某个函数执行成功的条件当前不满足时,该函数会阻塞当前执行线程,程序执行流在超时时间到达或执行成功的条件满足后恢复继续执行。非阻塞模式:即使某个函数执行成功的条件不满足,该函数也不会阻塞当前执行线程,而是立即返回,继续执行程序流。

2022-04-10 15:05:50 5871

原创 【游戏开发】卡牌游戏战斗系统设计与实现

前言目前的游戏市场有很多种卡牌回合制手游,可能由于这种游戏不像MMO会占用玩家大量时间,所以也有着相当的受众群体,像笔者以前读书那会玩过的腾讯的《龙珠激斗》,《火影忍者ol》均属于此类。跟大部分类型的游戏相同的是,战斗也是卡牌游戏的核心模块,而游戏中所有培养系统,竞技场,抽卡系统,全服活动均是为了战斗服务。一个设计比较好的战斗系统无疑能吸引到更多玩家。业务逻辑这种游戏一般是双方战斗开始前先布置好自己的阵容,然后进入打斗。期间按照回合制打法进行战斗,由先手一方先出手,选取攻击对象进行攻击,然后由对方出手

2022-03-26 20:56:59 5865

原创 游戏开发中AOI算法总结

定义在MMO游戏中,在一些多人玩法中,通常出现很多玩家在同一张地图上移动的情况,假如一个玩家发生了移动,释放技能,更换装扮…这时就需要通知其他玩家,而如果通知整张地图上的所有玩家的话,显然是不现实的,这将对客户端跟服务端都造成很大的压力,甚至可能卡死。为了解决这一痛点,就有了AOI算法。统一的接口设计AOI需求大概是这样:1.游戏地图上有一些npc和玩家在移动,每一个这样移动的对象我们叫做AOIEntity,每一个AOIEntity可以挂多个不同半径的AOI,每一个这种半径的AOI单元我们叫做AOI

2022-03-20 14:41:08 7023

原创 一次std::sort函数的踩坑记录

**问题:**最近收到一个反馈,有一个活动导致进程挂了,上去一瞧,发现居然是sort函数导致的宕机。。。原因在于自定义的比较函数将相等元素返回了true,函数大致如下:bool cmp(const A& obj1, const A& obj2){ return obj1.val >= obj2.val;}**问题的原因:**算是一个坑了。使用std::sort时,比较函数如果是大于等于或小于等于,可能会导致越界行为发生**问题的解决:**需要把比较函数的逻辑修改为当元素

2022-03-13 11:14:07 1078

原创 记录一次指针指向内存被修改的问题

最近遇到了一个奇妙的问题,在一个抽奖活动里抽奖偶尔会出现发给客户端的数据不正确的情况,结果初步排查,发现这是由于有一个指针指向的对象里的数据发生了错乱。而且很奇妙的,经常是抽了好几十次才出现一次这种情况先来看一段代码const Item* OnePiece::getRandItem(Lib* pLib, const std::set<DWORD>& extraSet){ std::vector<Item>& itemListCfg = pLib->it

2022-03-10 21:04:21 1431

原创 c++中成员函数的参数名与成员变量名重名导致的问题

最近开发时遇到一个坑,就是成员函数的参数名与成员变量名重名导致赋值失败。先来看看下面这份代码class PartUnit{public: PartUnit():userId(0), isRobot(0){} ~PartUnit(){} void initData(unsigned int userId, int isRobot);private: unsigned int userId; int isRobot;}void PartUnit::initData(unsigned i

2022-03-02 16:25:41 1932

原创 【服务器系统设计】缓冲区的设计总结

为什么需要发送缓冲区和接收缓冲区网络层在发送数据的过程中,由于TCP窗口太小,会导致数据无法发送出去,而上层可能源源不断地产生新的数据,此时就需要将数据先存储起来,以便等到socket可写时再次发送,这个存储数据的地方就叫做发送缓冲区。对于接收缓冲区也是一样的道理,在收到数据后,我们可以直接对其进行解包,但是这样做不好,有三个理由理由一:除去一些通用的协议格式,大多数业务都是采用的自定义协议格式,也就是说对一个数据包里面的数据格式的解读应该是业务层应该做的。不同的业务一般有不同的协议格式,协议格式与具

2022-01-22 22:07:54 1644

原创 【服务器系统设计】收包时粘包问题的处理

在计算机技术体系中存在很多网络通信协议。那么通信协议的本质究竟是什么呢?其实,通信协议实质上就是一段数据,通信双方事先约定好按照规定的格式去编码和解码,最终达到传输消息的目的。而对通信协议的设计与处理其中隐藏着许多问题从TCP协议说起TCP是一种流式协议,所谓流式协议就是说协议的内容是流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地给这些内容划分边界。如果没有人为地划分边界,那会发生什么问题呢?举个例子,A和B进行TCP通信,A先后给B发送了两个大小分别是100字节和200字节的数

2022-01-22 17:39:33 2180

原创 c++11实现一个简单的线程池

#ifndef THREAD_POOL#define THREAD_POOL#include <mutex>#include <condition_variable>#include <queue>#include <thread>#include <functional>#include <assert>class ThreadPool{public: explicit ThreadPool(size_

2022-01-09 17:35:46 310

原创 自定义数据结构想要使用 std::set 需要重载哪些操作符

在利用自定义数据结构套用 STL的set 的时候,比如说,std::set 是有序的,它就需要你重载一个operator< 操作符;// Operator < overridebool operator<(const Point& rhs) const { return (x + y) < (rhs.x + rhs.y);}再比如说,你想要利用 std::find 来将一个 std::vector 中的自定义数据结构对象进行查找,这里就隐含需要调用自定义数

2021-11-30 16:32:34 689

原创 Redis中的数据结构设计学习笔记——SDS(简单动态字符串)

SDS的定义struct sdshrd{ int len; //记录buf数组中已使用的字节数,等于SDS所保存的字符串长度 int free; //记录buf数组中未使用的字节数 char buf[];//字节数组,用于保存字符串};关于未使用空间,SDS是如何使用的?sds采用了空间预分配和惰性空间释放两种策略模式来管理未使用空间空间预分配①如果对SDS进行修改后,SDS的长度(即len)的长度小于1 MB,那么程序将分配与len属性同样大小的未使用空间②如果对

2021-11-27 19:42:29 536

原创 分析obj文件探索编译器何时生成默认构造函数

前言提起构造函数,很多人都不陌生,在学习C++的时候,我们经常会听到“默认构造函数”的函数,并一直有一个传统认知,就是说在一个类的定义中,如果程序员没有定义任何构造函数的话,编译器会隐式地生成一个默认的构造函数,并称之为“合成默认构造函数”。那么,如果程序员没有定义任何构造函数,编译器是否会生成一个“合成默认构造函数”呢?我们接下来就来探索一下前提知识在C++中,如果要生成一个可执行文件,需要经过编译、链接的步骤,一个.cpp的文件,经过编译,就会生成一个.obj(或者.o)文件,这个文件也叫作目标文

2021-10-06 19:42:57 173

原创 C++类对象大小规则总结

规则成员函数不占类对象的内存空间一个类对象至少占1字节内存空间成员变量是包含在每个对象中,占字节的成员函数虽然也写在类定义中,但成员函数不占类对象的字节空间,也就是说,成员函数是跟着类走的,跟类对象没有关系,不管用这个类产生了多少个该类的对象静态成员变量不计算在对象的sizeof内普通成员函数和静态成员函数不计算在sizeof内虚函数不计算在对象的sizeof内,但虚函数会让对象的sizeof增加4字节以容纳指向虚函数表的指针虚函数表是基于类的如果类中有多个数据成员,那么为了访问速度和性

2021-10-06 15:30:12 865

原创 浅谈观察者模式

观察者模式(Observer)使用场景:当对象间存在着一对多关系的时候,往往会采用观察者模式,比如说,当一个对象发生改变时,需要自动通知所有依赖它的对象,这个时候,我们就可以采用这种设计模式,该模式属于行为型模式。例子:众所周知,在平时构建软件系统体系结构的时候,我们往往会采用MVC模式,即“模型——视图——控制器”,在该模型中,视图与数据应当是分离的,它们间的耦合度应该尽可能松散,以达到解耦的效果。它们间的松耦合关系一般可以采用观察者模式来给予实现。模板代码可以这样子设计1.定义观察者接口,所

2021-05-05 15:28:39 143 2

原创 Linux中的守护进程

概念Linux的守护进程又被称为Daemon进程,为Linux的后台进程(独立于终端)。一般来说,我们在程序中创建的进程会随着终端的关闭而退出。那么假如我们需要一个在Linux后台不断运行的进程该如何做呢?这个时候就需要我们的守护进程了。守护进程通常周期性地执行着某种任务或者等待着处理某些事件。其生命周期较长,通常在系统启动的时候开始执行,在系统关闭时终止,在Linux中的许多系统服务都是通过守护进程来实现的。一般的网络服务也以守护进程的形式来实现。那么,如何创建一个守护进程呢?创建守护进程的步骤创

2021-04-13 21:09:43 233

原创 孤儿进程与僵尸进程

文章目录父进程与子进程孤儿进程僵尸进程父进程与子进程进程是操作系统中资源调度的最小单位。在Linux中,为我们提供了fork()函数来进行进程的创建,在Linux的官方手册上解释了fork()函数创建进程的方式,即子进程被创建是通过对父进程的复制得来的。子进程对父进程的复制实际上复制了父进程的整个地址空间,需要注意的是,虽然子进程是复制了父进程所使用的的地址空间。但子进程创建成功后。子进程所访问的虚拟空间一定是属于自己的,而非与父进程共享此空间(这里,注意与线程区分开)。其本质是父子进程分别映射到不同的

2021-04-11 22:10:55 105

原创 聊聊STL中的vector的扩容

文章目录前言原理capacity和size影响前言在平时的开发中,vector可以说是用得最多的STL容器之一了。我们都知道为了支持快速的随机访问,vector的底层是用数组实现的。在内存中,vector将元素连续存储,而vector的size也会随着我们添加的元素的增多而变大。不同于原生的数组需要我们在声明时就得指定数组的大小,这无疑给我们的开发工作带来了很多便利,那么,vector这个类究竟在底层做了什么呢?原理在标准类库中,当我们采用push_back操作,往vector中添加元素时,若此时v

2021-04-11 11:44:35 639

原创 C++中的菱形继承

前言与Java等其他语言不同,C++中支持多重继承。然而,这种多重继承往往会导致很多问题的出现。比如说出现的菱形继承问题。问题什么是菱形继承呢?先来看下面这幅图#mermaid-svg-9Q1LAyi3YqGBX040 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-9Q1LAyi3YqGBX040 .l

2021-04-11 11:02:48 122

原创 C++中常见的未定义行为

文章目录前言总结数组越界问题非法多次释放同一块内存空间不恰当使用容器的erase操作其他前言在一些程序语言中,在某些情况下存在着一些未定义行为,其中以C和C++最为著名,在C++中,规定某些操作的行为是未定义的。这些未定义行为往往会导致一些程序的错误问题的出现,作为一名合格的程序员,应该极力避免这些未定义行为的出现,让程序的运行结果不会说出现不确定的情况。总结在C++中的常见的未定义行为主要有以下几种:数组越界问题在C++中,数组越界问题是一个重灾区,也是很多人容易疏忽的点。比如以下的程序co

2021-04-04 15:32:08 2042

原创 C++中的智能指针

文章目录前言shared_ptr类unique_ptrweak_ptr前言在C++中,除了静态内存跟栈内存外,每个程序还有一个内存池,这部分内存都被称作自由空间或者堆。这部分内存的管理是通过一对运算符来完成的,即new跟deletenew:在堆内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对该对象进行初始化delete:接收一个动态对象的指针,销毁该对象,并释放与之相关联的内存空间众所周知,内存管理一直是C++程序员在使用C++语言时的一个难点,C++不像Java等其他语言一样,有G

2021-04-04 10:45:16 94

原创 【leetcode】25. Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.k is a positive integer and is less than or equal to the length of the linked list. If the number of ...

2019-02-24 22:05:54 114

原创 【leetcode】24. Swap Nodes in Pairs

Given a linked list, swap every two adjacent nodes and return its head.You may not modify the values in the list's nodes, only nodes itself may be changed. Example:Given 1-&gt;2-&gt;3-&gt;4, ...

2019-02-24 22:04:31 106

原创 【leetcode】383. Ransom Note

Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; ot...

2019-02-18 23:48:48 124

原创 【leetcode】240. Search a 2D Matrix II

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:Integers in each row are sorted in ascending from left to right. Integers in each...

2019-02-14 22:21:08 98

原创 【leetcode】263. Ugly Number

Write a program to check whether a given number is an ugly number.Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.Example 1:Input: 6Output: trueExplanation: 6 = 2 ×...

2019-02-14 20:23:09 102

原创 【leetcode】204. Count Primes

Count the number of prime numbers less than a non-negative number, n.Example:Input: 10Output: 4Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.题解1:利用素数检测class Solu...

2019-02-14 20:14:13 100

原创 【leetcode】513. Find Bottom Left Tree Value

Given a binary tree, find the leftmost value in the last row of the tree.Example 1:Input: 2 / \ 1 3Output:1 Example 2: Input: 1 / \ 2 3 / / \...

2019-02-13 10:25:54 107

原创 【leetcode】515. Find Largest Value in Each Tree Row

You need to find the largest value in each row of a binary tree.Example:Input: 1 / \ 3 2 / \ \ 5 3 9 Output: [1, 3, 9]题解如下:/** * Defini...

2019-02-12 23:43:04 92

原创 【leetcode】894. All Possible Full Binary Trees

A full binary tree is a binary tree where each node has exactly 0 or 2 children.Return a list of all possible full binary trees with N nodes.  Each element of the answer is the root node of one poss...

2019-02-12 20:50:23 126

原创 【leetcode】779. K-th Symbol in Grammar

On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.Given row N and index K, return th...

2019-02-12 20:10:00 185

原创 229. Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.Note: The algorithm should run in linear time and in O(1) space.Example 1:Input: [3,2,3]Output: [3]Exa...

2019-02-11 14:17:06 101

原创 【leetcode】48. Rotate Image

You are given an n x n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Note:You have to rotate the image in-place, which means you have to modify the input 2D matrix d...

2019-02-11 11:57:52 151

原创 【leetcode】3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.Example 1:Input: "abcabcbb"Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2:...

2019-02-11 11:08:25 116

原创 【leetcode】784. Letter Case Permutation

Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string.  Return a list of all possible strings we could create.Examples:Input: S = "a1b2...

2019-02-10 19:44:20 116

邮箱服务器搭建教程

邮箱服务器搭建教程,按照这个教程大家可以搭一个本地邮箱服务器玩玩

2018-08-22

Java编程思想(第四版)

大神书,Java编程思想第四版,相信大家看完肯定会有所收获的

2018-08-22

空空如也

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

TA关注的人

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