 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 10.07.2013, 19:02 Titel: 16 zu 24 Bit Farbe |
|
|
Moin
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 10.07.2013, 20:34 Titel: |
|
|
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 |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 10.07.2013, 21:02 Titel: |
|
|
Funktioniert, dankeschön
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 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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.07.2013, 10:58 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 11.07.2013, 11:22 Titel: |
|
|
Wobei mein Code allerdings (zumindest auf diesem Prozessor hier) schneller ist:
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  _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.07.2013, 11:47 Titel: |
|
|
St_W hat Folgendes geschrieben: | Wobei mein Code allerdings (zumindest auf diesem Prozessor hier) schneller ist:
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 11.07.2013, 12:20 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 11.07.2013, 12:33 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 11.07.2013, 12:43 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.07.2013, 13:51 Titel: |
|
|
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
Nachtrag:
Jojo der Fuchs 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 |
|
 |
|
|
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.
|
|