前网易架构师-高司机
2014年优快云博客之星TOP10;资深游戏服务器架构师;曾在IBM的Platform Computing,淘米网,网易搬砖;开发团队上线了多个国内外爆款游戏+人工智能相关的边缘计算软硬件产品;欢迎+V gao_ke104 探讨咨询服务器架构设计,游戏运营,人工智能等领域的问题。
展开
-
error C2011: “sockaddr_in”:“struct”类型重定义的修改办法
宏的主要作用是减少编译时间和避免命名空间污染。不过你的程序需要使用被排除的API,你则不能定义这个宏,或者需要单独包含那些特定的头文件。简洁的来说,定义以排除加密、DDE、RPC、Shell 和Windows套接字等 API,官方文档在这。#include <cderr.h> // 提供公共对话框错误代码。#include <dde.h> // 动态数据交换(DDE)管理库的定义。#include <ddeml.h> // DDE管理库的高级接口。原创 2024-07-22 17:01:42 · 1698 阅读 · 0 评论 -
lua与C++粘合层框架
lua_State的栈中. 偶们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.原创 2024-03-05 09:54:39 · 1050 阅读 · 0 评论 -
epoll的内核实现
epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, in原创 2024-02-27 16:05:52 · 8174 阅读 · 0 评论 -
让你不再害怕指针
让你不再害怕指针前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧:int p; //这是一个普通的整型变量原创 2010-11-28 15:53:00 · 154516 阅读 · 13 评论 -
高性能无锁队列 moodycamel::ConcurrentQueue
在做一些服务器的架构设计的时候,你不得不考虑现成模型的设计,将不同的业务划分到不同的线程里,如何来调度这些任务是一个值得有经验的架构师需要思考的工作。很多开发者一说到线程的任务调度就想到了线程池,给他创建一个线程池,多个线程不断地尝试获取任务的信号,一旦线程池里有任务了就唤醒其中一个或多个子线程去执行任务。原创 2023-11-27 17:19:32 · 1665 阅读 · 6 评论 -
轻松使用androidstudio交叉编译libredwg库
对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢?最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章我将引用此库来做示例。原创 2023-09-21 15:36:31 · 695 阅读 · 0 评论 -
变形记---容灾恢复(一),异常崩溃引发服务器丢档或无法正常运行
接着,我一直想写一些对年轻人有帮助的文档来,刚好最近有空就零零碎碎写了一些,罗列了一些提纲然后改再删,花了一个礼拜的时间。写这一系列的 “变形记”,也是因为最近我给M部门面试服务器主程序开发的职位,我只问他们的架构设计经验,我发现相当一部分5-12年“本应该有足够开发经验。原创 2024-04-20 00:15:00 · 17751 阅读 · 0 评论 -
变形记---抽象接口,屎山烂代码如何改造成优质漂亮的代码
在游戏服务器开发过程中,我们经常会在动手码代码之前好好的设计一番,如何设计类,如何设计接口,如何调用,有没有什么隐患,在这些问题考虑评审可以Cover现阶段的需求的情况下再动手。不过,对于一些初级,甚至中高级开发者,仍然不可避免的进入了一个死胡同,缺少设计,屎山代码堆积,越堆越臭,越写越烂,直到很难维护必须要重新改造。最近我给M部门面试服务器主程序开发的职位,我不问开发语言的语法,我只问他们的架构设计经验,我发现相当一部分5-12年“本应该有足够开发经验。原创 2023-09-05 11:28:24 · 304 阅读 · 1 评论 -
C++库封装mongodb(跨平台开发)
我的初衷是在Linux平台下只提供动态库和头文件,windows平台下提供静态库和头文件给开发者,这个库mongo-proxy对外提供了一些对mongodb的连接,增删改查,创建索引,聚合等操作的封装,开发者只需要关心接口如何调用,而不需要关心接口是如何实现的,也不需要关心mongo-c-driver的相关依赖,这里我抽象出mongo_proxy类,原创 2023-08-28 18:12:15 · 24409 阅读 · 2 评论 -
换个花样玩C++(14) 全方位认识C++的左值,右值,左值引用,右值引用,亡值
早期学习C语言的时候,认为可以被修改的左值是放在左边的,右边的则通常放置右值,后来转C++之后,随着C++不断地完善更新,发现有时候越来越捉摸不透C++了,右值已经与它最初的概念完全不一样了,越来越丰富。这篇文章我尽可能用一些浅显易懂的文字和简要的代码示例来解释下左值,右值,左值引用,右值引用和亡值的特点和用法。在C++11之前的版本中,一个值要么是右值,要么是左值。左值是指任何可能位于赋值=运算符左侧的值。右值是指允许位于赋值右侧但不位于左侧的任何值。int i = 0;原创 2023-05-22 11:36:27 · 537 阅读 · 4 评论 -
换个花样玩C++(13)一文深度全面剖析类构造,析构,赋值运算和移动构造
为什么我要把C++类的构造,析构函数,赋值运算符重载函数,移动构造函数还要拿出来嚼一嚼,因为最近面试的一些3-7年经验的程序员,我每次都会问一些特别基础的问题,但是我总是得不到想要的答案,我就在思考,是不是大家都觉得有些知识点太简单了,流于高大上的东西,而我个人认为,”五在浮沙筑高台“,基础一定要打扎实,否则你的架构,你的逻辑都将是千疮百孔,最终受害的是自己,我认为一个技术要有不断学习的能力和兴趣,不排斥任何技术,我最开始在IBM(platform)经历C语言,到淘米网,网易经历C++,到后来我们使用C+原创 2023-05-18 11:12:10 · 756 阅读 · 1 评论 -
换个花样玩C++(12)匿名类和匿名对象的使用误区避坑指南
我是在2011年的时候在Platform参与了LSF的开发,当然我也受到Platform的codereview的文化影响,这也是作为C/C++开发者锱铢必较的一个态度,对自己写的每一行代码负责,因为你的代码质量影响着整个庞大的系统正常运行(当时的客户大都是NASA,还有欧洲生物科学实验的,DNA蛋白质大数据分布式计算的),这里我不由得想到了C++中的一个不得不说的点。这些类既不能作为参数传递给函数,也不能用作函数的返回值,或者类不能用作函数中的元素,即不能将其作为参数传递,也不能接受函数返回的值。原创 2023-05-17 09:41:18 · 1022 阅读 · 9 评论 -
换个花样玩C++(11)对深拷贝和浅拷贝的误解
若您未定义拷贝构造函数,C++在为对象进行初始化操作的时候则使用默认的拷贝构造函数,当进行默认的拷贝构造函数时,很多人说是进行浅拷贝,其实不然,这完全取决于每个成员的复制行为,并不保证一定是深拷贝或者浅拷贝 ,当然如果你想使用深拷贝,在你提供了拷贝构造函数和赋值运算符重载函数的时候你有没有想到他的副作用?还有没有优化的空间呢?原创 2023-05-16 14:36:00 · 598 阅读 · 0 评论 -
换个花样玩C++(10) 网易老司机带你吃透this指针的多种玩法,完美绕过多个陷阱
在C++使用过程中,我们经常会和this指针打交道,或许是使用习惯,却很少直接通过this指针来访问他的成员变量或者成员函数,这篇文章我们来抛出几个问题:this指针是什么时候创建的、this指针又是什么时候销毁的、this指针为什么不占用类空间大小、什么情况下必须显示使用this指针?使用多态this又是如何识别他属于哪个类的、赋值运算符为什么要返回this指针、 带着问题我们来研究分析下this指针到底是什么,使用过程中干了什么事?首先看一段代码,如果你对this指针很熟悉,但我认为你看到这段代码可能会原创 2023-05-15 16:01:14 · 647 阅读 · 0 评论 -
换个花样玩C++(9)用C语言来告诉你C++虚函数的真相
我是网易的老高,欢迎大家关注我的专栏,我们很多时候都直接使用C++的虚函数来实现多态,那么你有没有想过他在运行时是如何查找到他要调用的函数呢?这篇文章将打开你的疑问大门,并且通过C语言的方式来实现虚函数指针,虚函数表,让你用另外一个角度看虚函数表。原创 2023-05-08 17:28:59 · 994 阅读 · 3 评论 -
换个花样玩C++(8)吃不透内存布局,坑的是自己,万字经验告诉你类的内存布局
C++内存布局是老生常谈的话题,无论是笔试面试,都会涉及到该类问题,那么这一章节,我们就聊聊内存布局到底是怎么布局的,聊完之后我保证你仍然会回味无穷,并且我提供的几个例子也会让你再一步步踩入雷区。C++程序的内存布局C++的内存布局区域我们大体上分为四个:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(或者叫自由存储区)。原创 2023-05-08 16:32:21 · 955 阅读 · 4 评论 -
换个花样玩C++(4)细聊C++的引用精妙之处
引用是C++引入的新语言特性。而且在日常工作开发过程中,经常会使用到引用,对于一些做系统架构的架构师而言,这也是不可或缺的一门基本功,我在工作中发现,很多人并没有搞清楚引用。因此我在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。原创 2023-04-28 17:15:07 · 801 阅读 · 0 评论 -
换个花样玩C++(2)柔性数组怎么玩
这里你会看到有report_msg 这个结构体,他的msg成员是一个数组,数组长度是0,当然你也可以写成 char msg[0];到这里就引出数组的另外一种玩法---柔性数组。原创 2023-04-28 11:03:43 · 639 阅读 · 0 评论 -
换个花样玩C++(3)const_cast不是一行代码这么简单
我先不说const_cast的事情,还是回到我们之前遇到的一个问题,先看代码。原创 2023-04-28 10:41:54 · 839 阅读 · 0 评论 -
关于函数递归调用导致的StackOverflow那点事
身为工程师,Stack Overflow这网站大家应该都是熟到不能再熟。如果没有他帮忙解决各种莫名其妙的错误或者bug,可能连设定个开发环境都要搞半天,更不用说要开发了,产出直接降低好几倍,不如直接下班算了。但今天要谈的不是那个Stack Overflow,而是要讲程序在使用內存时,因为调用栈的堆太高了不小心把內存用完,所产生的overflow。原创 2023-03-20 18:40:47 · 392 阅读 · 0 评论 -
架构师必须要掌握的大小端问题
所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。简单来说:大端——高尾端,小端——低尾端原创 2023-03-20 17:52:55 · 1001 阅读 · 0 评论 -
如何在C++ 网络库中支持websocket
我们在一些中重度游戏中经常使用TCP,可靠UDP(参考之前的剖析KCP以及KCP在游戏中是如何使用的)来进行网络传输,不过随着一些小游戏和超轻休闲类游戏的逐步崛起,越来越多的开发者逐渐使用websocket来进行网络传输数据,像node.js/ ts , go, java等语言都有造好的轮子,直接引用现成的库并能很方便的调用,但是如果你使用的是C++,你会发现,websocket的库...原创 2022-11-30 11:23:27 · 954 阅读 · 0 评论 -
剖析KCP以及KCP在游戏中是如何使用的
亲爱的各位读者你们好,由于前段时间忙于部分项目的重构和优化,未能及时更新文章,不少读者催更,哈哈,我还是很开心能抽出时间给大家再来分享下kcp的相关技术内幕,以及之前完善自己的网络库增加了KCP的客户端服务器收发支持(结尾会分享封装的客户端服务器C++源码)。KCP概述对于游戏开发,尤其是MOBA游戏,或者全球唯一服架构类型的游戏,对于网络的要求比一般游戏要高。...原创 2022-11-07 18:06:10 · 72352 阅读 · 0 评论 -
使用KCP 加速游戏消息,让全球玩家流畅联网
kcp协议是传输层的一个具有可靠性的传输层ARQ协议。它的设计是为了解决在网络拥堵情况下tcp协议的网络速度慢的问题。kcp力求在保证可靠性的情况下提高传输速度。kcp协议的关注点主要在控制数据的可靠性和提高传输速度上面,因此kcp没有规定下层传输协议,一般用udp作为下层传输协议,kcp层协议的数据包在udp数据报文的基础上增加控制头。当用户数据很大,大于一个udp包能承担的范围时(大于mss),kcp会将用户数据分片存储在多个kcp包中。因此每个kcp包称为一个分片。原创 2022-10-10 12:06:30 · 755 阅读 · 0 评论 -
linux和windows环境配置安装zookpeer的dashboard可视化
有时候我们需要知道一个*.so文件或者可执行文件是debug版本的还是release版本的,这时我们有哪些方法呢? 1.readelf -S filename |grep debug导出汇编objdump -f test显示test的文件头信息objdump -d test反汇编test中的需要执行指令的那些sectionobjdump -D test与-d类似,但反汇编test中的所有sectionobjdump -h test显示test的Section H..原创 2022-10-10 10:23:02 · 878 阅读 · 0 评论 -
深入剖析阻塞式socket的timeout
网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。 本文讨论的是socket设置为阻塞模式,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题。 所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回. 在我们直接调用socket操作函数时,如果不进行特意声明的话,它们都是工作在阻塞模式的, 如 connect, send, recv等.简单分类的话,可以将超时处理分成原创 2022-06-28 16:43:13 · 2587 阅读 · 0 评论 -
手把手教你使用sql注入来绕过游戏后台检测
SQL注入毫无疑问是最危险的Web漏洞之一,因为我们将所有信息都存储在数据库中。其解决方案之一,有许多公司实施Web应用程序防火墙和入侵检测/预防系统来试图保护自己。但不幸的是,这些对策往...原创 2021-07-09 06:56:00 · 904 阅读 · 0 评论 -
你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
前言不要使用全局变量的道理大家都懂,基本上在大家学习编程过程中很早就会被教育到,但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量,只不过这些全局变量会穿上马甲,让你不会一下看穿它的巨大危害,滥用全局变量会引申带来其它更为严重的结构性系统问题。你担心大家会滥用的代码,大家(包括你自己)一定会滥用。 ...原创 2022-03-24 19:23:00 · 580 阅读 · 1 评论 -
不要滥用全局变量
每当看到代码100行的时候就出现一个全局变量,我总要戚眉变脸而后拍桌怒喝。我不否认全局变量的重要性,但我认为要十分谨慎地使用它,滥用全局变量会引申带来其它更为严重的结构性系统问题。1. 滥用全局变量会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。2. 会导致软件分层的不合理,全局变量相当于一条快捷通道,这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。3. 由于软件的分层原创 2022-03-24 19:04:48 · 1409 阅读 · 0 评论 -
你的代码是否按照高内聚、低耦合的原则来设计的?
我们一直强调软件开发中要按照高内聚、低耦合的设计原则来做代码结构设计。c语言和c++不同,c语言面向过程、c++面向对象。 真正的项目中,要对业务升级,原来的业...原创 2022-02-22 21:22:00 · 980 阅读 · 0 评论 -
设计模式 ---适配器模式
在一些业务场景里,你是否遇到过如下类似的需求:1、系统需要使用现有的类,而此类的接口不符合系统的需要。2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能...原创 2021-07-12 18:30:00 · 350 阅读 · 0 评论 -
为什么我们仍然坚持用C++做游戏服务器
本篇文章纯属文字,不需要配图。首先以我个人观点来说,C ++对于我的吸引力不仅仅是它的技术优点。c++是个庞大而奇怪的语言,很多新领域会选择这个语言是因为有...原创 2021-07-05 18:30:00 · 1092 阅读 · 1 评论 -
一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?
自从上篇文章聊一下CPU占用高的解决方案更新后,最近收到了一些热心观众的后台留言,问到的一些问题比较集中的是关于CPU切换.实际用C/C++,go开发,你会特别注意内存和CPU的使用情况,...原创 2021-06-21 18:30:00 · 426 阅读 · 0 评论 -
内存优化-如何使用tcmalloc来提升内存性能?提升的结果太不可思议
无论是在游戏开发,或者其他长期运行的服务开发中,对内存的使用一直是架构师或者主程序在最初就要关注的point,如果内存使用不当,频繁申请释放内存造成系统负担过大,性能降低,到最后产生大量内...原创 2021-06-25 18:30:00 · 559 阅读 · 0 评论 -
游戏服务器架构:如何设计开发战斗系统的技能和buff系统
战斗系统中buff和skill如何配合在网络游戏中的战斗形式多种多样,不同游戏的战斗逻辑也有很大的差异。但是一般都会涉及技能系统和buff系统,两种之间相互关联,技能可以产生buff作用在...原创 2021-04-10 21:01:15 · 1427 阅读 · 1 评论 -
游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?
前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两...原创 2021-06-07 18:30:00 · 295 阅读 · 0 评论 -
内存优化-使用tcmalloc分析解决内存泄漏和内存暴涨问题
其实我一直很想写关于tcmalloc的内存泄漏检测的文章,只是一直记不起来该如何下笔,有时项目太忙,在整理这方便的思考过少,另外遇到的问题也不是很多,直到最近用tcmalloc帮A项目排查...原创 2021-06-28 18:40:00 · 1101 阅读 · 0 评论 -
游戏服务器架构-设计模式之发布订阅模式
发布订阅模式场景熟悉消息中间件的同学应该对发布/订阅模式(Publish Subscribe Pattern)并不陌生。即使你不了解消息中间件,那么在平时生活中发布/订阅模式也是非常常见的...原创 2021-06-04 20:00:00 · 408 阅读 · 1 评论 -
kubelet内存异常分析
背景:kubelet被重启后, 内存再次升高, 在游戏启动后,没有进入大量玩家的情况下,2天时间占用接近10G,并且持续在增长, CPU偶尔负载高。AWS给出的解释是containerd ...原创 2021-05-17 06:46:46 · 677 阅读 · 0 评论 -
聊一下CPU占用高的解决方案
前言: 在软件开发和性能测试中,CPU占用率是服务器开发一个很重要的指标,到底有哪些因素会导致CPU占 用率上升呢?又有哪些手段可以降低CPU的占用率呢? 如果你看了这...原创 2021-06-10 13:27:00 · 771 阅读 · 0 评论