Visual C+的最快方式是什么+;DLL将2-3Mega字节复制到C#缓冲区?

Visual C+的最快方式是什么+;DLL将2-3Mega字节复制到C#缓冲区?,c#,c++,windows,visual-studio-2010,visual-c++,C#,C++,Windows,Visual Studio 2010,Visual C++,什么样的C#缓冲区可以处理这个问题 我需要我的C#solution.exe从生成实时视频帧(高达60/秒)并将其复制到C#缓冲区的Visual C++DLL中获取大约2-3MB的数据,每秒最多60次。然后C#将通过USB将这些数据转发到另一台计算机 我尝试过C#String,但有一个最大大小限制(大约10KB左右) 我正在考虑一个包含数据缓冲区和握手变量的C#struct 我可能需要多个缓冲区,所以可能需要这些结构的数组 但是,从本质上讲,给某种C#缓冲区的DLL目标地址最好的方法(最快!!!)

什么样的C#缓冲区可以处理这个问题

我需要我的C#solution.exe从生成实时视频帧(高达60/秒)并将其复制到C#缓冲区的Visual C++DLL中获取大约2-3MB的数据,每秒最多60次。然后C#将通过USB将这些数据转发到另一台计算机

我尝试过C#String,但有一个最大大小限制(大约10KB左右)

我正在考虑一个包含数据缓冲区和握手变量的C#struct

我可能需要多个缓冲区,所以可能需要这些结构的数组

但是,从本质上讲,给某种C#缓冲区的DLL目标地址最好的方法(最快!!!)是什么,这样DLL就可以将其生成的2-3MB数据复制到缓冲区,然后设置一个变量标志,同时C#正在轮询该标志,以了解数据何时在缓冲区中,以便对其进行进一步处理

我认为缓冲区应该首先由C#创建,而不是由DLL创建。

这里有一个想法:

  • 让C代码分配缓冲区
  • 把它固定在一个固定的地址上
  • 将指针传递给C++代码
  • C++代码现在可以直接写入缓冲区(甚至使用零拷贝方法) 优点是,您可以使用普通的、受管理的
    字节[]

    以下是一个想法:

  • 让C代码分配缓冲区
  • 把它固定在一个固定的地址上
  • 将指针传递给C++代码
  • C++代码现在可以直接写入缓冲区(甚至使用零拷贝方法)
    优点是您可以使用普通的、受管理的
    字节[]

    ,我个人会将内存映射文件与信号机制(如命名事件)结合使用。你说的是通过USB端口发送高达180 MB/秒的数据?这在USB3.0的能力范围内,尽管您的吞吐量可能会受到接收设备速度的限制。您在尝试以每秒60帧的速度渲染未压缩图像时可能会遇到一些问题。“C#String”在任何情况下都没有10KB左右的最大大小限制。你是从哪里得到这个印象的?@DouglasK.Bell:但是60帧2-3MB每帧的速度是120到180MB/秒:是USB 2.0速度的两到三倍。我不是视频处理方面的专家,但肯定有适合这种情况的帧压缩算法。就我个人而言,我会将内存映射文件与信号机制(如命名事件)结合使用。你说的是通过USB端口发送高达180 MB/秒的数据?这在USB3.0的能力范围内,尽管您的吞吐量可能会受到接收设备速度的限制。您在尝试以每秒60帧的速度渲染未压缩图像时可能会遇到一些问题。“C#String”在任何情况下都没有10KB左右的最大大小限制。你是从哪里得到这个印象的?@DouglasK.Bell:但是60帧2-3 MB的每帧是120到180 MB/秒:是USB 2.0速度的两到三倍。我不是视频处理方面的专家,但肯定有一些适合这种情况的帧压缩算法。是的,零拷贝是一种方法。到目前为止,我在C++侧分配缓冲区,然后在C端,在不安全的{}中,转换为字节*。仍然需要“连接”到其余代码。如果有效的话,我会在这里发布解决方案。是的,零拷贝是最好的方法。到目前为止,我在C++侧分配缓冲区,然后在C端,在不安全的{}中,转换为字节*。仍然需要“连接”到其余代码。如果有效,我会在这里发布解决方案。