跳至正文

[Asio] 学习笔记1. 初识asio和tcp

打算基于asio写多种序列化库的测评,在底层用同一个asio构造函数的方式,然后上层测试脚本里切换序列化的实现。
但是最开始按着demo写逻辑就出现了问题,我想先纯面向过程,就没像demo里写一个connection类,然后就探究到一直会闪退的问题。

最后定位到时ip::tcp::socket析构的时候会断开连接。

socket的析构会断开连接

socket的大概是这样的结构:

typedef basic_stream_socket<tcp> socket;
template <typename[......]

继续阅读

[Walo系列]2.企划和环境搭建

  • 随笔

企划

还是打算启动这个企划,核心的目标就像前一篇说的,我想做一个游戏的网络rpc的库。相比传统的rpc框架,核心在于这个是给游戏用的。

思考

游戏用的rpc和互联网的主要差别在哪呢?
这几天我一直在思考这个问题,互联网的请求更多的是我发起、等待然后收到回调。同时互联网有大量的基础设施,在rpc的通信中有大量的扩散的请求。例如一个订单可能涉及到向多个微服务发起服务,最终汇聚成一个请求返回到客户端。

互联网的rpc更注重跨语言,快速实现需求,还要考虑多服务的均衡、容灾等等…

而游戏的网络框架其实分两个部分,拿平安京举例[……]

继续阅读

[Walo系列]1.开发自己的游戏通讯库对grpc祛魅了

  • 随笔

本意是想深入研究和学习一下grpc的设计,来给自己的游戏网络通信引擎提供多一份参考。但是细致的看了一圈文档意识到grpc的实际应用场景不是给游戏,而是像文档里描述的给微服务和多语言部署的大型业务。

grpc作为定义好comn中间结构体就能够注册到服务发现集群,其他的业务可以直接将comn结构下载下来,快速地请求到新业务的一套跨越多语言的协议+底层框架。

这是它的核心,或者说它解决的问题。

就忽然想起来之前华仔说面试的是时候是要问对方解决问题的能力,遇到了什么问题,提出了什么方案。

最近也研究godot和unreal[……]

继续阅读

用python理解C++20协程的设计

C++20拥有一个全新的特性:协程。

我来从python的角度来解释C++这个特性设计与其他语言的不同,目的以及意义。

协程是一种可以挂起和恢复执行的函数。C++20协程跟python的生成器是很相似的,如果函数中出现了co_yield, co_return, co_await,那么这个函数就是协程函数。而协程的本质就是将一个函数拆分成多个不能控制执行顺序,但是可以控制执行时机的语言结构。

对普通函数而言,执行一个函数是开始运行你的逻辑;但是对于协程来说,执行协程函数会先创建一个协程对象,但是是否开始执行还是挂起是[……]

继续阅读

constexpr, consteval, constinit家族

  • 技术

介绍

这是《现代C++语言核心特性解析》的读书笔记。

constexpr家族的内容

书里给constexpr给了很多篇幅,但是总体来说就是一个,const表示的是不允许修改的常量,而constexpr表示的是编译期的常量。
但是逐渐被扩展到constexpr可以被用作函数,lambda,以及if constexprt,都是为了让编译期可以做更多的事情,给与开发者更多的自主性。
反正基本上想要去做一些预计算以及在模板里,用constexpr就没错了。

consteval是什么呢?

这件事情我理解来说就是constex[……]

继续阅读

[2024年10月31日]

今天生命状态异常的好!很难描述是怎么造成的,在公司忙了一些事情,吃完饭之后就开始玩游戏,玩了几把就回家…
路上听着睡眠那本书,哦,那句话我印象很深:然而值得注意的是,无论机会有多大,大脑都无法恢复它失去的所有睡眠。人类永远不能把我们之前失去的睡眠补回来。
可能是这句话打醒了我,让我今天生命状态异常的好!
回家就先吃药,收拾东西,久违的拖地,处理各种垃圾…

今天精神上的状态真的还挺舒服的,可能是被睡眠的警告惊醒,也可能是之前生病的后遗症。
总之,希望明天能保持这个状态,每天10点开始集中注意力有点太迟了,因为很快就到[……]

继续阅读

结构化绑定(C++17, C++20) 学习笔记

  • 技术

结构化绑定

在python中是能够很轻易地实现多个返回值的函数的,例如:

def return_multi_values():
  return 100, 20
x, y = return_multi_values()

但是在C++应该是会用类、结构体或者引用来实现,在C++11之后也引入了std::tuple,也可以用来实现类似的功能:

#include <iostream>
#include <tuple>

std::tuple<int, int> return_multi[......]

继续阅读

override和final说明符(C++11) 学习笔记

  • 技术

重写、重载和隐藏

重写(override)、重载(overload)和隐藏(overwrite)在C++完全不同的概念,先梳理一下区别:

重写

重写的意思更加接近于覆盖,在C++中是指派生类覆盖了基类的虚函数,这里的覆盖必须满足有相同的函数签名和返回类型,即重写是有相同的函数名、形参列表以及返回类型。

重载

它通常指一个类中有两个或者以上的函数,他们函数名相同,但是函数签名不同。

隐藏

隐藏的概念是指基类成员函数,无论是否是虚函数,当派生类出现同名函数时,如果派生类函数签名和基类不同,则基类的会被隐藏;如果派生类函[……]

继续阅读

C++ 11/17强枚举类型读书笔记

  • 技术

强枚举类型

原来继承自C语言的枚举类型在C++之父看来是一个奇怪且半生不熟的概念。

枚举的弊端

虽然枚举类型可以避免A类型赋值给B类型,但是:

  • 可以直接跨枚举比较
  • 可以直接转化为int
  • 同名的枚举值是冲突的

虽然有很多缺点,但依然是建议使用枚举而不是const int来做枚举,那样问题只会更多。

强枚举类型

C++11标准增加了强枚举类型,为了保证老代码的兼容性,同时也兼容了旧的特性,新增的枚举类型具有三个特性:

  • 枚举标识符属于强枚举类型的作用域。
  • 枚举标识符不会隐式转换为整型。
  • 能指定强枚举类型的底层类型,[……]

    继续阅读