Как разместить массив по заданному неуправляемому адресу?
От: Ilya81  
Дата: 26.09.11 05:58
Оценка:
Нужно из .Net-потока передать видео в DirectShow. Одно из возможных нелучших решений:
            unsafe
            {
                byte* p = (byte*)ip;
                for (int i = 0; i < iSize; i++, p++)
                    *p = (byte)p_stream.ReadByte();
            }

Но читать по байтам, да ещё с обратным преобразованием int в byte — явно не самый оптимальный вариант. А вот как сделать оптимальнее — вопрос: Marshal вроде не имеет метода для размещения массива именно по заданному адресу. GCHandle не будет работать с неуправляемой памятью (проверено — происходит ошибка). А все результаты поиска содержат эти варианты. Как объявить указатель на массив или преобразовать двойной указатель к массиву — разобраться мне не удалось. Класс Stream не имеет указателя на адрес потока, поэтому неуправляемыми функциями через extern воспользоваться не получается.
Подскажите, пожалуйста, как можно выполнить это действие оптимальнее.
Подскажи
Re: Как разместить массив по заданному неуправляемому адресу
От: samius Япония http://sams-tricks.blogspot.com
Дата: 26.09.11 06:17
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>Нужно из .Net-потока передать видео в DirectShow.

I>Подскажите, пожалуйста, как можно выполнить это действие оптимальнее.

Оптимальность и .Net поток живут далеко друг от друга. Скажем, чтение файла через WinAPI будет раза в 2-3 быстрее. Т.е. задача довольно бессмысленная — читать оптимально из неоптимального потока. Почему бы не взять что-нибудь побыстрее?

Если все-таки нужен дотнет поток, то можно смело использовать дополнительный массив-буфер для чтения, что бы потом копировать его в неуправляемый буфер. На фоне чтения из дотнет потока лишнее копирование будет незаметно невооруженному профайлером глазу.
Re: Как разместить массив по заданному неуправляемому адресу
От: hardcase Пират http://nemerle.org
Дата: 26.09.11 06:56
Оценка:
Здравствуйте, Ilya81, Вы писали:

I>Нужно из .Net-потока передать видео в DirectShow. Одно из возможных нелучших решений:


Есть штатный метод: Marshal.Copy
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.