高效的网络消息类实现

ROS话题消息实时展示在WEB网页上 将ros话题消息实时传输到web网页端,可以随时随地使用手机或是电脑上网页看数据,调试利器! 阅读详情

感谢gogoplayer提供的思路。

 

事情的经过是这样的:几天前gogoplayer跟我提到想用引用计数来解决消息广播时拷贝多份的问题,顺带提到boost::shared_ptr的引用计数是线程安全的。这一点跟我的记忆有出入,于是查boost的手册确认了一下,发现从1.33.0开始shared_ptr就用了lock-free来实现线程安全,相当高效。

 

于是就想把原本的NetMessage队列改为shared_ptr<NetMessage>队列。这时回顾之前的实现方式,发现存在内存动态分配次数过多的问题:

NetMessage中的内容是保存在vector中的,写入数据至少会造成一次动态内存分配;

把NetMessage添加到NetMessage队列的尾部,又会造成第二次动态内存分配;

如果改用share_ptr,shared_ptr需要通过new出来的指针初始化,造成第三次分配;

shared_ptr本身的引用计数对象造成第四次动态内存分配。(这一点可以通过boost提供的make_shared来消除)

所以发送一条网络消息至少会造成三次动态内存分配和回收操作。而大部分网络消息往往只有十几个字节,即使用了tcmalloc之类的内存池,还是相当蛋疼。

 

解决方案:

NetMessage根据其内容的长度,分别采用数组和shared_ptr<vector<char> >的策略来存储数据,如果数据量少,则用内部数组,如果数据量大或者需要共享(如广播的情况),则初始化vector来存储。

NetMessage的拷贝,如果数据量少,则只是几个字节的内存拷贝,如果数据量大,只是复制智能指针。两种情况都相当轻量。

动态存储内容的NetMessage,用了copy on write手法以保证线程安全和正确性。

NetMessage的队列改成用vector来实现,因vector预留历史最大分配内存的特性,可以避免频繁的内存分配。

 

此外,给NetMessage类新增了一些兼容stl的接口,用以适配stl算法。

Unity网络客户端Demo:多人游戏开发入门 Unity网络框架提供了几种预定义的网络消息类型,以便开发者在实现网络通信时能够使用标准化的方式。它们分别是:Command:用于从客户端向服务器发送指令。指令的执行通常只在服务器上进行,并且可以返回结果给发起指令的客户端。例如,一个玩家在客户端点击跳跃按钮时,会向服务器发送一个跳跃的指令。// 定义一个Command[Command]// 执行跳跃逻辑ClientRPC:是客户端到服务器的逆向通信,服务器执行后,结果会发送给所有客户端。 阅读详情

相关推荐

Unity中UDP异步通信服务端的封装与实现

在Unity网络通信系统中,构建一个高效、可扩展且类型安全的消息体系是实现稳定服务端-客户端交互的核心。随着多人在线游戏和实时协同应用对数据传输的复杂性不断提升,传统的“裸字节流”或简单字符串传递方式已无法满足现代分布式系统的维护需求。为此,引入统一的消息基类BaseData成为必要之举。该类不仅作为所有业务消息的抽象父类存在,还承担着序列化规范、消息路由标识、版本控制以及跨模块解耦等关键职责。通过合理的继承体系设计与运行时消息管理机制,BaseData。

weixin_35754962的博客 1264

gogoplayer 推荐的声音引擎audiere

推荐一个简单的声音引擎 绝对轻量级的声音引擎,audiere,支持跨平台,可以去http://sourceforge.net/projects/audiere/下载,再给个小例子,^_^用VC6或者其他配置好工程,建个控制台程序即可#include using namespace std;#include "audiere.h"audiere::AudioDevicePtr devic

莫克陶的blog 1926

AI数字人短视频数字人口播数字人分身建模流程全解析

在人工智能与计算机图形学蓬勃发展的当下,数字人建模作为打造虚拟数字人的核心环节,其流程复杂且精妙,融合了多种前沿技术与创意构思,为栩栩如生的数字人形象奠定基石。​。

2403_87518095的博客 1446

Zjh游戏(二)网络消息类NetMessage的处理

NetMessage的创建 作用:每次发送消息,都发送这个类,接收到消息后,转换成这个类 自己理解:加上模块号,保证收发消息的准确性,方便接收处理,在脚本中有两个操作码,操作码对应游戏中某个模块,子操作码就对应游戏模块中的子模块。比如:登陆模块中的注册模块。 using System; using System.Collections.Generic; using System.Linq; usi...

赵某人 603

网安保研避坑指南:中科院信工所各研究室真实体验与导师选择建议

本文为中科院信工所网络安全保研生提供深度指南,详细解析了信工所六个研究室的研究方向、真实氛围与导师选择策略。文章特别强调,选择导师是决定研究生体验的关键,并提供了针对各研究室的避坑建议与实战调研方法,帮助学生做出明智选择。

