![]() |
AW: Thread auf mehrere Core verteilen
Zitat:
Dir ist wohl klar das du nun die relativen Dinge um die es geht nun nicht mehr siehst? Es hatte schon einen grund das ich es in einem archiv gepackt habe. Die Auslastung der resourcen GPU/CPU usw.. kann man auf deinen Shot nicht mehr erkennen. gruss |
AW: Thread auf mehrere Core verteilen
Zitat:
|
AW: Thread auf mehrere Core verteilen
Zitat:
|
AW: Thread auf mehrere Core verteilen
Zitat:
Aber egal hab keine zeit zum spielen. ;) Ok Danke trotzdem hab das Archiv gelöscht. gruss |
AW: Thread auf mehrere Core verteilen
Zitat:
ich sehe hier eine relativ einfache Möglichkeit zur Parallelisierung. Du solltest einen Kern(=Thread) den Frame rendern lassen und einen anderen Kern bereits den nächsten. Wenn Du so die Arbeit auf 4 Kerne verteilst, hat jeder Kern die vierfache Zeit für seine Arbeit. Du musst natürlich die Soundausgabe soweit verzögern, dass sie zeitgleich mit der Anzeige kommt. Das ganze erfordert natürlich einen ziemlichen Verwaltungsaufwand. Mit anderen Worten: Die Kerne werkeln gleichzeitig an vier aufeinanderfolgenden Frames. Sie stellen ihr Ergebnis in eine kurze Warteschlange, die von der Grafikausgabe aufgenommen und auf den Bildschirm gebracht wird. Kern1 bearbeitet also die Frames 1,5,9..., Kern2 2,6,10..., Kern 3 3,7,11... und Kern 4 4,8,12... |
AW: Thread auf mehrere Core verteilen
Danke für die Informationen.
Ich habe es mal getestet nur mit einem zusätzlichen Thread. So wie es aussieht scheint es zu funktionieren werden nun alle Kerne vergleichsweise ausgeglichen verwendet. Allerdings hab ich nun schwierigkeiten beim verändern der Fenstergröße. OGL ist da ziemlich pingelig wenn der Contex incl. GL-Befehle nicht ausschließlich aus dem Thread heraus behandlet werden. Fenster resitz.. crash ;) Muss da wohl noch einiges optimieren. gruss |
AW: Thread auf mehrere Core verteilen
Zitat:
Da versucht dann ein Thread (z.b. Berechnung) was zu verändern, wo in dem Moment ein anderer Thread (z.b. Anzeige) darauf zugreift. Das knallt. Du musst also also Übergabepunkte zwischen den Threads synchronisieren (z.B. Mutex drumrum packen). Willkommen in der schweren, steinigen Welt des Multithreadings ;-) |
AW: Thread auf mehrere Core verteilen
Zitat:
Jetzt mal unabhängig von den Kernen OGL hat ein grundsätliches problem mit Threads Wenn man dann noch bedenkt das die Plugins ein mismatch aus GDI/OGL sind kommt man letztendlich zum schluss das die Schnittstelle nicht gerade durchdacht ist. Ok.. Das ist ne andere sache wird langsam OT ;) gruss |
AW: Thread auf mehrere Core verteilen
Zitat:
Zitat:
Aber da die GPU nur zu 14% (laut deinem Screenshot) ausgelastet ist, kann das nicht das Problem sein. Jetzt ist die Frage, was macht dein Programm bei höheren Auflösungen auf der CPU anders? Und welche Stationen durchläuft bei dir ein Frame genau, bevor es auf dem Bildschirm ausgegeben wird? Läuft das alles über OpenGL direkt? Oder – Gott bewahre – liest du etwa den OpenGL-Framebuffer mit ![]() |
AW: Thread auf mehrere Core verteilen
Ich erstelle einen GDI-VideoBuffer(VisBuf) abhängig vom Viewport = bsp. 512x384 außerhalb des Threads.
Die Visualisierung wird dann also in VollBild 1920x1200 auf den Viewport 512x384 gestretcht. Das schont CPU resourcen.
Delphi-Quellcode:
Dann wird der Record VisData mit den Wave/FFT Daten gefüttert
FillChar(BmpInfo, SizeOf(BITMAPINFO), 0);
BmpInfo.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER); BmpInfo.bmiHeader.biWidth := StretchWidth; BmpInfo.bmiHeader.biHeight := -StretchHeight; BmpInfo.bmiHeader.biPlanes := 1; BmpInfo.bmiHeader.biBitCount := 32; VisBmp := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, VisBuf, 0, 0); und anschließend im Plugin selbst gerendert wo ich keinen Einfluss drauf habe
Delphi-Quellcode:
anschließend hole ich mir das DC vom OpenGL Contex (RenderWindow)
if (not VisInfo^.VisPointer^.Render(VisInfo^.VisBuf, StretchWidth,
StretchHeight, StretchWidth, @VisData)) then
Delphi-Quellcode:
DC := GetDc(ParentHandle);
Danach verwende ich StretchBlt um die Daten auf das DC vom Source VisDC zu zeichnen
Delphi-Quellcode:
Anschließend wird der inhalt vom VisBuf in eine OGL-Texture kopiert
if (not StretchBlt(DC, VisInfo^.x, VisInfo^.y, VisInfo^.w, VisInfo^.h, VisInfo^.VisDC, 0,
0, StretchWidth, StretchHeight, SRCCOPY)) then
Delphi-Quellcode:
Der rest sind noch ein paar OGL sachenglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, StretchWidth, StretchHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
Delphi-Quellcode:
Das wars dann.
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); ... glFlush(); SwapBuffers(glDC); Nach meiner änderung von Timer auf Thread geht es jetzt soweit und die Kerne werden gleichmäßig ausgelastet. Wenn aber nun aus der Anwendung heraus die resitz Message geschickt wird die außerhalb des threads läuft
Delphi-Quellcode:
Result := BASS_SONIQUEVIS_Resize(Param^.VisHandle, Left, Top, Width, Height);
dann kracht es gewaltig in irgendeiner OGL .dll so sieht es im moment aus. Zitat:
Delphi-Quellcode:
glColor4f(1, 1, 1, 1);
glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex2f( 0.0, 0.0); glTexCoord2d(0.0, 1.0); glVertex2f( 0.0, LastHeight); glTexCoord2d(1.0, 1.0); glVertex2f(LastWidth, LastHeight); glTexCoord2d(1.0, 0.0); glVertex2f(LastWidth, 0.0); glEnd(); gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz