AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread auf mehrere Core verteilen

Ein Thema von EWeiss · begonnen am 18. Sep 2013 · letzter Beitrag vom 20. Sep 2013
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 18:24
Wenn die Anzeige 10x die Sekunde neu gezeichnet wird, dann ist das schon verdammt nah dran. Und das ist ein Neuzeichnen alle 100ms. Ich denke, 20fps würden mehr als dicke reichen, das sind 50ms zwischen den Redraws.
Nö das reicht nicht bedenke um so höher die Auflösung desto geringer die FPS..
Das mag bei einer Auflösung von 320x240 gehen aber nicht bei 1920x1200 oder drüber
Es bringt mir nichts wenn ich auf grund irgendwelcher einsparungen letztendlich mit dem Beat hinterher hinke..
Alles schon versucht.

gruss

Geändert von EWeiss (19. Sep 2013 um 18:26 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 19:23
Was genau zeichnest du da eigentlich und wie? Wenn du es mit DirectX oder OpenGL machst, sollte die Auflösung doch fast keine Rolle spielen...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 19:34
Was genau zeichnest du da eigentlich und wie? Wenn du es mit DirectX oder OpenGL machst, sollte die Auflösung doch fast keine Rolle spielen...
Mit was man zeichnet spielt keine rolle bei beiden DX und OGL ändert sich die FPS abhängig von der Fenster größe.

Siehst du doch bei spielen wenn man hier die Auflösung ändert.
Aber wie im Beitrag schon geschrieben geht es mir nicht um die FPS sondern darum
das ein Core mit Volllast fährt obwohl die CPU ansich nicht ausgelastet ist.

Arbeite dran

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 20:03
Was genau zeichnest du da eigentlich und wie? Wenn du es mit DirectX oder OpenGL machst, sollte die Auflösung doch fast keine Rolle spielen...
Mit was man zeichnet spielt keine rolle bei beiden DX und OGL ändert sich die FPS abhängig von der Fenster größe.

Siehst du doch bei spielen wenn man hier die Auflösung ändert.
Aber nur bei graphisch sehr aufwändigen Spielen, ansonsten sind meist mehr FPS möglich als der Bildschirm darstellen kann. Dass das Rendern deines wie auch immer aussehenden Frequenzhistograms so aufwändig ist, dass es (auf der GPU) länger dauert als die FFT (auf der CPU), kann ich mir irgendwie kaum vorstellen, es sei denn, da ist irgendwas sehr ineffizient gelöst. Aber es ist halt schwer zu sagen, wenn man so wenig konkretes weiß. Wenigstens ein Screenshot um mal grob einen Eindruck zu bekommen, worum es eigentlich geht, wäre hilfreich...

Falls wirklich das Rendern auf der GPU der Flaschenhals ist, bringt dir jedenfalls auch Multithreading nichts.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 20:22
Die GPU hat gerade mal 9% (vom gesamten System natürlich) die probleme macht die CPU ein Kern!

Weiss nicht was dir ein Bild jetzt sagt habe es aber mal angehängt.
Habe es in einem Archiv gepackt weil es sonst hier im Forum verkleinert wird.

gruss

Geändert von EWeiss (19. Sep 2013 um 22:39 Uhr)
  Mit Zitat antworten Zitat
glotzer

Registriert seit: 15. Apr 2009
30 Beiträge
 
#6

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 21:41
für alle die wie ich darüber genervt sind/waren das archiv erst entpacken zu müssen... :
Angehängte Grafiken
Dateityp: jpg 19.09.jpg (72,6 KB, 38x aufgerufen)
Dateityp: png 19.10.png (35,5 KB, 34x aufgerufen)

Geändert von glotzer (19. Sep 2013 um 21:54 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Thread auf mehrere Core verteilen

  Alt 19. Sep 2013, 21:49
für alle die wie ich darüber genervt sind/waren das Archiv erst entpacken zu müssen... :
Du Spassvogel!

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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Thread auf mehrere Core verteilen

  Alt 20. Sep 2013, 08:57
Weiss nicht was dir ein Bild jetzt sagt habe es aber mal angehängt.
Weil Bilder weniger missverständlich als Beschreibungen sind. Ist mir z.B. schon oft so gegangen, dass ich Leuten versucht habe, bei irgendwelchen Computerproblemen zu helfen und sie stundenlang per Messenger ausgefragt habe und wir völlig aneinander vorbeigeredet haben, und nach einem Screenshot war sofort klar, was Sache ist...
Die GPU hat gerade mal 9% (vom gesamten System natürlich) die probleme macht die CPU ein Kern!
Und das macht mich stutzig. Also wenn du sagst, dass das Rendern bei größerer Auflösung langsam wird, dann würde das bedeuten, dass die GPU der Flaschenhals ist, weil diese sich ja um das Rendern kümmert. Der CPU ist es ja egal, wie groß die Ausgabe der GPU ist, denn auf der CPU laufen unabhängig von der Auflösung immer die gleichen Befehle.

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 glReadPixels aus, damit du das Gezeichnete mit der GDI weiterverwenden kannst?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Thread auf mehrere Core verteilen

  Alt 20. Sep 2013, 09:47
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:
  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);
Dann wird der Record VisData mit den Wave/FFT Daten gefüttert
und anschließend im Plugin selbst gerendert wo ich keinen Einfluss drauf habe
Delphi-Quellcode:
        if (not VisInfo^.VisPointer^.Render(VisInfo^.VisBuf, StretchWidth,
          StretchHeight, StretchWidth, @VisData)) then
anschließend hole ich mir das DC vom OpenGL Contex (RenderWindow)

DC := GetDc(ParentHandle);

Danach verwende ich StretchBlt um die Daten auf das DC vom Source VisDC zu zeichnen
Delphi-Quellcode:
        if (not StretchBlt(DC, VisInfo^.x, VisInfo^.y, VisInfo^.w, VisInfo^.h, VisInfo^.VisDC, 0,
          0, StretchWidth, StretchHeight, SRCCOPY)) then
Anschließend wird der inhalt vom VisBuf in eine OGL-Texture kopiert

Delphi-Quellcode:
        
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, StretchWidth, StretchHeight, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
Der rest sind noch ein paar OGL sachen
Delphi-Quellcode:
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
...
glFlush();
SwapBuffers(glDC);
Das wars dann.

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

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:
liest du etwa den OpenGL-Framebuffer mit glReadPixels aus
Nein die Pixels werden in Rechtecke zerlegt aus der glTexImage2D Texture

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

Geändert von EWeiss (20. Sep 2013 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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