自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 awk 捕获匹配

第二参数表示匹配正则,用//包含 ,xxxid=表示必须包含的字符串, ([0-9]+?希望从一行里面 xxx xxx xxxid=12345 xxx 输出12345。如果是print a[0] 则会输出 xxxid=12345。print a[1] 表示打印捕获的第一个结果。第一参数$0表示前面步骤里面的一整行。其中 match 是一个匹配方法。第三参数表示匹配结果放置的变量。记录下一个最简单的用法。

2023-09-29 16:19:49 145

原创 一种基于aes加密的伪随机数生成器

class aesRand { public: using cipher_evp_t = EVP_CIPHER_CTX; static aesRand& instance(){ static aesRand _instance; return _instance; } aesRand():enc(nullptr), index(0){ } p...

2020-12-07 21:35:07 1210 1

原创 protobuf在unity 和 linux c++服务器的使用

unity使用protobuf-net见这里https://blog.csdn.net/qq_35107322/article/details/110396018服务器快速安装1 yum install protobuf-devel2 项目的make文件加入-lprotobuf3 编写proto文件4 根据proto文件生成c代码protoc game.proto --cpp_out=./5 写代码测试代码;协议文件[root@VM_156_144_centos socket_tcp

2020-12-01 17:13:44 249

原创 unity protobuf-netunity protobuf-net使用实践

1 下载代码git clone https://github.com/protobuf-net/protobuf-net.git2 本人使用vs2019编译发布进入protobuf-net\src打开protobuf-net.sln全部重新生成 OK如果有问题,一般可以补安装一些sdk。。。实际使用到的是protobuf-net和protogen在vs里选中这两个目录,右键生成,done3 测试一下protogen,.\protogen.exe --csharp_out=cs --pac

2020-11-30 20:15:18 364

原创 排行榜算法(rbtree skiplist)性能比较

关于几种主流排行榜方案,这里有一个链接,说的挺好的https://gameinstitute.qq.com/community/detail/101951#使用redis的zset是比较方便的,他其实也是基于skiplist的。故而自己分别基于rbtree 和skiplist的方案,写了两份排行榜用的排序树,测试了一下性能。机器配置Cpu:8核cpu MHz : 2595.124cache size : 512 KB内存:16G对于1百万级别数据,O2优化时间复杂度:两

2020-10-29 14:53:49 1330

原创 aes cbc示例代码 c

void encrypt(const unsigned char *in, int in_len, unsigned char *out, int *out_len){ int ret; unsigned char ivec[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0...

2020-09-04 20:04:59 498

原创 aes cbc的示例代码python版本

参考:https://www.cnblogs.com/xuchunlin/p/11421795.htmliv使用了bytes类型key直接是string# -*- coding=utf-8-*-import timeimport jsonimport socketfrom Crypto.Cipher import AESimport base64"""测试代码 """class AESUtil: __BLOCK_SIZE_16 = BLOCK_SIZE_16 = A

2020-09-02 15:04:59 162

原创 udp的收发包示例代码

recv这里直接使用的是阻塞式。接受到一个udp包后,回复一个udp包。回复地址通过recvfrom获取。通过bind绑定接受端端口9999。void recv_test() { int32_t nSockHandle; nSockHandle = socket(AF_INET, SOCK_DGRAM, 0); printf("nSockHandle: %d\n", nSockHandle); struct sockaddr

2020-09-02 14:41:11 339

原创 一个rbtree的插入流程图示

一个rbtree的插入流程图示

2020-08-19 15:09:41 186

原创 avl树的代码实现

struct Node{ shared_ptr<Node> left_; shared_ptr<Node> right_; int value_; Node(int v){ value_ = v; } }; using node_ptr = shared_ptr<Node> ; struct NodePosInfo{ int w

2020-08-14 14:46:18 99

原创 直观打印二叉树的代码实现

struct Node{ shared_ptr<Node> left_; shared_ptr<Node> right_; int value_; Node(int v){ value_ = v; } }; class binary_sort_tree{ // xianxu root left right // zhongxu lef

2020-08-12 16:55:04 344

原创 二叉查找树的代码实现

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。以下是实现代码:struc

2020-08-12 15:21:52 651

原创 堆排序代码实现c++

基本概念:1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值。满二叉树由于其满的特点,无法插入和移除,业务上一般极少使用。定义:1、堆是一颗完全二叉树;2、堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值。3、堆中每个结点的子树都是堆树。堆是一颗完全二叉树,但是二叉树不一定是一个堆。因为堆是具备不完全的排序特性。堆不是一个完全有序的数

2020-08-11 15:25:04 272

原创 make_pair用法

make_pair用来拼接2个参数,合并为1个,不能再多了可以用来接收两个返回值,如果有多个返回值,可以直接拼接到struct里面返回。#include <iostream> // for make_pair#include <memory> // for shared_ptrusing namespace std;namespace nm_test_pair{ std::shared_ptr<std::pair<int, char> &gt

2020-08-05 11:38:13 6111 1

原创 using与typedef的区别

普通类型场合 ,两者无区别模板场合,typedef不适用,只能使用usingnamespace nm_test_using{ class test_typedef{ public: typedef int myint; myint v1 ; //template<class T> //typedef T my_template_int; // error: template declaration of ‘t

2020-08-05 10:56:40 1160

原创 c++11 匿名函数在find_if中的使用

#include <vector>#include <algorithm>#include <functional>int main(int argc, char** argv) { int ret = 0; vector< int> db_{10, 20, 30, 50}; auto func_ = [](vector<int> & v_, int32_t value_){ auto

2020-08-04 13:42:55 664 1

原创 动态扩缩容/容灾的一点思考

当下,越来越多的业务场景,由于规模的扩大,基本都使用了分布式架构。.分布式架构的服务模型:基于请求key,通过路由算法(随机、取模、一致性hash)选取服务节点,完成逻辑处理后返回结果。服务器服务分为有状态服务和无状态服务。所谓无状态,就是一次请求一次处理结果,不存在中间态,没有缓存数据。而有状态则是某一次的请求依赖上一次请求处理的中间结果,比如游戏业务中的某次玩家操作必然依赖于登录请求等。静态扩缩容不论是否有状态,均可以支持。动态扩缩容节点宕机与恢复属于动态扩缩容的范畴,宕机缩容,恢复扩容

2020-07-28 21:37:35 603

原创 stl几种容器简述

stl有以下几种容器 vector deque list set mapvectorvector其实就是一个数组,是一个连续空间。所以他支持快速的随机访问,直接基质+偏移就可以找到目标。vector的容量并不是使用多少就开辟多少,每次不够用的时候,会多开辟一点,规则是简单2,可见下面的示例代码,如果使用Reserve之后还不够,就会在Reserve的基础上2。因此,也同时带来一个缺点,那就是迭代器失效,由于不够用的时候,空间是重新开辟的,所以原来的地址就无效了,此外,vector会进行一次内存拷贝,

2020-07-27 15:02:59 209

原创 TCP/UDP

tcphttps://blog.csdn.net/sinat_36629696/article/details/80740678udphttps://blog.csdn.net/china_jeffery/article/details/78923428重点摘录为什么tcp需要3次握手其实理由同4次挥手,只不过服务器将确认ack和请求syn合并了而已,所以是3次为什么tcp需要4次挥手因为双端是各自关闭的,当客户端断开,服务器确认后客户端关闭,服务器可能还有数据未发完,所以等服务器也发完

2020-07-24 16:47:33 99

原创 共享内存

定义共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。以上摘自百科。一点个人理解共享内存是可以独立于进程存在的,可

2020-07-24 10:31:05 1021

原创 io模型

阻塞io启动io后,阻塞,知道结果回来。比如文件的read、write。非阻塞io启动io后,直接让出cpu时间片,不阻塞,后续通过询问是否已完成,然后去拿结果。多路复用io我理解上的多路复用,通过管理多个io句柄,哪个句柄有事件到达就执行哪个句柄的读取。典型的三种模型:select poll epollselect的几大缺点:(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个

2020-07-24 10:13:00 45

原创 前台进程和后台进程

首先他们都是进程,同样的二进制可执行文件可以使用两种方式运行。区别:前台进程会阻塞用户界面,也就是说,他的父进程是用户界面进程。后台进程则没有用户界面,父进程是系统默认的1号进程。后台进程的启动方式有以下两种。1 可以使用./exe &2 fork后父进程退出...

2020-07-23 18:42:21 608

原创 死锁

死锁定义死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁的4个必要条件1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请

2020-07-23 17:15:56 123

原创 虚拟内存管理

定义虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。我的理解进程实例在用户态并不直接操作物理内存地址,实际物理内存是可能是零散的,用户管理起来绝对要疯,所以,用户可见的实际上是一段连续的虚拟地址空间。并且,虚拟内存遵循用到时才申请的原则,不会说你开辟了G级空间,就需要分配G级物理内存。int main(){ char* test

2020-07-23 16:33:34 131

原创 僵尸进程与孤儿进程

僵尸进程与孤儿进程有本质区别。这两种进程均是针对子进程而言。僵尸进程是子进程没了,但是父进程没感知到,残留的进程信息(当父进程退出,僵尸进程资源会同时返还)。孤儿进程是父进程没了,子进程有1号进程接管,实际上和普通进程没什么分别僵尸:int main(){ int pid = 0; if(pid == fork()) { exit(0); } else { } while(true)

2020-07-23 15:39:42 81

原创 协程

定义协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。协程的特点:与线程有几点不同1 线程调度由内核完成,而协程完全处于用户态2 线程拥有自己的线程资源和执行栈,各线程互不干扰,而协程则更像一个函数,主要通过保存函数栈和恢复函数栈来

2020-07-23 15:28:36 79

原创 线程

定义线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。线程的几种状态1、TASK_RUNNING:进程当前正在运行,或者正在运行队列中等待

2020-07-23 14:39:41 56

原创 进程简述

定义狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stac

2020-07-23 14:07:10 263

原创 游戏后台任务系统

前言 本篇纯做总结用吧一般而言,任务都是由行为事件触发,再借助条件判断来实现的,今天只想聊聊任务本身.任务从功能看有新手引导任务,主支线任务,日常任务,成就任务,团队任务,活动任务这几种。不同的任务类型在实现上会有小小的差别,这个后面再讲。先来说任务的配置**加粗样式**任务一般会有接取条件,完成条件,完成奖励,周期性配置(比如日常),有些甚至还会有完成后行为,不一而足。我比较反对将所有任务配置到一张表,一般多的话,一个游戏里的任务都会有上千条,表格可读性会变差,热更也容易造成影响的扩大

2020-07-05 08:57:34 1231

原创 localtime_r优化方案

#include #include #include using namespace std;void printnow(){    static unsigned long long time=0;    timeval tm;    gettimeofday(&tm,NULL);    if(time !=0)                prin

2016-08-12 16:51:19 691

原创 mktime函数优化方案

#include #include #include void printnow(){    static unsigned long long time=0;    timeval tm;     gettimeofday(&tm,NULL);    if(time !=0)            printf("cost time = %llu\n",tm.tv

2016-08-12 16:49:15 312

空空如也

空空如也

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

TA关注的人

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