-
> один заполняется, предыдущий отрисовывается
А если отрисовка медленней заполнения ? Подумай ...
-
> MBo (31.01.2008 14:32:19) [19]
Для испытания временно отключи отрисовку.
-
>А если отрисовка медленней заполнения ? тогда бы я ставил в очередь и отрисовывал бы только часть кадров.
В данном случае хватает двух буферов. 14400 пакетов в секунду, 0.07 мс один пакет Отрисовка сначала у меня происходила более сложно, и занимала 3-4 мс, это по времени порядка 60 пакетов, около 40 КБ данных. Визуально - если критерий отрисовки - приход нулевой строки, то в районе 20-50 строк было много выпавших. Сейчас отрисовка быстрее, и артефактов на моей машине (Athlon 3500) практически нет, но на машинах вдвое медленнее - все-таки появляются.
Собственно, интересно - так и должна машина нагружаться при приеме из сети потока такой интенсивности, или руки нужно выпрямлять?
(С цифрового видеограббера без проблем принимаю, достаточно сложным образом обрабатываю и отрисовываю втрое-вчетверо больший поток)
-
> MBo (31.01.2008 15:47:22) [22]
100 мегабит это ничто для процессора, проблема не в количестве, а в другом месте.
-
>а в другом месте. Вот и хочется понять, что это за место ;)
-
> MBo (31.01.2008 18:31:24) [24]
Э, ну ты даешь, программа то у тебя, задача сложная, явно не для форума, да и сеть у тебя работает за пределами возможностей. 11 мб не любая сеть обеспечит, а еще твоя обработка. Так что придется тебе самому грызть.
-
> MBo ©
А что за девайс такой? IP камера? Просто знакомая мне тематика.
-
> Собственно, интересно - так и должна машина нагружаться > при приеме из сети потока такой интенсивности, или руки > нужно выпрямлять?
Нет, не должна. Вся нагрузка возникает, если в принимаемом потоке надо. что то искать, выцеплять, декодировать. Отрисовка это тоже мелочи.
-
procedure x;
type
TLineRec=packed record
Info:word;
Data:array[0..192*4-1] of char;
end;
var
Bitmap:TBitmap;
Line:TLineRec;
FromLen,LineNum,CadrNum,Wrd:integer;
WSResult:integer;
UD:TSocket;
Addr:TSockAddr;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.PixelFormat:=pf32bit;
Bitmap.Width:=192;
Bitmap.Height:=192;
while not Terminated do begin
FromLen := SizeOf(TSockAddr);
WSResult := RecvFrom(UD, Line, SizeOf(Line), 0, Addr, FromLen);
if WSResult<>SizeOf(Line) then continue;
Wrd := Swap(Line.Info);
LineNum:= Wrd and $3FF;
if (LineNum>-1) and (LineNum<Bitmap.Height) then
Move(Line.Data,Bitmap.ScanLine[LineNum]^,SizeOf(Line.Data));
if LineNum = Bitmap.Height-1 then
begin
Inc(FrameCount);
FCanvas.Lock;
try
FCanvas.Draw(0,0,Bitmap);
finally
FCanvas.Unlock;
end;
end;
end;
finally
Bitmap.Free;
end;
end;
-
2 MBo ©
WSARecv c кучей буферов сразу под весь кадр не пробовал? Те буфер один, но разбит на несколько, по числу строк.
Синхронизацию сообщениями я бы выкинул. Как и многопоточность, скоре всего, использовал бы асинхронный режим. В любом случае, синхронизация здесь - лишние потери, имхо. Два буфера, один рисуется, второй принимается. Буферы переключает "приемник", а по WM_PAINT выводится "рисуемый", независимо от того, было ли обновление.
Как гипотеза - может вывод через DirectX побыстрее будет. Не знаю, не спец.
-
если картинка боле менее статичная, то потеря небольшого колва, каждый раз разных, строк не должна вызывать видимых артефактов... если конечно старый кадр не затирать "чернухой", а оставлять отображая новый "поверх" старого
|