Подтвердить что ты не робот

Каков наилучший способ объединить два буфера Windows Runtime?

Я написал следующий метод расширения для конкатенации двух объектов IBuffer в приложении Runtime Windows:

public static IBuffer Concat(this IBuffer buffer1, IBuffer buffer2)
{
    var capacity = (int) (buffer1.Length + buffer2.Length);
    var result = WindowsRuntimeBuffer.Create(capacity);
    buffer1.CopyTo(result);
    buffer2.CopyTo(0, result, buffer1.Length, buffer2.Length);
    return result;
}

Это самый эффективный способ справиться с этим? Есть ли лучший или более простой способ?

Я рассмотрел Лучший способ объединить два или более байтовых массива в С#, но я не думаю, что мне нужно преобразовывать в и из массивов байт.

4b9b3361

Ответ 1

В соответствии с MSDN:

Когда вы реализуете интерфейс IBuffer, вы должны реализовать IBufferByteAccess, который является COM-интерфейсом для непосредственного доступа к буфере. Вызывающие С++ используют этот интерфейс, чтобы избежать копирования буфера.

IBufferByteAccess имеет следующий метод:

HRESULT Buffer(
  [out]  byte **value
);

Если вы пишете на С++, вы можете использовать этот интерфейс для эффективного внедрения копирования данных. Однако class System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions, который вы использовали в вашем методе, также реализуется в собственном коде, поэтому он почти уверенно использует преимущества IBufferByteAccess интерфейс. Метод вызова WindowsRuntimeBufferExtensions.CopyTo из управляемого кода должен быть таким же быстрым, как реализация его эквивалента в собственном коде и вызов этой реализации (если только измененная реализация не сделает меньше проверки).