惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
U
Unit 42
腾讯CDC
D
Docker
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
I
InfoQ
Jina AI
Jina AI
爱范儿
爱范儿
宝玉的分享
宝玉的分享
博客园 - Franky
G
Google Developers Blog
P
Proofpoint News Feed

I'm OWenT

国产大模型(GLM 5.1、Kimi K2.6)真实场景效果和 Coding Plan 额度测试 新版本libatapp的连接管理——从etcd服务发现到拓扑驱动的自动重连 新版本libatbus的设计变更——从树形路由到拓扑驱动 Protobuf又一坑 - C++标准和ABI兼容性 AI真好用-给Blog主题统一加mermaid,chart.js,excalidraw,draw.io的多种引入方式支持 给内网部署Squid-通用HTTP下载缓存 UE使用CodeChecker和clang-tidy生成静态分析报告 找出UE的循环依赖 C++小协程栈和临时变量及作用域的栈溢出问题分析 游戏服务的可观测性能力建设(C++生态) 指标上报的多线程优化和多拉取源点优化 协程(libcopp)的Channel功能和CPU命中率优化 通用RPC代码生成器 实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针) 手夯一个STL allocator和对象内存分析组件 std::condition_variable 的信号丢失问题 踩坑一处(GCC)STL std::async 实现BUG导致的crash问题 GCC 14的一个warning to error BUG 给xresloader(Excel导表工具)增强UE读表支持(包含蓝图,Blueprint) Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪) Excel转表工具(xresloader)的新验证器(验证外部Excel和文本数据,唯一性和自定义规则) protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配 关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题 xresloader-Excel导表工具链的近期变更汇总 打通游戏服务端框架的C++20协程改造的最后一环 Opentelemetry-cpp的Logs模块标准更新(涉及近期版本:1.8-1.9的BREAK CHANGES) 给cmake-toolset和工具链(curl等)加HTTP/2和HTTP/3支持 又开新坑之 coredns 插件: nftables和filter 关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记 集成 upb 和 lua binding 的踩坑小记
填个转表工具 xresloader 去年的坑(数组尾部裁剪)
owent · 2022-08-28 · via I'm OWenT

blog-website

前言

xresloader 是一个功能比较全面并且跨平台的Excel导出protobuf、msgpack、xml、lua、json、javascript、UE-Csv、UE-Json等数据格式的工具。 并且整个工具链还包含了基于模板引起生成读表代码的 xres-code-generator ,方便产品/策划使用的 GUI批量执行工具 - xresconv-gui 和方便CI集成和程序使用的 命令行批量执行工具 - xresconv-cli

在之前很多项目和小伙伴们的使用过程中都提了一些非常不错的一键和建议,还有一个Feature Request。其中有一项对整体的输出流程变动比较大,所以之前只改了部分输出类型的实现。 这两天抽空完成了剩余的部分。

为啥会变动大?

首先,这个需求的功能是,当一个数组在Excel里配置时,如果存在空配置。那么只裁剪末尾的空项,不裁剪前面的。 详情可参见 https://github.com/xresloader/xresloader/issues/6 。 为什么这个需求会导致比较大的变化呢?xresloader 原本支持的模式有两个,一个是裁剪掉所有空项,这样策划配置在Excel里的无效值会被直接过滤掉。 另一个是保留所有的项目,之前我们有个项目是策划用Excel画地图的,这样要保留所有的位置信息。

这两种模式的共同点就是,他们对于一个元素准备转出的时候,都能只根据自己的数据知道自己需不需要被导出。 而在新的这个需求功能中,自己要不要输出就和后面还没跑到的元素有关。

另外由于 xresloader 支持多种输出模式,每种模式的输出方式不完全一样,同时输入模式我们也有Plain模式(把数组配置在一个Excel单元格中)和标准模式(数组的每一个元素单独配置在一个Excel单元格中)。 比如在 UE-Csv 模式中,为了提高性能,我们采用的是流式的输出方式。那么在这种场景下,首先我们需要把上级结构传递到下一级,既我们转出数组内的某个元素的时候要知道目前数组以输出的数据长度和当前元素的下标(标准模式)。这样我们才能知道前面需要补多少数据。 显然如果是一个Plain模式的数组,我们是不需要补元素的,因为本身只能动态长度。但是我们不能根据当前导出是Plain模式还是标准模式来决定是否走补全流程。因为可能出现message数组,数组本身是标准模式,但是message是Plain模式。这样这个单元格转出是Plain模式的,但仍然要补数据。

在去年其实我已经实现了大部分结构的调整和输出模式的裁剪尾部空值的支持。但是那些都是结构化数据,比较好处理。而 UE-Csv 这种流式输出的就比较麻烦,这次主要也就是实现了上面提到的方案的执行细节,总算是填完了这个坑。

额外增加了一个小工具 xresloader-dump-bin

在上个月的时候,为了方便调试,我写了个小工具 xresloader-dump-bin ,用于把 xresloader 输出的协议二进制转换成人类易读的文本。 主要是为了调试方便使用的,因为 xresloader 的结构报了一层,里层是 bytes 没法用protobuf官方工具直接简单得可视化看内容。

这次这个小工具还是用了 Rust 语言写。Rust语言确实是很适合写这类小工具,跨平台和交叉编译都非常方便。运行开销非常小,编译完得包也非常小。

分离协议子模块

另外我还把 xresloader 的协议分离除了单独的仓库( https://github.com/xresloader/xresloader-protocol ),并作为各个依赖仓库的子模块。 这是因为随着跟多的工具的实现,依赖这个协议的越来越多,分离出来可以更好地管理协议,也不需要仅仅为了更新协议拉主仓库。

Upb和Lua读表工具链

最好一个大地改进是读表工具增加了对 upb 和其 Lua binding地支持。 pbc 已经被作者弃坑好多年了,所以我们项目组近期接入了这个更有影响力地方案。 upb 是一个 protobuf 官方的子项目,运行时使用纯C编写。代码生成工具使用C++,依赖 libprotoc 和 abseil-cpp 。并且 upb 是现在protobuf的Ruby, PHP和Python的官方运行时库,里面也包含了Lua binding模块。这样不仅技术支持有保障(有主流项目踩坑),并且能跟进protobuf的新功能。

简单地说,就是读表代码生成工具 xres-code-generator 里增加了支持 upb 和其 Lua binding 的模板和Loader的Service模块。 同时构建系统 cmake-toolset 里增加了对集中不同引入方式和几个典型版本的upb的适配和Patch,并提供了自测小工具。

更多细节可以参见我之前一篇Blog: 《集成 upb 和 lua binding 的踩坑小计》

最后

其实还有一些其他的小优化的Feature Request,不过那些变动都不大。下次啥时候能抽出时间来再继续加吧。

欢迎大家试用和提出宝贵意见。

开源主仓库: https://github.com/xresloader/xresloader 文档: https://xresloader.atframe.work/