weixin_29210727的博客 1575

避坑指南:你的VASP CI-NEB计算为什么不收敛?常见错误分析与解决思路

本文深入解析VASP CI-NEB计算不收敛的常见问题,提供从结构准备到参数设置的系统解决方案。针对过渡态计算中的能量曲线异常、中间图像偏离等典型问题,详细介绍了诊断方法和实用工具,帮助研究者高效解决CI-NEB收敛难题,提升计算效率。

weixin_29698641的博客 431

认识软件定义网络(SDN)(一)

在传统IP网络中,网络设备内部同时集成了控制逻辑和数据逻辑,控制平面需要实现各种类型的网络协议和功能,为数据平面构造和配置路由转发表,而数据平面则根据路由转发表实现数据包的转发。一般来说,网络设备内部控制平面和数据平面的接口是设备生产厂商已经封装好的,网管人员只能使用生产厂商特定的低级指令所提供的有限的功能来实现网络的管理和配置。同时,由于设备提供商之间的低级指令并不是相通的,所以当网络中存在来自许多不同提供商的设备时,网管人员需要花费大量时间和精力对这些设备逐一进行管理和配置。总结来说,传统IP网络具有以

m0_51930619的博客 1244

从“储能”到“信号”:拆解Buck电路中那颗不起眼的前馈电容,如何让电源更稳

本文深入解析Buck电路中前馈电容的关键作用,揭示其如何通过频域整形和零点补偿提升电源稳定性。从工作原理到工程实践,详细介绍了容值计算、布局布线及特殊场景调校策略,帮助工程师优化瞬态响应和纹波抑制。

weixin_42530458的博客 403

5G网络中对4G网络S1接口的替代

在5G网络中,传统的S1接口已经被新的接口(如N1、N2、N3、N4、N6)所取代。这些新的接口和组件共同实现了用户面和控制面的数据传输,确保了5G网络的高效和灵活。

weixin_42736657的博客 2022

fanuc机器人KAREL程序间参数的传递

之前的课程中讲述过KAREL程序中函数参数的传递,而控制工业机器人的动作只能通过控制TP程序来实现,所以在实际应用中就会出现在不同程序间进行参数的传递。尤其是对于有模块化编程的思想的设计者,更有这种迫切的要求。所以本次课程来讲解一下如何实现在不同程序之间进行参数的传递。 本次课程分为两个部分,以讲解在不同类型程序间进行参数传递的实现方式。 1、TP程序之间传递参数; 2、TP与PC程序之间传递参数。

haier123888的博客 2695

MinerU PDF解析工具:从安装配置到本地部署与API调用的全流程指南

MinerU是由上海人工智能实验室开源的高质量PDF解析工具,可将包含图片、公式、表格的复杂PDF转换为Markdown和JSON格式。安装前需准备Python 3.10-3.13环境,推荐使用8核CPU和32GB内存。支持通过HuggingFace或ModelScope下载模型,国内用户建议使用ModelScope源加速下载。配置文件中可设置本地模型路径,支持多种语言识别和两种解析后端(Pipeline和VLM)。输出包含可视化文件、内容文件和中间结果文件,并提供了完整的Python API调用示例。

算法工程师 2026

btcd p2p 网络分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34190136的博客 590

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3810

P2P中DHT网络介绍

一、P2P及DHT网络简单介绍: P2P在思想上可以说是internet思想/精神/哲学非常集中的体现,共同的参与,透明的开放,平等的分享(让我想起之前学习过的,现在正在疯狂热炒的云计算的“中央集权”制度)。基于P2P技术的应用有很多,包括文件分享,即时通信,协同处理,流媒体通信等等。通过这些应用的接触,分析和理解,P2P其本质是一种新的网络传播技术,这种新的传播技术打破了传统的C/S架构,逐步

late0001的专栏 574

uniapp - 强力解决 swiper 轮播图内嵌套视频导致滑动不流畅卡顿问题,轮播滑块视图容器里既有图片也有视频video组件共同存在出现滑动切换特别卡,轮播组件包裹视频播放器加载慢及层级过高解决

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,swiper,轮播图,轮播图嵌套视频,卡顿,加载慢,左右滑动不流畅,很卡,滑动过快就会卡住,uniapp使用swiper组件里嵌套视频与图片如何解决卡顿问题,详细解决教程,swiper里有视频video,播放器,视频+图片轮播,层级过高及卡顿问题,没等看完视频就自动切换了,报错,无法加载播放,uniapp的App安卓苹果端,video老是加载,APP端video组件播放视频卡顿,抖音,快手,上下滑动视

🏆 前端领域优质创作者 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

protobuf摘录

一种自动反射消息类型的 Google Protobuf 网络传输方案 protobuf:根据类型名创建对象 https://github.com/chenshuo/recipes/blob/master/protobuf/descriptor_test.cc#L15 根据类型转发消息,通过Descriptor https://github.com/chenshuo/recipes/

sx5486510的专栏 466

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

twisted使用protobuf的网络通信方案

protobuf,google开源的序列化结构数据的方案,官方提供提供了 C++、Java、Python 三种语言的 API,安装使用方法详见:https://github.com/google/protobuf。Python中序列/反序列消息时,有两种实现,pure-Python implementation 和 C++ implementation,当然后者性能更高,详见: https://g...

把握自己。 1087

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux网络编程:自定义协议设计与高效序列化实战

网络协议是计算机通信的基础规范,自定义协议通过精简协议头和优化序列化方式,能显著提升通信效率。在物联网等实时性要求高的场景中,二进制协议相比文本协议具有更小的数据体积和更快的解析速度。通过结构体内存映射实现零解析开销,配合CRC校验和字节序转换确保数据可靠性。Protocol Buffers和MessagePack等序列化方案则提供了跨语言支持,其中结构体直接映射方案特别适合Linux C++高性能场景。在实际工程中,合理设计协议头包含魔数、版本号等字段,并实现心跳机制和粘包处理,能构建出既高效又稳定的通信

weixin_33507732的博客 250

protobuf c++ 序列化为string_BeetleX之TCP消息通讯Protobuf/TLS

在网络通讯应用中直接操作数据流是比较繁琐的事情,毕竟在业务层面处理的都是对象化消息;为了让网络数据操作变得更友好直观,一般都会引用序列化组件来处理网络流和对象之前的转换工作;在这里介绍组件如何使能Protobuf进行数据交互通讯。协议定义组件使用对象处理就不同之前HelloWorld示例一样简单操作流就可以,在这里需要进一步封装一个简单的应用协议。|---...

weixin_39777543的博客 369

c++群聊服务器(TCP/IP)

群聊服务器简单描述 客户端发送消息 到服务器,服务器转发消息给每个客户端、 boost库安装可以去官网,也可以去看我的另一篇博文 c++回声服务器,上面有我给出的boost库 百度云盘 boost库的案例实现 我加入部分注释,方便理解。 首先是 客户端和服务器都共同要用的头文件 chat_message.hpp // // chat_message.hpp // ~~~~~~~~~~~~~~~~ ...

BCMY0110的博客 794

在android需要大量使用xml进行网络传输时,如何用面向对象的思路降低xml的耦合性并增加重用性

根据一个需求来就行分析。由于

jys1115的专栏 751

Protobuf消息设计原则(值得借鉴)

网络通信涉及到消息的定义,不管是使用二进制模式、xml、json等格式。消息都可以大体的分为 命令消息、请求消息、应答消息和指示消息4大消息类型。一般情况下每个消息还还有包含一个序列号和一个能够唯一区分类型类型的消息编号,编号可以使用字符串、整数或者枚举等。1. 使用 protobuf 的enum定于消息的编号,也就是消息的类型。我会为每个系统都定义一个MSG枚举。包含系统用到的所有消息的枚举编号...

qing666888的专栏 1633

Peersim kademlia manual - note

1 首先感谢这位在Peersim中实现Kademlia的guy。  分析:(以作者的Manul为主,稍加个人评论) 1 作者manual中的sections: Section2: 首先简要介绍了kademlia协议,分析了其主要特征和一般功能; Section 3: peersim实现kademlia的介绍,分了代码以及为了逼真的实现真实场景时所作出的一些选择; Section4: 展现了实际模拟,提供了使用的配置和不同情况下的分析; Section5: 给出了模拟结果; 总结与展望

云里雾里的专栏 1763

【go-libp2p源码剖析】DHT Kademlia协议消息处理

文章目录简介Protobuf结构定义Protobuf消息组装、发送(客户端)dht.getValueSingle(dht.go)dht.putValueToPeer(dht.go)dht.findProvidersSingle(dht.go)dht.findPeerSingle(dht.go)dht.Ping(dht.go)dht.Provide(routing.go)Protobuf消息发送Protobuf消息解码处理(服务端)handleFindPeerhandlePinghandleGetValueh

KK下山去买菜 2025

ProtoBuf

protobuf 的学习与使用

mu_tong_的博客 1433

OpenFlow交换机 之 OpenFlow协议

OpenFlow协议是用来描述控制器和OpenFlow交换机之间交互所用的信息的接口标准,其核心是OpenFlow协议信息的集合。OpenFlow协议支持三种消息类型:controller-to-switch、asynchronous(异步)和symmetric(对称),而每一类消息又可以拥有多个子消息类型。其中,controller-to-switch消息由控制器发起,用来管理或获取OpenFl

jh19900712的专栏 1万+
上一篇: TCMalloc
下一篇: boost::asio 1.4.3的linux实现总算采用epoll的et模式了
cometeor
博客等级 码龄18年 71粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值