Laden...

GUI für Videokonferenz: Performance-Probleme bei mehreren gleichzeitigen Videoströmen

Erstellt von syn87 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.259 Views
S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 13 Jahren
GUI für Videokonferenz: Performance-Probleme bei mehreren gleichzeitigen Videoströmen

Hallo zusammen.

ich bastel grad an einem konferenz tool bei dem man alle in der selben befindlichen Nutzer sehen können soll. Soweit funktionert das ganze auch schon sehr gut... Nur wird es etwas problematisch, wenn ich entweder die fps hoeher setze, oder es mehr als 4 Nutzer werden. Der Netzwerkteil dürfte meines Erachtens nach keine probleme darstellen, da ich den Soundkram bereits fertig habe, und die Netzwerklast dort wesentlich höher war.

Mein Gefühl sagt mir, dass es irgendwas mit der GUI zu tun hat. Die ankommenden Pakete werden wie folgt verarbeitet:


listener = new Listener(1551, delegate(IPAddress from, byte[] raw)
{
Client client = null;
if (!clients.TryGetValue(from, out client))
 return;

MemoryStream m = new MemoryStream(raw);
client.Camera.Image = new Bitmap(m);
};

Camera ist eine PictureBox... diese wird in einem anderen Thread als die GUI erstellt, später dann aber zu dieser hinzugefügt (invoke noetig?)... der listener startet einen neuen Thread, in welchem auf ankommende Pakete gewartet wird. kommt ein paket an, wird die callback-Methode (delegate) aufgerufen (muss hier vllt fuer das setzen des Image ein Invoke her?).

2 Knackpunkte hab ich nun bereits genannt. Eine weitere Möglichkeit wuerde eventuell darin bestehen, dass ich die GUI multithreaded gestalte. d.h. also ein zusaetzliches programm erzeuge, welches kein formborder hat und welches nur ein videosignal verarbeitet. Wie auch immer, bin auf die antworten gespannt.

gruß

syn

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo syn87,

diese wird in einem anderen Thread als die GUI erstellt, später dann aber zu dieser hinzugefügt (invoke noetig?)

das ist weder ohne noch mit Invoke zulässig. Controls, die sich gegenseitig kennen (hier u.a. über Parent), müssen im selben Thread erzeugt werden.

muss hier vllt fuer das setzen des Image ein Invoke her?

Selbstverständlich. Für alle Zugriffe aus anderen Threads auf ein Control muss man Control.Invoke verwenden. Siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

2 Knackpunkte hab ich nun bereits genannt.

Der größte Knackpunkt ist, PictureBoxen zu verwenden. Du solltest die Bilder selber zeichnen. Siehe [Artikel] Zeichnen in Windows-Programmen. Und selbst dabei ist nicht sichergestellt, dass dies schnell genug ist. Vielleicht musst du auf DirectX ausweichen.

herbivore

Gelöschter Account
vor 13 Jahren

Vielleicht musst du auf DirectX ausweichen.

Das halte ich für das absolut sinnvollste.
Das Problem ist das du die Framerate zwar höher setzen kannst
du dich aber nach wie vor in dein deiner WindowsForms Gui befindet
die nicht so schnell gezeichnet wird wie deine Frames.

Die Möglichkeit die Herbi aufgezeigt hat könnte von der Performance
ausreichen, muss aber nicht. Kommt darauf an wie hochgesteckt deine Ziele
mit dem Programm sind.