高性能 C++ SDK,用于 Croupier 游戏函数注册与虚拟对象管理
Croupier C++ SDK 是 Croupier 游戏后端平台的官方 C++ 客户端实现。它提供了高性能的虚拟对象注册、gRPC 通信和多平台构建支持,采用 ID 引用模式 解决对象参数传递性能问题,通过 四层组件化架构 实现优雅的函数和对象管理。
| 项目 | 描述 | 链接 |
|---|---|---|
| Croupier | 游戏后端平台主项目 | cuihairu/croupier |
| Croupier Proto | 协议定义(Protobuf/gRPC) | cuihairu/croupier-proto |
| 语言 | 仓库 | Nightly | Release | Docs | Coverage |
|---|---|---|---|---|---|
| Go | croupier-sdk-go | ||||
| Java | croupier-sdk-java | ||||
| JS/TS | croupier-sdk-js | ||||
| Python | croupier-sdk-python | ||||
| C# | croupier-sdk-csharp | ||||
| Lua | croupier-sdk-cpp | - | - | - |
⚠️ 重要说明:本 SDK 仅支持 64 位 (x64/ARM64) 架构,不支持 32 位 (x86) 架构。
| 平台 | 架构 | 状态 |
|---|---|---|
| Windows | x64 | ✅ 支持 |
| Linux | x64 | ✅ 支持 |
| macOS | x64, ARM64 (Apple Silicon) | ✅ 支持 |
- 🏗️ 虚拟对象注册系统 - 完整的对象和函数组注册机制
- 📡 gRPC 集成 - 真实的 Protobuf + gRPC 通信(通过 vcpkg)
- 🔧 多平台支持 - Windows、Linux、macOS(64位)
- 📦 vcpkg 包管理 - 自动依赖管理和跨平台构建
- 🚀 高性能设计 - ID 引用模式,无状态函数,轻量参数
- 🛡️ 类型安全 - JSON Schema 验证,编译时类型检查
- 🔄 自动构建 - GitHub Actions 每日构建发布
- 64位操作系统 (Windows x64 / Linux x64 / macOS x64 or ARM64)
- C++17 编译器(GCC 8+, Clang 10+, MSVC 2019+)
- CMake 3.20+
- vcpkg(推荐,用于依赖管理)
- Ninja(推荐,用于更快构建)
- gRPC (通过 vcpkg)
- Protobuf 5.29.x LTS (通过 vcpkg)
- nlohmann/json (通过 vcpkg)
Linux/macOS:
# 基础构建
./scripts/build.sh
# 清理重构建
./scripts/build.sh --clean
# 启用测试
./scripts/build.sh --tests ONWindows:
# 基础构建
.\scripts\build.ps1
# Debug 构建
.\scripts\build.ps1 -BuildType Debug# 1. 配置构建(默认会自动 clone + bootstrap vcpkg 到 ./vcpkg)
cmake -B build \
-DCMAKE_TOOLCHAIN_FILE=./cmake/vcpkg-bootstrap.cmake \
-DVCPKG_OVERLAY_PORTS=./vcpkg-overlays \
-DVCPKG_OVERLAY_TRIPLETS=./vcpkg-overlays/triplets \
-DCMAKE_BUILD_TYPE=Release
# 2. 构建
cmake --build build --parallel
# 3. 运行示例(需要本地 Agent)
#
# SDK 示例默认连接 `127.0.0.1:19090`(见 `examples/*.cpp` 里的 `agent_addr`),请先确保 Croupier Agent 已启动。
#
# 如果你在 croupier 主仓库里(包含 `server/`),可以用下面命令启动本地 Server + Agent:
#
# cd server
# go run ./services/server -f services/server/etc/server.yaml
# go run ./services/agent -f services/agent/etc/agent.yaml
#
# 然后运行 C++ 示例:
./build/bin/croupier-example
./build/bin/croupier-virtual-object-demoCMake Tools 本身不会“自动使用 vcpkg”,它只会按你当前的 CMake 配置去 find_package()。
如果你本机装过 Homebrew 的 protobuf/grpc,而 CMake 没用 vcpkg toolchain,就会误用系统 protobuf,进而报:
Protobuf C++ gencode is built with an incompatible version of Protobuf C++ headers/runtime。
本仓库提供了 croupier-sdk-cpp/CMakePresets.json(默认走 vcpkg):
- VS Code:
CMake: Select Configure Preset→ 选择macos-*-*-vcpkg(Apple Silicon 选macos-arm64-...) - 如果之前已经 Configure 过,请先删掉
croupier-sdk-cpp/build/*再重新 Configure(toolchain 必须在第一次 configure 时生效) - macOS 下我们额外提供了
vcpkg-overlays/triplets(preset 已自动配置),避免 AppleClang 优先使用/usr/local/include导致误用 Homebrew 的protobuf/absl头文件
跨平台预设(可提交到 Git,推荐):
- macOS:
macos-arm64-*-vcpkg/macos-x64-*-vcpkg - Linux:
linux-x64-*-vcpkg - Windows:
windows-x64-*-vcpkg(Visual Studio 17 2022 生成器,不依赖 Ninja)
个人本机差异(例如你想用全局安装的 vcpkg 路径,而不是仓库内 ./vcpkg),建议放到 CMakeUserPresets.json,不要提交到 Git。
默认 preset 使用 croupier-sdk-cpp/cmake/vcpkg-bootstrap.cmake 作为 toolchain:
- 如果仓库根目录下没有
./vcpkg,会自动git clone并执行bootstrap-vcpkg(只做一次) - 如需禁用自动下载(离线环境),configure 时加
-DCROUPIER_BOOTSTRAP_VCPKG=OFF,然后手动准备./vcpkg
#include "croupier/sdk/croupier_client.h"
using namespace croupier::sdk;
std::string TransferHandler(const std::string& context, const std::string& payload) {
auto data = utils::ParseJSON(payload);
std::string from_player = data["from_player_id"];
std::string to_player = data["to_player_id"];
return ExecuteTransfer(from_player, to_player, data["amount"]);
}
int main() {
ClientConfig config;
config.game_id = "mmorpg-demo";
config.env = "development";
config.agent_addr = "127.0.0.1:19090";
CroupierClient client(config);
FunctionDescriptor desc{"wallet.transfer", "1.0.0"};
client.RegisterFunction(desc, TransferHandler);
client.Connect();
client.Serve();
}VirtualObjectDescriptor wallet_entity;
wallet_entity.id = "wallet.entity";
wallet_entity.version = "1.0.0";
wallet_entity.operations["read"] = "wallet.get";
wallet_entity.operations["transfer"] = "wallet.transfer";
std::map<std::string, FunctionHandler> handlers;
handlers["wallet.get"] = WalletGetHandler;
handlers["wallet.transfer"] = WalletTransferHandler;
client.RegisterVirtualObject(wallet_entity, handlers);SDK 包含多个完整的示例程序,展示各种使用场景:
| 示例 | 描述 | 运行命令 |
|---|---|---|
example.cpp |
基础函数注册示例 | ./build/bin/croupier-example |
virtual_object_demo.cpp |
虚拟对象注册和管理 | ./build/bin/croupier-virtual-object-demo |
config_example.cpp |
高级配置管理 | ./build/bin/croupier-config-example |
plugin_demo.cpp |
动态插件系统 | ./build/bin/croupier-plugin-demo |
comprehensive_demo.cpp |
完整 API 演示 | ./build/bin/croupier-comprehensive-demo |
production_example.cpp |
生产环境最佳实践 | ./build/bin/croupier-production-example |
详细的集成指南和 API 文档请参考:
Function Level ← wallet.transfer (具体函数实现)
↓
Entity Level ← wallet.entity (业务对象模型)
↓
Resource Level ← 钱包管理面板 (UI 资源组织)
↓
Component Level ← economy-system (可分发模块)
- 🚀 极致性能:网络传输只有几十字节
- 🛡️ 线程安全:无状态函数,天然支持并发
- 🔄 水平扩展:函数可以部署到任意节点
- 🧩 松耦合:对象管理与业务逻辑完全分离
class CroupierClient {
public:
bool RegisterFunction(const FunctionDescriptor& desc, FunctionHandler handler);
bool RegisterVirtualObject(const VirtualObjectDescriptor& desc,
const std::map<std::string, FunctionHandler>& handlers);
bool RegisterComponent(const ComponentDescriptor& comp);
bool Connect();
void Serve();
void Stop();
void Close();
};struct ClientConfig {
std::string agent_addr = "127.0.0.1:19090";
std::string game_id;
std::string env = "development";
std::string service_id = "cpp-service";
bool insecure = true;
bool auto_reconnect = true;
int reconnect_interval_seconds = 5;
int reconnect_max_attempts = 0; // 0 = unlimited
};auto_reconnect:默认true;当 Agent 重启/断开时,Serve()会自动尝试重连并重新注册函数;设为false时,连接断开会退出Serve()。reconnect_interval_seconds:重连间隔(秒),默认5(最小1)。reconnect_max_attempts:最大重连次数,默认0表示无限重试;大于 0 时,达到次数后停止重连并退出Serve()。
CROUPIER_AUTO_RECONNECT=true|falseCROUPIER_RECONNECT_INTERVAL_SECONDS=5CROUPIER_RECONNECT_MAX_ATTEMPTS=0
每日自动构建,支持多平台产物:
- 静态库 (.a/.lib)
- 动态库 (.so/.dylib/.dll)
- 头文件包
- 示例程序
访问 Releases 页面 下载:
静态库包:
croupier-cpp-sdk-static-{version}-windows-x64.zipcroupier-cpp-sdk-static-{version}-linux-x64.tar.gzcroupier-cpp-sdk-static-{version}-macos-x64.tar.gzcroupier-cpp-sdk-static-{version}-macos-arm64.tar.gz
动态库包:
croupier-cpp-sdk-dynamic-{version}-windows-x64.zipcroupier-cpp-sdk-dynamic-{version}-linux-x64.tar.gzcroupier-cpp-sdk-dynamic-{version}-macos-x64.tar.gzcroupier-cpp-sdk-dynamic-{version}-macos-arm64.tar.gz
💡 提示:推送
v*格式的 tag(如v1.0.0)会自动触发正式 Release 构建
croupier-sdk-cpp/
├── include/ # 公共头文件
├── src/ # 源代码
├── examples/ # 示例程序
├── scripts/ # 构建脚本
├── cmake/ # CMake 模块
├── configs/ # 配置文件示例
└── vcpkg.json # vcpkg 依赖清单
- 遵循 C++17 标准
- 使用 clang-format 格式化代码
- 编写单元测试
- 更新相关文档
- Fork 项目
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 创建 Pull Request
本项目采用 Apache License 2.0 开源协议。