Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

16 zu 24 Bit Farbe

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 10.07.2013, 19:02    Titel: 16 zu 24 Bit Farbe Antworten mit Zitat

Moin lächeln

Ich bräuchte mal eine kurze asm Hilfe.
Zwar konvertiere ich mit der Makrovariante von http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/24bit-zu-16bit-77.html ein paar Farbwerte und möchte die später gerne wieder in 32Bit haben.

(Geht nur darum, da ich die Daten via Internet rumschicke will ich die etwas verkleinern, bzip kommt dann auch noch zum einsatz. Aber anzeigen, möchte ich der Umstände wegen, mit 32Bit.. also ich weiß, dass die Qualität damit "im Eimer" ist.)

Hier mal ein Versuch von mir, funktioniert bloß nicht:

Code:
#Macro vrgb(rgb16, rgb32)
  Asm
    mov eax, dword PTR [rgb16]
    Shl eax, 11
    Xor cx, ax

    mov eax, dword PTR [rgb16]
    Shl eax, 19
    xor ch, ah
   
    mov eax, dword PTR [rgb16]
    Shl eax, 27
    Xor cl, al

    mov dword PTR [rgb32], ecx
  END ASM
#EndMacro


Hab versucht den Kanal an die richtige stelle zu bekommen und es in ecx zusammen zuführen.

Danke schonmal.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 10.07.2013, 20:34    Titel: Antworten mit Zitat

Ich weiß nicht genau wie die Bits genau aufgeteilt sind für die beiden Formate; ich hab einfach 5-6-5 für RGB16 und 8-8-8 für RGB24 angenommen

Sicher nicht optimal, aber sollte funktionieren:
Code:
   xor ecx, ecx
   mov eax, dword PTR [rgb16]
   or cx, ax
   shr ecx, 11
   shl ecx, 19
   or cx, ax
   and cx, 2016
   shl cx, 5
   or cl, al
   shl cl, 3
   mov dword Ptr [rgb32], ecx

Ich frage mich allerdings, warums unbedingt Assembler sein muss?
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 10.07.2013, 21:02    Titel: Antworten mit Zitat

Funktioniert, dankeschön lächeln

Weil also, ich probiere gerade etwas rum und möchte ein Videoformat + Streamingprotokoll entwickeln. Ich fand das Flashmediazeug irgendwie, naja und wollte mal sehen wie weit ich komme.

Es "funktioniert" auch schon:



Rechts ist der Stream, es ist verlustfreie Kompression und zu langsam. Man sieht aber dass das Bild in Rechtecken übertragen wurde.. immer 20*20 Pixel wenn sich das Rechteckt zu sehr verändert hatte. Ok, hatte jetzt nix mit der Frage zu tun, aber war schon etwas stolz als das Bild wieder ausm Netz an kam grinsen Also, weil es schon langsam genug ist, will ich halt die ganze Komprimierungssache quasi on the fly erledigen und hab deswegen den Macro^^ vom Link verwendet.

Der Einheitlichkeit wegen, will ich es dann auch mit so einem Macro wieder zurück konvertieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.07.2013, 10:58    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
Ich frage mich allerdings, warums unbedingt Assembler sein muss?
Wie immer 'einfach und schnell'.
Code:
#Macro Col16to24(rgb16, rgb32)
Asm
  mov eax, dword Ptr [rgb16]
  xor ecx, ecx
  mov cx, ax    '                RRRRRGGGGGGBBBBB
  ror ecx, 5    'BBBBB0000000000000000RRRRRGGGGGG
  shl cx, 2     'BBBBB00000000000000RRRRRGGGGGG00
  ror ecx, 8    'GGGGGG00BBBBB00000000000000RRRRR
  shl cx, 3     'GGGGGG00BBBBB00000000000RRRRR000
  ror ecx, 16   '00000000RRRRR000GGGGGG00BBBBB000
  mov dword Ptr [rgb32], ecx
End Asm
#EndMacro

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 11.07.2013, 11:22    Titel: Antworten mit Zitat

Wobei mein Code allerdings (zumindest auf diesem Prozessor hier) schneller ist: Zunge rausstrecken

Code:
#Macro Col16to24stw(rgb16, rgb32)
Asm
   xor ecx, ecx
   mov eax, dword PTR [rgb16]
   or cx, ax
   shr ecx, 11
   shl ecx, 19
   or cx, ax
   and cx, 2016
   shl cx, 5
   or cl, al
   shl cl, 3
   mov dword Ptr [rgb32], ecx
End Asm
#EndMacro

#Macro Col16to24volta(rgb16, rgb32)
Asm
  mov eax, dword Ptr [rgb16]
  xor ecx, ecx
  mov cx, ax    '                RRRRRGGGGGGBBBBB
  ror ecx, 5    'BBBBB0000000000000000RRRRRGGGGGG
  shl cx, 2     'BBBBB00000000000000RRRRRGGGGGG00
  ror ecx, 8    'GGGGGG00BBBBB00000000000000RRRRR
  shl cx, 3     'GGGGGG00BBBBB00000000000RRRRR000
  ror ecx, 16   '00000000RRRRR000GGGGGG00BBBBB000
  mov dword Ptr [rgb32], ecx
End Asm
#EndMacro


Dim result As Integer = 0
Dim value As Integer = Rnd*&HFFFF
Dim As Double start, ende

start = Timer
For q As Integer = 0 To 100000000
   Col16to24volta(value, result)
Next
ende = Timer
Print "Volta: "; ende-start

start = Timer
For q As Integer = 0 To 100000000
   Col16to24stw(value, result)
Next
ende = Timer
Print "St_W: "; ende-start

Sleep

Output:
Code:
Volta:  0.4015342397815402
St_W:  0.288913373115065

Ist das nur hier zufällig so (Intel i5 M540; Win7 Enterprise SP1 x64) oder kann man das logisch erklären?
Ich hab nämlich den obigen Code eigentlich ursprünglich überhaupt nicht auf Geschwindigkeit ausgelegt und bei meinen "Optimierungsversuchen" im Zuge dieses Tests wurde es eigentlich nur langsamer.

Obwohl das alles ja wohl sowieso nicht optimal ist - die GPU oder eine andere Form paralleler Verarbeitung wär da viel besser geeignet denk ich lächeln
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.07.2013, 11:47    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
Wobei mein Code allerdings (zumindest auf diesem Prozessor hier) schneller ist: Zunge rausstrecken
mit den Augen rollen
Ist das nur hier zufällig so? Nein

Ändere mal die Reihenfolge in der Ausführung der Macros.
Immer ist das erste Macro langsamer.

kann man das logisch erklären? Ich leider nicht!

Mit diesemTest kann man also nicht den schnelleren Code ermitteln!
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 11.07.2013, 12:20    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
Immer ist das erste Macro langsamer.


Bei mir ist in beiden Reihenfolgen immer Voltas Makro etwas schneller.

Testsystem:
Code:
ssteiner@esprimoe910:~$ uname -a
Linux esprimoe910 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux

ssteiner@esprimoe910:~$ cat /proc/cpuinfo
...
model name   : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
...


Beispielwerte:
Code:
Erst Volta, dann St_W:
Volta:  0.2012820243835449
St_W:  0.2106640338897705

Erst St_W, dann Volta:
St_W:  0.2107250690460205
Volta:  0.2027859687805176


Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 11.07.2013, 12:33    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
kann man das logisch erklären? Ich leider nicht!

Um nicht von allen möglich Störfaktoren beeinflusst zu werdne, solltet ihr bei Messungen im Millisekundenbereich schon QueryPerformanceCounter verwenden.
http://forums.codeguru.com/showthread.php?291294-C-Profiling-How-do-I-determine-the-speed-of-a-particular-function-or-operation
So wie im zweiten Post. Das jeweils vor/nach einem Makro-Block, nicht um die gesamte Schleife.
Evtl noch eine Sekunde nach Programmstart warten, um Windows das Fenster zeichnen zu lassen, etc.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 11.07.2013, 12:43    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
Ändere mal die Reihenfolge in der Ausführung der Macros.
Immer ist das erste Macro langsamer.
Kann ich hier zwar nicht nachvollziehen, aber du wirst recht haben, dass der Test ziemlich ungeeignet ist. Hat mich auch ehrlich gesagt ziemlich gewundert als ich das Ergebnis gesehen hab, weil mein Code - wie beim ersten Mal erwähnt - sicher nicht optimal ist.
Die Ergebnisse bleiben allerdings hier relativ konstant:
Code:
St_W:  0.2927852396587696
Volta:  0.3824216853699909

Code:
St_W:  0.3021239143163257
Volta:  0.3920561698232632
St_W:  0.2914216780773131
Volta:  0.3940332328111253
St_W:  0.2826908317601919
St_W:  0.2858543756756262
St_W:  0.281387647793963
St_W:  0.2799811330078228
St_W:  0.2909666172563448
St_W:  0.2954767035589612
St_W:  0.2839445790232276
St_W:  0.2810934588760574
St_W:  0.284517558540756
St_W:  0.2826422054931754
Volta:  0.3871404594065098
Volta:  0.3844417015625368
Volta:  0.3822652708768146
Volta:  0.3858628042271448
Volta:  0.3900138665903796
Volta:  0.3837106866758404
Volta:  0.3939521890333708
Volta:  0.4012923241007229
Volta:  0.3870294294265477
Volta:  0.4084488950084051
Scheint also sehr stark vom Betriebssystem und Prozessor abhängig zu sein (was ja bei Assembler ja nicht unerwartet kommt).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.07.2013, 13:51    Titel: Antworten mit Zitat

Leider bleibt es bei mir dabei, daß es meist von der Reihenfolge abhängt welcher Code schneller ist. Es streut aber etwas so 8 : 2.
Also nicht so eindeutig wie bei St_W oder Sebastian.
Die Messung über QueryPerformanceCounter ändert daran auch wenig.

Ist aber auch kein Beinbruch wenn eines der Macros ein paar Nanosekunden langsamer ist grinsen

Nachtrag:
Jojo der Fuchs grinsen hatte den entscheidenden Tip (nicht QueryPerformanceCounter)
Zitat:
Evtl noch eine Sekunde nach Programmstart warten, um Windows das Fenster zeichnen zu lassen, etc.
genau so bleibt das Ergebnis in kleinen Grenzen sehr konstant.
Ja, und ein Makro in FB ist garnicht so schlecht:
Code:
# include "windows.bi"
#Macro Col16to24stw(rgb16, rgb32)
Asm
  Xor ecx, ecx
  mov eax, dword Ptr [rgb16]
  Or cx, ax
  Shr ecx, 11
  Shl ecx, 19
  Or cx, ax
  And cx, 2016
  Shl cx, 5
  Or cl, al
  Shl cl, 3
  mov dword Ptr [rgb32], ecx
End Asm
#EndMacro

#Macro Col16to24volta(rgb16, rgb32)
Asm
  mov eax, dword Ptr [rgb16]
  Xor ecx, ecx
  mov cx, ax    '                RRRRRGGGGGGBBBBB
  ror ecx, 5    'BBBBB0000000000000000RRRRRGGGGGG
  Shl cx, 2     'BBBBB00000000000000RRRRRGGGGGG00
  ror ecx, 8    'GGGGGG00BBBBB00000000000000RRRRR
  Shl cx, 3     'GGGGGG00BBBBB00000000000RRRRR000
  ror ecx, 16   '00000000RRRRR000GGGGGG00BBBBB000
  mov dword Ptr [rgb32], ecx
End Asm
#EndMacro

#Macro Col16to24fb(rgb16, rgb32)
rgb32 = ((rgb16 And &HF800) Shl 8) Or _
        ((rgb16 And &H7E0) Shl 5) Or _
        ((rgb16 And &H1F) Shl 3)
#EndMacro

Dim result As Integer
Dim value As Integer = Rnd*&HFFFF
Dim As LongInt Frequenz,Start,Ende,Test
QueryPerformanceFrequency(Cast(LARGE_INTEGER Ptr,@Frequenz))
Sleep 500

QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Start))
For x As Integer =0 To 2000000
Next
QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Ende))
Test=Ende-Start
Print "Test:   ";:Print Test * 1000 / Frequenz

QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Start))
For x As Integer =0 To 2000000
  Col16to24volta(value, result)
Next
QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Ende))
Print "Volta:  ";:Print (Ende-Start-Test) * 1000 / Frequenz

QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Start))
For x As Integer =0 To 2000000
  Col16to24stw(value, result)
Next
QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Ende))
Print "St_W:   ";:Print (Ende-Start-Test) * 1000 / Frequenz

QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Start))
For x As Integer =0 To 2000000
  Col16to24fb(value, result)
Next
QueryPerformanceCounter(Cast(LARGE_INTEGER Ptr,@Ende))
Print "FBasic: ";:Print (Ende-Start-Test) * 1000 / Frequenz

Sleep

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz