找回密码
 立即注册
查看: 652|回复: 17

c++游戏服务器方向需要多少功底?

[复制链接]
发表于 2021-8-17 09:45 | 显示全部楼层 |阅读模式
现在大二了马上升大三,就读于一个很垫底的211,专业是计算机相关的,但是对本专业内容不感兴趣,希望能从事c++后端的工作,对游戏比较有兴趣,但又不知道需要哪方面的知识,希望各位能给出一个客观的评价或者批评,帮忙指点,感激不尽。
看了一些书,unp扫了一遍,apue认真的读了一大半,但是觉得只读书不够,就一边看游双的linux高性能服务器编程,一边自己上手实现一个简陋的web服务器。上网看见什么东西就一点一点往里面塞,什么定时器,线程池,智能指针,raii锁之类的。之后准备大致搭起来服务器的架子就读一下muduo,优化一下自己写的渣渣。
不知道这样的学习进度合不合适,如果想进大厂c++后端或者找一个待遇不差的工作还需要哪些努力?如果想特化游戏服务器的编程能力,有没有合适的书或者路线推荐,请各位大佬指点一下小弟
发表于 2021-8-17 09:54 | 显示全部楼层
推荐一本
网络多人游戏架构与编程(异步图书出品)【图片 价格 品牌 评论】-京东可以了解下虚幻的dedicated server
发表于 2021-8-17 10:02 | 显示全部楼层
题主非常厉害,在自学的道路上已经走出了很多步,值得点赞。
按照题目描述中的学习方法,按咱们的经验接下来可能会遇到一些迷茫的问题,大概说一说。
1、学的新技术越多,迷茫就越多

C++是一门庞杂的语言,有关C++的技术方案也是非常庞杂。
当我们说“C++后端”的时候,其实包含了很多不同的技术方案,这些技术方案不仅侧重不同,甚至在核心思想上都是有冲突的。
比如问题标题写的是“c++游戏服务器方向”,而描述中提到了“游双的linux高性能服务器”、“web服务器”和“muduo”。这些不同的书籍、技术方案之间有着较大区别,侧重于不同的问题领域。
问题:每种方案适合什么问题?游戏服务器应采用什么方案?
这个问题本身非常难回答。不同的团队偏好不同的思路,甚至专业大神所选择的技术方案都有争议。
这就给初学者提了一个无解的问题——我学的到底是啥?我到底该怎么学?
在学习中时刻保持清晰的思路,知道自己身处知识海洋的哪一块区域,这一点很重要,但又非常难。
“不完全理解约等于完全不理解”,很多新技术都有这种特点。绝大多数人只能一边学新知识、一边思考旧知识,然后在实践中花很长时间加深理解。
2、不如缩小学习范围?

所以,这里和其它几位高赞答主的建议类似,先缩小学习范围,缩小到几个方向上去:
    C++基础TCP/IP 网络基础常用算法与数据结构熟悉Linux操作
这几个方向看似很基础,但是它们的特点是——绝对有用,学了绝对不会错。
举个例子,假如你是个房屋设计师,你喜欢给哪种屋子做装修?
A:干净的新的毛坯房。
B:风格凌乱的精装房。
……
答案是A。
干净的毛坯房就像一个崭新的平台,虽然什么都缺,但墙是平的、水管是新的。设计师可以根据自己的想法重新设计,一步一步打造出满意的效果。
风格凌乱的精装房已经有了各种各样的设施,水电暖都已经改过一遍。设计师想要改造,既要重新规划,又要迁就于原来的设计。遇到原来改造的BUG还需要想办法绕开。实在不行的话就只能全拆了再装,而拆除工作又是一大把时间和一大笔费用。
而刚入行的新人也是类似的。
基础扎实、学习能力强的新人,就好比是干净的毛坯房。虽然不能直接上手工作,但可以根据项目特点和需求快速适应项目,了解项目技术特点,遇到难题一点就通,很快就能做出贡献。
而懂的很多、但基础不牢的新人,就好比风格不符的精装房。虽然看似上手快,但做的东西总是似是而非,对项目的理解容易偏差,总是用不合适的方法实现需求。还需要成倍的时间沟通、思考,才能做出有价值的工作。
就像一个装满水的杯子,要先倒掉一半,才能接一半新的。
3、实践出真知

除了必要的基础知识以外,就不能学习有趣的技术了吗?当然不是,有一个好办法——通过有效的实践学习。
在选择实践方向上要注意:如果最终想要做游戏服务器,那么就从简单的游戏服务器开始。不要去搞高性能web服务器。前面讲过,不同的技术方案差之毫厘、失之千里。
就从最简单最普通的单线程游戏服务器开始,遇到需求再添加功能,代码必须为游戏功能服务。
在此基础上,应当花一定精力做一个客户端,有客户端才能方便下一步实验。客户端简单一些没关系,哪怕就写个五子棋,也会离目标近一步。
只有编写真正的游戏逻辑,你才会了解到真正的难点在哪里。与书上讲的重点可能完全不同。
这也是为什么有答主提到——不如先试试最基本的状态同步。确实,即便实现简单的状态同步也需要付出很多努力。
做一个能用的联机游戏,是个不错的纠正方向、沉淀知识的实践方法。

总之,这是一个知识爆炸的时代。知识的获取成本越来越低,但知识的筛选成本却变得越来越高。希望题主保持学习热情,微调学习方向,取得更好的成绩。
PS.  推荐我们专栏中的一篇文章:
马遥:游戏服务器架构通识
发表于 2021-8-17 10:07 | 显示全部楼层
需要C++后台开发功底。
Linux C/C++后台开发

1 精进基石专栏

1.1 数据结构与算法

1.1.1 面试必聊的排序与KMP

    插入排序插入排序快速排序希尔排序桶排序基数排序归并排序字符串匹配KMP算法
1.1.2 随处可见的红黑树

    红黑树的应用场景进程调度cfs内存管理红黑树的数学证明与推导手撕红黑树的左旋与右旋红黑树添加的实现与添加三种情况的证明红黑树删除的实现与删除四种情况的证明红黑树的线程安全的做法分析红黑树工程实用的特点
1.1.3 磁盘存储链式的B树与B+树

    磁盘结构分析与数据存储原理多叉树的运用以及B树的定义证明B树插入的两种分裂B树删除的前后借位与节点合并手撕B树的插入,删除,遍历,查找B+树的定义与实现B+树叶子节点的前后指针B+树的应用场景与实用特点B+树的线程安全做法
1.1.4 海量数据去重的Hash与布隆过滤器,bitmap

    hash的原理与hash函数的实现hash的应用场景分布式hash的实现原理海量数据去重布隆过滤器布隆过滤的数学推导与证明
1.1.5 图论算法,dijkstra,dfs,bfs,动态规划

    图的构建与需求应用场景dijkstra的实现经典动态规划问题
1.2 设计模式

1.2.1 创建型设计模式

    单例模式工厂方法模式抽象工厂模式原型模式
1.2.2 单例模式

    适配器模式代理模式桥接模式组合模式
1.2.3 行为型设计模式

    策略模式观察者模式责任链模式状态模式
1.3 工程管理

1.3.1 手写: Makefile/cmake/configure

    Makefile的规则与make的工作原理单文件编译与多文件编译Makefile的参数传递多目录文件夹递归编译与嵌套执行makeMakefile的通配符,伪目标,文件搜索Makefile的操作函数与特殊语法configure生成makefile的原则cmake的写法
1.3.2 操作:git/svn与持续集成

    git的工作流程创建操作与基本操作分支管理,查看提交历史git服务器搭建
1.3.3 linux系统运行时参数命令

    进程间通信设施状态 ipcsLinux系统运行时长 uptimeCPU平均负载和磁盘活动iostat监控,收集和汇报系统活动sar监控多处理器使用情况mpstat监控进程的内存使用情况pmap系统管理员调优和基准测量工具 nmon密切关注Linux系统 glances查看系统调用straceftp服务器基本信息 ftptopIO监控iotop电量消耗和电源管理powertop监控mysql 的线程和性能 mytop系统运行参数分析htop/top/atopLinux网络统计监控工具 netstat显示和修改网络接口控制器ethtool网络数据包分析利刃tcpdump远程登陆服务的标准协议 telnet获取实时网络统计信息 iptraf显示主机上网络接口带宽使用情况iftop
2 高性能网络设计专栏

2.1 网络编程

2.1.1 项目:网络io与select,poll, epoll

    socket与文件描述符的关联sigio的异步通知多路复用select/poll手撕epoll单线程,多线程,多进程的多种写法代码实现LT/ET的区别
2.1.2 项目: reactor的原理与实现

    reactor针对业务实现的优点epoll封装send_cb/recv_cb/accept_cbreactor多核实现跨平台(select/epoll/kqueue)的封装reactor
2.1.3 项目: http/https服务器的实现

    reactor sendbuffer与recvbuffer封装http协议http协议格式http2.0与http3.0有限状态机fsm解析httphttps的工作流程https证书配置
2.1.4 项目: websocket协议与服务器实现

    reactor sendbuffer与recvbuffer封装websocket协议websocket握手流程websocket协议头封装tcp分包与粘包的解决方案websocket数据流的编解码
2.2 网络原理

2.2.1 项目:服务器百万并发实现

    同步处理与异步处理的数据差异网络io线程池异步处理ulimit的fd的百万级别支持sysctl.conf的rmem与wmem的调优conntrack的原理分析
2.2.2 redis, memcached,nginx网络组件

    redis单线程reactor的实现memcached的多线程master-worker的reactor实现nginx的多进程reactor的实现多进程reactor的坑点,惊群,共享内存
2.2.3 posix API与网络协议栈

    connect,,listen,accept与三次握手listen参数backlogsyn泛洪的解决方案close与四次挥手11个状态迁移大量close_wait与time_wait的原因与解决方案tcp keepalive与应用层心跳包拥塞控制与滑动窗口
2.2.4 udp的可靠传输,QUIc,KCP

    udp的优缺点udp高并发的设计方案qq早期为什么选择udp作为通信协议udp可靠传输原理quic协议的设计原理quic的开源方案quichekcp的设计方案与算法原理
2.3 自研框架:协程框架实现NtyCo

2.3.1 协程的设计原理与切换汇编实现

    协程存在的3个原因同步与异步性能,服务端异步处理,客户端异步请求协程原语 switch, resume, yield,一协程切换的三种实现方式,setjmp/longjmp,ucontext,汇编实现汇编实现寄存器讲解协程初始启动eip寄存器设置协程栈空间定义,独立栈与共享栈的做法协程结构体定义
2.3.2 协程的调度器实现与性能测试

    调度器的定义分析超时集合,就绪队列,io等待集合的实现协程调度的执行流程协程接口实现,异步流程实现hook钩子的实现协程实现mysql请求协程多核方案分析协程性能测试
2.4 自研框架:用户态协议栈NtyTCP

2.4.1 tcp/ip设计

    用户态协议栈的存在场景与实现原理netmap开源框架eth协议,ip协议,udp协议实现arp协议实现icmp协议实现
2.4.2 tcp/ip定时器与滑动窗口的实现

    tcp协议头实现tcp控制块的实现滑动窗口的实现重传定时器,坚持定时器,time_wait定时器,keepalive定时器
2.4.3 Epoll的实现

    epoll数据结构封装与线程安全实现协议栈fd就绪回调实现epoll接口实现LT/ET的实现
3 基础组件实现专栏

3.1 池式组件

3.1.1 手写线程池与性能分析

    线程池的异步处理使用场景线程池的组成任务队列执行队列任务回调与条件等待线程池的动态防缩扩展:nginx线程池实现对比分析
3.1.2 ringbuffer与内存池实现

    内存池的应用场景与性能分析内存小块分配与管理手写内存池,结构体封装与API实现避免内存泄漏的两种万能方法定位内存泄漏的3种工具扩展:nginx内存池实现
3.1.3 异步请求池 http/mysql/redis/dns

    异步请求处理流程King式四元组,create, comm it, callback,destory异步请求框架封装应用协议redis/dns/http请求封装
3.1.4 mysql/redis连接池的实现

    连接池性能的影响的2个因素,tcp连接和mysql认证连接请求归还策略连接超时未归还策略链接断开重连策略连接数量最优策略
3.2 高性能组件

3.2.1 原子操作CAS与锁实现原理实现

    互斥锁的使用场景与原理自旋锁的性能分析原子操作的汇编实现
3.2.2 消息队列与无锁实现

    有锁无锁队列性能内存屏障Barrier数组无锁队列设计实现链表无锁队列设计实现
3.2.3 定时器方案红黑树时间轮最小堆

    定时器的使用场景定时器的红黑树存储时间轮的实现最小堆的实现分布式定时器的实现
3.2.4 try/ catch组件的实现

    setjmp/longjmptry/catch宏定义实现try/catch嵌套try/catch线程安全线程私有数据pthread_key
3.3 开源组件

3.3.1 libevent/libev框架实战的那些坑

    服务端reactor事件封装libevent接口分析event_base_new,event_add,event_del,event_base_loopmemcached网络模块分析libev的主要数据结构EV_WATCH,EV_WATCH_LISTlibevent与libev性能对比
3.3.2 异步日志方案log4cpp

    日志库性能瓶颈分析异步日志库设计与实现批量写入与双缓存冲机制奔溃后的日志找回
3.3.3 应用层协议设计ProtoBuf/Thrift

    lM,云平台,nginx,http, redis协议设计如何保证消息完整性手撕protobuf IM通信协议protobuf序列化与反序列化protobuf编码原理
3.3.4 Openssl对称加密与非对称加密

    对称加密与非对称加密hash的数据结构与使用内存分配与管理抽象l0 BI0的具体实现base64编码的原理RSA的使用场景与数学证明https证书操作与原理分析
3.3.5 Json数据解析/Xml解析器和工具包

    cjson,jsoncpp, repidjson接口应用json序列化和反序列化TinyXML2接口应用XML序列化和反序列化XML/json不同应用场景
3.3.6 字符编码Unicode原理及编程实践

    字符集与字符编码的关系UTF8/UTF16/UTF32具体区别mysql,redis,nginx使用中的字符集问题分析zlib数据压缩手撕zlib压缩与解压nginx中的zlib实现原理
4 中间件开发专栏

4.1 MySQL

4.1.1 MySQLSQL语句,索引,视图,存储过程,触发器

    MySQL体系结构,SQL执行流程SQL CURD与高级查询视图,触发器,存储过程MySQL权限管理
4.1.2 MySQL索引原理以及SQL优化

    索引,约束以及之间的区别B+树,聚集索引和辅助索引最左匹配原则以及覆盖索引索引失效以及索引优化原则EXPLAIN执行计划以及优化选择过程分析
4.1.3 MySQL事务原理分析

    事务的ACID特性MySQL并发问题脏读,不可重复读,幻读事务隔离级别锁的类型,锁算法实现以及锁操作对象S锁 X锁 IS锁 IX锁记录锁,间隙锁,next-key lock插入意向锁,自增锁MVCC原理剖析
4.1.4 MySQL缓存策略

    读写分离,连接池的场景以及其局限缓存策略问题分析缓存策略强一致性解决方案缓存策略最终一致性解决方案2种mysql缓存同步方案从数据库与触发器+udf缓存同步开源方案 go-mysql-transfer缓存同步开源方案canal原理分析3种缓存故障,缓存击穿,缓存穿透,缓存雪崩
4.1.5 MySQL集群方案与Replication原理

    分库分表:水平分库,垂直分库,水平分表,垂直分表MySQL官方三种集群方案replication,Fabric,Cluster三个开源集群方案MMM,MHA,Galera Cluster
4.2 Redis

4.2.1 Redis 相关命令详解及其原理

    string, set,zset,list,hash分布式锁的实现lua脚本解决ACID原子性Redis事务的ACID性质分析
4.2.2 Redis协议与异步方式

    Redis协议解析特殊协议操作订阅发布手撕异步red is协议
4.2.3 存储原理与数据模型

    string的三种编码方式int, raw, embstr双向链表的list实现字典的实现,hash函数解决键冲突与rehash跳表的实现与数据论证整数集合实现压缩列表原理证明
4.2.4 主从同步与对象模型

    对象的类型与编码字符串对象列表对象哈希对象集合对象有序集合类型检测与命令多态内存回收对象共享对象空转时长
4.2.5 集群方案主从复制/哨兵/集群与持久化

    redis的3种集群方式主从复制,sentinel, cluster4种持久化方案大厂的那些分布式缓存方案
4.3 Nginx

4.3.1 Nginx反向代理与系统参数配置conf原理

    Nginx静态文件的配置Nginx动态接口代理配置Nginx对Mqtt协议转发Nginx对Rtmp推拉流Openresty对Redis缓存数据代理
4.3.2 进程间通信与Slab共享机制

    shmem的三种实现方式原子操作nginx channel信号信号量文件锁,互斥锁slab共享内存如何解决"惊群"问题如何实现负载均衡
4.3.3 广告内容推送Nginx过滤模块的实现

    Nginx Filter模块运行原理过滤链表的顺序模块开发数据结构ngx_str_t,ngx_list_t,ngx_buf_t,ngx_chain_terror日志的用法ngx_comond_t的讲解ngx_http_module_t的执行流程
4.3.4 访问频率统计Nginx handler模块的实现

    Nginx Handler模块运行原理ngx_module_t/ngx_http_module_t的讲解ngx_http_top_body_filter/ngx_http_top_header_filter的原理ngx_rbtree_t的使用方法ngx_rbtree自定义添加方法模块性能测试
4.3.5 Nginx http状态机流程

    Nginx的核心数据结构ngx_cycle_t,ngx_event_moule_thttp请求的11个处理阶段http包体处理http响应发送Nginx Upstream机制的设计与实现
4.4 MongoDB

4.4.1 接口编程与文档操作

    接口编程与文档操作文档/集合/聚合函数操作五种索引做法单字段索引,复合索引,TTL索引,全文索引,hash索引GridFS存储大文件WiredTiger存储引擎wiredTiger的事务journal日志
4.4.2 集群方案与持久化备份

    Master-Slave的三个服务Mongos/config/shard服务Replica Set读写策略Sharding的实现与原理三种Mongodb性能优化策略时间同步,磁盘预读功能,内存管理项目: MongoDB跨数据中心的数据复制平台
      抓取Oplog操作日志日志分离日志订阅数据路由Cache同步


5 开源框架

5.1 Skynet

5.1.1 Skynet设计原理

    多核并发编程-多线程,多进程,csp模型,actor模型actor模型实现-lua服务和c服务消息队列实现actor消息调度
5.1.2 skynet网络层封装以及lua/c接口编程

    skynet reactor网络模型封装socket/socketchannel封装手撕高性能c服务lua编程以及lua/c接口编程
5.1.3 skynet重要组件以及手撕游戏项目

    基础接口skynet.send, skynet.call , skynet.response广播组件multicastd数据共享组件sharedatad datasheet手撕万人同时在线游戏
5.2 ZeroMQ

5.2.1 消息队列与ZeroMQ的应用

    REQ/REP模型原理分析PUB/SUB模型原理分析PUSH/PULL模型原理分析Router/Dealer模型原理分析
5.2.2 ZeroMQ源码分析:消息模型的实现

    消息模型消息传递模式一消息分帧一中间层代理消息丢失处理
5.2.3 ZeroMQ源码分析:网络机制与性能分析

    零拷贝技术消息高水位标记无锁队列可靠性设计
5.3 DPDK

5.3.1 DPDK环境与testpmd/l3fwd/skeleton

    DPDK环境参数讲解多队列网卡的工作原理CPU亲和性Burst数据包的优缺点DPDK轮询模式异步中断,轮询模式,混合中断轮询模式virtio与vhost
5.3.2 DPDK的用户态协议栈实现

    内核网络接口KNI的实现原理接收线程/发送线程/KNI线程内存数据结构rte_mbuf,rte_mempool端口数据结构rte_kni, rte_kni_conf, rte_kni_ops,rte_eth_conf协议数据结构rte_ether_hdrrte_ipv4_hdr,rte_udp_hdr数据处理接口rte_eth_rx_burst,rte_kni_tx_burst,rte_pktmbuf_mtod
5.3.3 千万级流量并发的DNS处理

    udp协议包处理dns协议实现配置文件解析数据结构rte_ringtrex数据包性能测试
5.3.4 高性能数据处理框架 VPP

    vpp使用vmxnet3DPDK ACL实现数据过滤vpp web应用vpp基础库VPPInfra高速查找路由表,CAM表
5.3.5 DPDK的虚拟交换机框架 OvS

    0vS三大组件ovs-vswitchd,ovsdb-server,openvswitch.ko0vS报文处理机制0vS 4种数据路径VXLAN数据协议
6 Linux内核源码专栏

6.1 进程原理

6.1.1 进程原理与运行分析

    task_struct结构数据进程的生命周期进程优先级进程状态迁移写时复制
6.1.2 全方位剖析调度机制

    调度器stop/rt/deadline/cfs/idle调度策略SCHED_RR/SCHED_FIFOsmp多核调度
6.1.3 锁与进程间通信

    自旋锁的实现互斥锁的实现大内核锁BKL-Big Kernel Lock消息队列共享内存
6.2 内存管理

6.2.1 内存原理与内存杂乱繁多的细节

    uma与numa的内存结构tlb的工作原理mm_struct结构体页表与缺页异常高速缓存
6.2.2 物理内存与虚拟内存管理

    分配器原理slab/slub/slob分配器不连续页原理内存映射伙伴算法
6.2.3 虚拟内存及API调用

    进程内存映射进程堆栈管理用户空间与内核空间系统调用kmalloc/vmalloc
6.3 文件系统

6.3.1 虚拟文件系统

    通用文件模型VFS结构文件操作系统调用file/inode原理
6.3.2 无持久存储的文件系统

    文件系统数据结构管理/proc数据项系统控制机制sysfs数据结构挂载文件系统文件目录操作sysfs增加数据
6.3.3 磁盘文件系统

    Ext2文件系统Ext3文件系统Ext4文件系统
6.3.4 用户态文件系统fuse

    fuse使用场景fuse原理fuse实现用户态文件接口实现
6.4 设备驱动

6.4.1 实现进程间通信组件

    file_operation原理系统调用的流程ioctl流程请求中断
6.4.2 块设备运行原理

    资源管理I/0调度BI0结构原理PCI总线原理
6.4.3 虚拟网络适配器的实现

    网络结构体 net_device/net_device_opssk_buff原理网卡数据中断网卡mmap
7 性能分析专栏

7.1 性能工具

    高性能代码构建系统 tundraHttp压测工具 WRK网站压测工具 webbench
7.2 调试库

    内存调试性能分析工具 Valgrind谷歌C++测试框架 GoogleTest内存分配跟踪库 MemTrack
7.3 内核跟踪与火焰图分析

    内核探测SystemTap火焰图分析与生成
8 分布式架构专栏

8.1 架构实战

8.1.1 腾讯微服务RPC框架Tars

    Tars微服务应用场景RPC协议的序列化与反序列化路由管理Registry服务发布管理 Patch分布式MySQL与分布式Cache服务发现与服务治理解决方案
8.1.2 容器化Docker与容器编排

    Docker镜像管理镜像元数据管理与存储驱动网络管理与GRE实现跨网络通信Docker容器安全解决方案SElinuxDockerfile的容器构建编排三剑客Fig/Compose/Swarm编排小神器FleetFlynn体系架构与实现原理
8.1.3 容器化管理 k8s与核心组件

    k8s使用场景k8s核心组件APIServer,scheduler,controller manager,kubelet,kube-proxy网络核心原理单pod单ip,pod和网络容器用户认证与namespace设计
8.2 架构原理

8.2.1 分布式注册服务中心etcd

    etcd的应用场景与功能分析强一致性raft算法原理etcd的分布式锁实现单机部署与集群部署
8.2.2 内核级支持的分布式存储Ceph

    ceph的集群部署monitor与OSDceph 5个核心组件ceph集群监控ceph性能调调优与benchmark
8.2.3 快播核心技术揭秘P2P框架的实现

    网关NAT表分析NAT类型,完全锥型NAT,对称NAT,端口限制锥形NAT,IP限制锥型NAT代码逻辑实现NAT类型检测网络穿透的原理网络穿透的3种情况
9 架构原理

9。1 互联网并发云盘

9.1.1 fastdfs架构分析和配置

    fastdfs架构分析快速配置fastdfs上传文件逻辑分析下载文件逻辑分析
9.1.2 fastdfs存储原理

    tracker, storage分析存储机制支持断点续传相同文件内容只保存一份
9.1.2 分布式fastdfs存储集群部署

    同步机制线性扩容如何实现高可用负载均衡
9.1.3 高负载nginx/fastcgi

    fastdfs-nginx-module模块分析fastcgi请求与响应nginx与fastcgi如何通信nginx-fastcgi-fastdfs如何实现上传下载
9.1.4 文件传输和接口设计

    云盘接口设计云盘数据库设计云盘文件上传,下载功能实现云盘源码业务流程实现
9.1.5 产品上云公网发布/测试用例

    使用云服务器的各种坑分析fiddler监控http请求,postman模拟请求wrk测试接口吞吐量jmeter压力测试
9.2 微服务即时通讯

9.2.1 IM即时通讯项目框架分析和部署

    接入层、逻辑层、持久层架构划分消息实时性分析即时通讯数据库设计单聊、群聊消息原理群成员管理未读消息原理池化技术的使用快速配置IM项目
9.2.2 IM消息服务器/文件传输服务器

    protobuf通信协议设计数据库分表设计reactor百方并发模型login_server负载均衡登录请求响应模型
9.2.3 消息服务器/路由服务器

    请求登陆逻辑最近联系会话逻辑查询用户在线主题未读消息机制单聊消息推拉机制群聊消息推拉机制路由转发机制
9.2.4 数据库代理服务器设计

    main函数主流程响应流程redis缓存消息计数(单聊和群聊)未读消息机制群成员管理单聊群聊
9.2.5 文件服务器和docker部署

    在线文件传输机制分析离线文件传输机制分析etcd微服务注册与发现docker制作与部署
9.2.6 产品上云公网发布/公网测试上线

    单元测试案例testbench如何设计IM项目性能压测定制私有功能云服务器部署

看到这里,点个赞吧。
https://github.com/0voice/develop_skill_tree
发表于 2021-8-17 10:14 | 显示全部楼层
学apue那些都是基础中的基础,而且我不推荐初学者去看apue,当资料翻一下还可以,当教材就太浪费生命了。

会自己写网络库,带定时器,你已经勉强算服务器开发入门了,但实际还需要学的更多,个人建议先写个简单的游戏服务器练手或者其他服务器练手,自己也摸索一下。
游戏服务器分好多类,现如今的游戏服务器也类似web,凡是能分布式的都分布式了,而且很多垃圾页游手游,很多都是c#java去写的http服务器。
但唯独多人即时场景战斗服务器需要很高的技术含量,多人即时场景战斗服务器 就是一堆人在一个地图里即时打架,各种状态,而且要求极低的延迟响应,即时场景战斗服务器主程实际上能胜任的人和有经验非常少,这里面涉及到的就很多数据问题和算法问题,不是一句两句说的清楚的,只有找个前辈带你入坑,自己钻研。
发表于 2021-8-17 10:22 | 显示全部楼层
为什么游戏服务器很多都用c/c++开发

C/C++ 做游戏服务器很多公司都在用,腾讯的《和平精英》的服务器就是C/C++开发的。游戏开发是很早的一个行业,软件诞生起就有游戏开发,游戏开发对性能要求又特别的高,所有游戏开发的前辈们开始开发的时候都使用开发运行效率最高的编程语言,C/C++能直接编译成机器指令,具有最好的运行效率,所以一直以来游戏行业使用C/C++开发也就成为了一个传统。C/C++开发游戏服务器也是成熟的生态,redis, c/c++开发的,mysql server c++开发的,nginx c开发的
鲨鱼辣椒:游戏服务器需要学习哪些知识(C/C++)这里有个游戏开发学习交流小组点击可以直接加入,一起讨论交流吧
C++游戏服务器的网络通讯技术

游戏服务器和应用服务器不一样,游戏服务器是需要让多个玩家同时在线,而应用服务器是玩家和系统之间的数据交互和通讯,所以应用服务器大多以http 短连接为主,而游戏服务器需要多人同时在线,同时服务器有时候要主动通知客户端,所以游戏中以长连接为主,同时支付等功能又需要http的短连接, 所以游戏服务器网络短连接+长连接模式。 C/C++有很多高性能的网络库,比如libevent, libuv, 也可以直接调用底层的OS API, 比如Windows的IOCP与Linux的epoll, 同时游戏服务器很多地方也需要http server, 我们可以自己基于网络库加一个http 解析库来作为http server,配合nginx来做反向代理,也可以使用成熟的web框架来做。客户端与服务器之间要发送数据结构,要制定协议,我们采用的工具是Porotobuf,来做数据结构的序列化与反序列化。
游戏服务器的数据库的技术

游戏服务器很多数据需要持久化到数据库,同时需要在内存数据库里缓存起来,我们可以使用Mysql,MongoDb。内存数据库我们可以使用Redis, 来做memcache和排行榜等功能。
游戏服务器的日志技术

日志对于游戏服务器开发来说是非常重要的,特别是上线的时候,日志是最重要的一个调试手段,线上版本代码出了bug,也只能通过日志来查,所以一个好的日志系统非常的重要,日志就是输出打印信息到文件,这样一定会有文件IO,我们都知道文件IO会引起线程休眠等待,所以做文件IO的时候,我们的游戏线程都在用异步,在不阻塞游戏线程的情况下,把日志写入到我们的文件里面,或者专门搞一个日志线程来负责写日志。
脚本系统

有时候C/C++服务器为了开发方便,底层框架搭建完成以后还会做一个脚本系统。方便开发业务逻辑,一般的脚本语言会采用Lua来做,比如腾讯的《和平精英》就是C/C++做底层Lua做业务逻辑来开发,同时像skynet这些服务器的库,都是C/C++做底层Lua做业务逻辑,这样做的好处就是能获得很好的性能的同时,开发业务逻辑还非常的方便。为什么游戏公司很多都用Lua做脚本系统呢?这个是有原因的。首先Lua设计就是为轻量级脚本而生的,提供脚本机制,方便嵌入,运行性能好。Lua在游戏界应用这么广泛,得益于《魔兽世界》,魔兽世界最早开始就使用Lua来作为业务逻辑的脚本开发,而且很多客户端引擎也采用Lua编程语言。
游戏开发常用的算法

游戏服务器,很多采用状态同步,其实所有的业务逻辑就是在服务端来跑, 服务端要处理游戏常用的经典问题,碰撞检测,寻路导航, 怪物AI等。所以我们需要基于Java服务器实现常用的算法和工具,比如寻路导航,行为决策树,有限状态机, 物理引擎,碰撞检测等。对于大型的MMORPG而言,还需要做好AOI的状态管理等,这些游戏中常用的核心算法我们要准备好。

最后总结一下C/C++游戏服务器中常用的库
网络库: libuv, libevent
序列化与反序列化: Protobuf, mjson
加密解密库: crypto
http解析库: http parser,
http库 curl
Lua脚本语言 Lua 5.x
Lua与C/C++绑定 toLua
数据库: mysql, redis
高性能网络管理框架: IOCP, epoll
发表于 2021-8-17 10:26 | 显示全部楼层
需要的更多是决心,关键词是“游戏”、“服务端”,和 C++ 关系不大。
职业生涯很长,您不一定一开始就用 C++,虽然一上来就 C++ 也说可行的。谈一下自己的经历:我大学毕设就是一个游戏,每一行都是自己写的,不过只是 C with Class 的写法。工作后才慢慢变成现代 C++ 的风格,您可以去 GitHub 搜鎏光,这刚好就是一个和游戏有关的开源项目,有服务端也有客户端,完全 C++17 开发。事实上刚毕业的时候,正好遇到 Linus 大喷 C++,那时候我是站他那边的,直到 2017 年初才开始认真学习 C++,至今也不过 4 年。
结论:大学毕业就可以去从事游戏服务端开发,先接受任何语言,再慢慢转变为 C++。
发表于 2021-8-17 10:30 | 显示全部楼层
我真的不推荐你去阅读 UNP 这样大部头的书,不是说这个书不好,而是对于你目前这个阶段,去读这样大部头的书,会事倍功半,相信你自己应该也能感受的到。
作为一个过来人的老学长,我的建议是:
1. 先学好 C/C++。
这类书很多。不建议看《C++ Primer》这样的大部头,掌握 C++ 常用语法就可以了。当然 C++ 原理性的东西还是需要了解一下,推荐看下《深度探索C++对象模型》。
深度探索C++对象模型
链接: https://pan.baidu.com/s/12e7nUsAj02OYc0fFlO00LQ 提取码: cq86

2. 学好网络编程,做到熟练使用常见操作系统的 Socket API。
根据你的水平高低来选择,依次从低到高的书有:
尹圣雨的《TCP/IP网络编程》
链接: https://pan.baidu.com/s/14f4F1lGZUG-YrQnueoPiEw 提取码: glls
游双的 《Linux 高性能服务器编程》
链接: https://pan.baidu.com/s/1qJ9JJ6ZKFRjZMZE1nkEREg 提取码: ct83
陈硕的《Linux 多线程服务端编程 使用 muduo C++ 网络库》。
看了后两本书,你还能学到一些 C++ 服务器程序框架、结构等一些套路。
3. 学一些游戏开发的知识
如果你需要实战的话,我这里有一套完整的可以编译、调试和部署的 MOBA 游戏的源码。
这是一款类似英雄联盟的 5V5 实时对战游戏,服务器端使用 C/C++ 开发,同时支持 Linux 和 Windows 系统部署;客户端使用 C# + Unity3D 开发。
我们先来看下这个游戏的内容吧,这是在我机器上编译后运行的效果图:
登录界面


进入后台配置的对战服务器:


设置自己的昵称:


支持新手教学、人机对战和联网对战:




部署在我的云主机上后,和女朋友一起对战的效果图:
ps~被我女朋友虐的体无完肤。。。。。。


服务器端有非常多的模块,代码质量非常高,这里先截一张主要模块的项目图示:




上述游戏完整的服务器和客户端完整代码及安装部署教程:
链接: https://pan.baidu.com/s/1IQuNx1UFaNH02mezo3GN_A 提取码: 0nbf
建议先学习这套代码的服务端,先学习主框架,再学习细节。
服务器架构简图如下:



连线说明:
    实线:表示客户端登录流程,①②③④⑤表示登录流程,详细解释见下文。虚线:表示服务器间的连接,虚线箭头指向监听方。
架构说明:



原创不易,有帮助的话,记得点个赞和关注 @张小方 ~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-8-17 10:31 | 显示全部楼层
“专业是计算机相关的,但是对本专业内容不感兴趣,希望能从事c++后端的工作”
没懂啊,和计算机相关,多少会学点计算机网络,组成原理,操作系统,算法和数据结构的吧。如果你不喜欢这些东西,而只是喜欢cpp的话,其实路会比较窄了。来游戏也可以,写写逻辑应该hold住。
但我觉得学校里的知识是重要的,任何计算机方向,把这些学好就足够了。如果在当大三找工作的时候,你还要看剑指offer,背八股文,那我觉得你肯定没学好。虽然现在靠剑指offer和八股文已经够了。
但如果你有以上这点水平,我觉得至少来腾讯是没啥问题的。
发表于 2021-8-17 10:31 | 显示全部楼层

最上的板砖和最下的选修。
其他几本建议都看一下。
尤其是More Effective C++,能避免很多坑。
游戏服务器说起来很像那么回事,但是实际上还是根据策划要求做需求,没想象中那么难的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 11:55 , Processed in 0.098863 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表