Skip to content

共享内存指南

大型 DCC 场景数据的零拷贝共享内存传输。

概述

DCC 场景数据(几何体、动画缓存、帧缓冲区)可以轻松达到千兆字节。传统的纯 Python DCC MCP 集成通过 TCP 序列化和发送数据,1 GB 场景可能需要 10-30 秒。

dcc-mcp-shm 提供了零拷贝替代方案:DCC 端将数据直接写入内存映射文件;消费者从同一映射区域读取,无需任何复制或序列化。

架构

DCC 进程                          Agent 进程
     │                                     │
     ▼                                     │
┌─────────────┐                      ┌─────────────┐
│ SharedBuffer│◄───── mmap 文件 ─────►│ SharedBuffer│
│   (写入)    │      (无复制)         │   (读取)    │
└─────────────┘                      └─────────────┘

快速开始

写入场景数据(DCC 端)

python
from dcc_mcp_core import PySharedSceneBuffer, PySceneDataKind

# 大顶点数据
vertices = open("scene.fbx", "rb").read()

# 写入共享内存
ssb = PySharedSceneBuffer.write(
    data=vertices,
    kind=PySceneDataKind.Geometry,
    source_dcc="Maya",  # DCC 名称
    use_compression=True  # 启用 LZ4 压缩
)

# 通过 IPC 发送描述符 JSON 到 agent
descriptor_json = ssb.descriptor_json()
send_to_agent(descriptor_json)

读取场景数据(Agent 端)

python
from dcc_mcp_core import PySharedSceneBuffer

# 从 DCC 接收描述符
descriptor_json = receive_from_dcc()

# 打开共享缓冲区并读取
ssb = PySharedSceneBuffer.from_descriptor_json(descriptor_json)
vertices = ssb.read()

PySharedSceneBuffer

共享场景数据的主要接口。

写入数据

python
from dcc_mcp_core import PySharedSceneBuffer, PySceneDataKind

# 简单写入
ssb = PySharedSceneBuffer.write(
    data=vertex_data,
    kind=PySceneDataKind.Geometry,
    source_dcc="Maya",
    use_compression=True
)

# 获取描述符 JSON
descriptor = ssb.descriptor_json()

读取数据

python
# 读取所有数据
data = ssb.read()

# 获取元数据
print(f"类型: {ssb.kind}")
print(f"DCC: {ssb.source_dcc}")
print(f"压缩: {ssb.use_compression}")
print(f"大小: {ssb.size_bytes} 字节")

IPC 序列化

python
# 导出 IPC 传输描述符
json_str = ssb.descriptor_json()

# 从描述符重构
ssb = PySharedSceneBuffer.from_descriptor_json(json_str)

PySceneDataKind

对数据进行分类以便适当处理:

类型用例典型大小
Geometry网格/顶点数据1 MB - 1 GB
Texture图像/纹理1 MB - 100 MB
Animation动画曲线100 KB - 100 MB
Scene完整场景状态10 MB - 1 GB
Metadata场景元数据1 KB - 1 MB

PyBufferPool

高性能场景的预分配缓冲区池。

创建池

python
from dcc_mcp_core import PyBufferPool

# 4 个 256 MiB 的缓冲区
pool = PyBufferPool(capacity=4, size_bytes=256 * 1024 * 1024)

使用缓冲区

python
# 从池中获取缓冲区
buffer = pool.acquire()

# 写入数据
buffer.write(large_data)

# ... 使用缓冲区 ...

# 释放回池(不销毁)
pool.release(buffer)

缓冲区属性

python
buffer = pool.acquire()
print(f"大小: {buffer.size_bytes}")
print(f"已用: {buffer.used_bytes}")

PySharedBuffer

低级共享内存接口。

创建共享缓冲区

python
from dcc_mcp_core import PySharedBuffer

# 创建指定大小的缓冲区
buffer = PySharedBuffer.create(size_bytes=1024 * 1024)

# 获取缓冲区 ID
buffer_id = buffer.buffer_id()
print(f"缓冲区 ID: {buffer_id}")

读取/写入

python
# 写入数据
buffer.write(b"Hello, World!")

# 读取数据
data = buffer.read()
print(data.decode())

压缩

LZ4 压缩是可选的,用于减少传输时间。

python
# 使用压缩(写入较慢,大数据传输较快)
ssb = PySharedSceneBuffer.write(
    data, PySceneDataKind.Geometry, "Maya", use_compression=True
)

# 不使用压缩(写入较快,传输较慢)
ssb = PySharedSceneBuffer.write(
    data, PySceneDataKind.Geometry, "Maya", use_compression=False
)

性能对比

方法100 MB 传输1 GB 传输
TCP 序列化~10-15秒~100-300秒
共享内存~0.1秒~0.5-2秒

使用场景

Maya 几何体导出

python
from dcc_mcp_core import PySharedSceneBuffer, PySceneDataKind

def export_selection_to_agent():
    import maya.cmds as cmds

    # 获取选中的几何体
    selection = cmds.ls(selection=True, type="mesh")
    if not selection:
        return None

    # 导出为二进制
    data = export_meshes_binary(selection)

    # 写入共享内存
    ssb = PySharedSceneBuffer.write(
        data,
        PySceneDataKind.Geometry,
        "Maya",
        use_compression=True
    )

    return ssb.descriptor_json()

平台说明

Windows

  • 使用 CreateFileMapping / MapViewOfFile
  • 命名管道用于跨进程通信
  • 最大文件大小:256 TB(理论)

Linux

  • 使用 shm_open / mmap
  • POSIX 共享内存对象
  • 最大文件大小:受文件系统限制

macOS

  • 使用 mmap 和匿名内存
  • 通过 POSIX 共享内存跨进程

Released under the MIT License.