|
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 |
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.03.2015, 00:24 Titel: ASM Blur |
|
|
Auf der Suche nach einer Schnelleren Blur-Routine fand ich ein ASM Code den ich zumindest schon mal versucht habe in FB zu setzen, klappt allerdings noch nicht so ganz und könnte etwas hilfe brauchen
Quelle zum Original im Code
Code: |
'' QUELLE: https://github.com/mertsalik/image-processing-using-intel-assembly/blob/master/src/blur.asm
'' Author: mertsalik
'' mail: salik@itu.edu.tr
'' blur() is an antialiasing filter normally applied before shrink(). The image is divided into 2 by 2
'' blocks. The 4 pixels in each block are replaced with the average of those 4 pixels (rounding up or
'' down as you choose).
'' PROTOTYPE
SUB blur(byref image as any ptr, byval iWidth as Integer, byval iHeight as Integer)
'void blur(unsigned char *image, int width, int height);
'' STACK
'' | ebp |
'' | return address|
'' | i1 |
'' | w |
'' | h |
'segment .text
'global blur
ASM
'blur:
push ebp
mov ebp, esp
push esi '' store esi in stack
push ebx '' store ebx in stack
mov esi, dword [ebp+16] '' height in esi
mov esp, [ebp+8] '' the address of image is in esp
looph:
dec esi '' decrement i
dec esi '' decrement i
mov ecx, dword [ebp+12] '' width
loopw:
dec ecx '' decrement j
dec ecx '' decrement j
xor eax, eax '' clean eax register
xor ebx, ebx '' clean ebx register
xor edx, edx '' clean edx register
mov al, byte [esp] '' get 0. pixel in al
inc esp '' next pixel
mov bl, byte [esp] '' get 1. pixel in bl
add ax, bx '' add them in ax
dec esp
add esp, dword [ebp+12] '' go to next line (i+width)
mov bl, byte [esp] '' get 2. pixel in bl
inc esp '' next pixel
mov dl, byte [esp] '' get 3. pixel in dl
add bx, dx '' add them in bx
add ax, bx '' sum of all pixels in ax
shr eax, 2 '' shift right two times (divide 4)
mov byte [esp], al '' store 3. pixel
dec esp
mov byte [esp], al '' store 2. pixel
sub esp, dword [ebp+12]
mov byte [esp], al '' store 0. pixel
inc esp
mov byte [esp], al '' store 1. pixel
inc esp '' next pixel of image
cmp ecx, 0 '' if j!=0
jne loopw '' iterate in loopw
''-- end of loopw--''
add esp, dword [ebp+12] '' have to move image index current + width
cmp esi, 0 '' if i!=0
jne looph '' iterate in looph
''-- end of looph--''
pop ebx '' get back ebx from stack
pop esi '' get back esi from stack
mov esp, ebp
pop ebp
ret
END ASM
END SUB
|
_________________
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 22.03.2015, 14:54 Titel: |
|
|
Hallo Eternal_pain!
Ohne Gewähr, weil nicht getestet, würde ich diese Lösung vorschlagen: Code: | Sub blur(image As Byte Ptr, iWidth As Integer, iHeight As Integer)
Dim As Integer lin, col
Dim As Short erg
Dim As Byte Ptr pxptr
For col = 0 To iHeight - 1 Step 2
For lin = 0 To iWidth - 1 Step 2
pxptr = Cast(Byte Ptr,image + lin + iWidth * col)
erg = (*pxptr + *(pxptr + 1) + *(pxptr + iWidth) + *(pxptr + 1 + iWidth)) / 4
*pxptr = Cast(Byte,erg)
*(pxptr + 1) = Cast(Byte,erg)
*(pxptr + iWidth) = Cast(Byte,erg)
*(pxptr + 1 + iWidth) = Cast(Byte,erg)
Next
Next
End Sub |
Obwohl ich - außer der besseren Lesbarkeit - keinen Grund sehe, die Assemblerroutine nicht direkt in das FB-Programm einzubauen.
EDIT: Oder habe ich dich falsch verstanden, daß die Assemblerroutine selbst nicht läuft. Das könnte am "Any Ptr" im Prozeduraufruf liegen. Vielleicht mal mit "Byte Ptr" versuchen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.03.2015, 15:35 Titel: |
|
|
Ich habe ja bereits verschiedene Blur Routinen selbst gebastelt, die auch soweit gut funktionieren, doch allesamt sehr langsam sind... daher hatte mich diese ASM Routine interessiert... allerdings (wie glaube auch in deinem Beispiel) wollte ich zum einen gern die adressen entsprechend eines FB-Image anpassen zum anderen verstehe ich vorallem den teil mit den stack nicht so recht... wie wird da alles in FB richtig in der Funktion/Sub übergeben...
Code: |
'' STACK
'' | ebp |
'' | return address|
'' | i1 |
'' | w |
'' | h |
'segment .text
'global blur
ASM
'blur:
push ebp
mov ebp, esp
push esi '' store esi in stack
push ebx '' store ebx in stack
mov esi, dword [ebp+16] '' height in esi
mov esp, [ebp+8] '' the address of image is in esp
|
hier ist zum Beispiel eine mit der ich grad rum-bastel.. (weiß grad nicht ob ich wegen der bastelei noch fehler drin habe aber soweit im beispiel funktionierts...
Code: | Sub ScreenSoft()
static as Integer scrWidth, scrHeight, scrPitch
static as integer ptr scradr
Static as Integer red, green, blue
static as integer ptr bufadr
static as integer bufpitch
static as Integer pix(0 to 4)
static as any ptr bufscr
if bufscr=0 then
ScreenInfo scrWidth, scrHeight,,,scrPitch
scrPitch \= 4
scradr = screenptr
bufscr = imagecreate(scrWidth,scrHeight)
imageinfo bufscr,,,,bufpitch,bufadr
bufpitch \= 4
end if
For y as Integer = 0 to scrHeight - 1
For x as Integer = 0 to scrWidth -1
red = 0 : green = 0 : blue = 0
pix(0) = scradr[x + (y*scrPitch)]
'if pix(0) and &h00FFFFFF Then
If (y > -1) andalso (x > 0) Then pix(1) = scradr[(x-1) + (y*scrPitch)] Else pix(1) = 0 'left
If (y > 0) andalso (x > -1) Then pix(2) = scradr[x + ((y-1)*scrPitch)] Else pix(2) = 0 'up middle
If (y > -1) andalso (x < scrWidth-1) Then pix(3) = scradr[(x+1) + (y*scrPitch)] Else pix(3) = 0 'right
If (y < scrHeight-1) andalso (x > -1) Then pix(4) = scradr[x + ((y+1)*scrPitch)] Else pix(4) = 0 'down middle
For l as Integer = 0 to 4
red += lobyte(hiword(pix(l)))
green += hibyte(loword(pix(l)))
blue += lobyte(loword(pix(l)))
Next l
red shr = 3 'red \= 5
green shr = 3 'green \= 5
blue shr = 3 'blue \= 5
bufadr[x + (y*bufPitch)] = rgb(red,green,blue)
'pset bufscr,(x,y),rgb(red,green,blue)
'else
' pset bufscr,(x,y),pix(0)
'end if
Next x
Next y
put(0,0),bufscr,pset
'imagedestroy(bufscr)
End Sub |
Edit:
http://www.freebasic-portal.de/porticula/blurpoint-bas-1796.html
Das ganze war mal eine Spielerei für ein Screensaver, sieht alles in allem recht schick aus... auf meinem Desktop packt das ganze allerdings nur ~10 FPS auf meinem kleinen Lappi ~4FPS und das ist halt recht langsam _________________
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 22.03.2015, 18:17 Titel: |
|
|
Wie der Stack verwendet wird, kannst du in der Referenz unter "Cdecl" nachlesen: Alle beim Aufruf übergebenen Parameter werden -von rechts nach links, also der hinterste zuerst- auf den Stack gelegt, anschließend kommt noch die Rücksprungadresse obendrauf.
Von der Assemblerroutine werden dann noch einige Registerinhalte oben draufgepackt, die am Ende wieder heruntergenommen werden müssen, sonst gibt es Chaos. Um alles andere kümmert sich der FB-Compiler.
Diese Assemblerroutine eignet sich allerdings in nur für 8 bit - Graustufen - Bitmaps, da jedes Pixel nur mit einem einzigen Byte beschrieben wird. Sie müsste noch auf die von dir verwendete Farbtiefe angepasst werden. In Punkto Geschwindigkeit dürfte sie dann aber kaum zu schlagen sein.
Bei 32 bit Farbtiefe funktioniert die Routine vielleicht, wenn du die mit Sternchen versehenen Zeilen einfügst: Code: | 'blur:
push ebp
mov ebp, esp
push esi '' store esi in stack
push ebx '' store ebx in stack
mov esi, dword [ebp+12] '' *** width in esi
Shl esi, 2 '' *** width * 4
mov dword [ebp+12], esi '' *** write back width
mov esi, dword [ebp+16] '' height in esi
mov esp, [ebp+8] '' the address of image is in esp
looph:
dec esi '' decrement i
dec esi '' decrement i | Der Alphakanal wird dabei zwar ebenfalls "geblurt", aber das dürfte wohl keine Probleme bereiten.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.03.2015, 20:38 Titel: |
|
|
grindstone hat Folgendes geschrieben: | In Punkto Geschwindigkeit dürfte sie dann aber kaum zu schlagen sein. |
Und wie das zu schlagen ist, und zwar mit SIMD-Instruktionen. Volta hat vor zig Jahren mal eine MMX-Blur-Routine gepostet. Der Vorteil ist halt, dass mit einer Instruktion gleich mehrere Pixel auf einmal bearbeitet werden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 22.03.2015, 22:14 Titel: |
|
|
Du machst mich neugierig! Meine Assemblererfahrungen beschränken sich im wesentlichen auf AVR-Controller (und 6502, aber das ist schon lange her). Sind die entsprechenden Funktionen von FB aus überhaupt zugänglich? Die richtigen Experten nutzen ja sogar die Hardware der Grafikkarte.
Immerhin: Eine Dokumentation zu MMX habe ich gefunden. Die werde ich mir im den nächsten Tagen mal reinziehen...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.03.2015, 22:33 Titel: |
|
|
Die Funktionen sind über den eingebauten Assembler verfügbar, ja. Das ist natürlich nicht so elegant wie in C/C++ mit Intrinsics, aber immerhin ein Anfang. Intrinsics sind Funktionen, die nichts weiteres tun, als einen genau spezifizierten Assemblerbefehl auszugeben. Das PDF, das du da ausgegraben hast, dokumentiert z.B. diese Intrinsics wie _mm_extract_epi16.
Bevor du jetzt dich aber MMX einarbeitest, hol dir lieber direkt die Dokumentation zu SSE2, das ist wesentlich nützlicher und wird ebenfalls von jedem halbwegs modernen Rechner unterstützt (x64 hat garantiert SSE2-Support, und fast jede x86-CPU seit dem Pentium 4 hat auch SSE2). SSE hat den Vorteil, dass die Register doppelt so breit sind (128 statt 64 bit), also doppelt so viele Pixel (Audiosamples, Textzeichen, etc...) gleichzeitig verarbeitet können, und insgesamt ist das Instruction Set einfach viel nützlicher als das von MMX. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 24.03.2015, 00:07 Titel: |
|
|
es war einmal in einer anderen Galaxy ...........
ach, Eternel hat das damals selbst ins Freebasic-Portal übertragen
http://www.freebasic-portal.de/code-beispiele/sonstiges/fader-in-asm-mmx-26.html _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 25.03.2015, 12:18 Titel: |
|
|
Kann es sein, daß der FB - Compiler bei geeignetem Quellcode von sich aus die MMX/SSE - Befehle verwendet? Als ich nämlich vor einiger Zeit ein Programm zum Normalisieren von Audiodateien von Code: | Function ampfloat (g As String) As String
Dim As Integer y
Dim As single links, rechts
Dim As String rueck
rueck = ""
For y = 1 To Len(g) Step 8
rechts = Cvs(Mid$(g,y,4)) * verst
rueck += Mks(rechts)
links = Cvs(Mid$(g,y+4,4)) * verst
rueck += Mks(links)
Next
Return rueck
End Function | auf Code: | Function ampfloat (ByRef g As String) As String
Dim As Single Ptr gp
For gp = Cast(Single Ptr,StrPtr(g)) To Cast(Single Ptr,StrPtr(g) + Len(g) - 1)
*gp *= verst
Next
Return g
End Function | umgestellt habe, hat sich die Geschwindigkeit fast verzehnfacht. Das Normalisieren dauert damit nur etwa 5% länger als reines Umkopieren.
Möglicherweise wäre das ja auch ein geeigneter Ansatz für eine schnelle "blur"-Funktion.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 25.03.2015, 16:06 Titel: SIMD Befehle |
|
|
Eventuell kannst du das ganze extrem Beschleunigen, indem du SSE2/SSE3 SIMD Befehle verwendest.
mit diesen beiden Instruktionen 4 mal in Folge ausgeführt müssten die durschnittswere für 4 bis 5 Pixel auf einmal berechnet werden können. Vorher und nachher müssten dann noch ein paar MOV befehle gemacht werden und der Puffer für die Bilddaten muss natürlich aligned sein.
PAVGB xmm1, xmm2/m128
PSHUFB xmm1, xmm2/m128 |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.03.2015, 17:38 Titel: |
|
|
grindstone: Das liegt eher daran, dass eine String-Extraktion einfach saulangsam ist. FB erzeugt zumindest stadandardmäßig Code, der auch auf einem 486er noch läuft, also kein SSE. Ob es spezielle Codepfade für ausgewählte Funktionen mit SSE gibt (in der C/C++-Standardbibliothek gibt es das oft für so Funktionen wie sin/cos/pow/...) weiß ich nicht. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 25.03.2015, 17:52 Titel: |
|
|
Mein Post hat sich auf die Blur Funktion bezogen, die ja immer den Durchschnitswert von 4 Pixel * 3 Farben (Bytes)bzw. 4 Bytes mit Alphachannel berechnet. D.h 4 * 4 bytes das sind 16 bytes.
Mit wenigen Instruktionen auf den xmm registern, müsste es möglich sein die Durchschnittswerte von 4 Pixel parallel zu berechnen. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 25.03.2015, 20:45 Titel: |
|
|
Hi,
in FB wird in der gfxlib2 MMX angewandt (z.B. "fb_gfx_mmx.s")
Bei der Compiler-Option "-fpu SSE" werden SSE2-Assembleranweisungen zur Berechnungen von SINGLE- und DOUBLE-Variablen benutzt.
Es wird jeweils vorher geprüft ob die CPU das mitmacht.
@RockTheSchock
zum schnellen Datentransport sind SSE/SSE2 Befehle sehr gut
aber
MMX hat in der Pixelbearbeitung noch Vorteile. Ein Pixel (4 Byte) läst sich einfach in 4 Words expandieren (und packen).
Damit sind dann Additionen (auch +-*/) ohne Überlauf machbar. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.03.2015, 07:33 Titel: |
|
|
Das Fading-Beispiel hatte ich auch schon gesucht gehabt, hatte es aber unter 'Grafik und Fonts' gesucht und entsprechend nicht gefunden
habe da dann noch das hier http://datab.us/V5oupL86Kcw#x64%20Assembly%20and%20C++%20Tutorial%2064:%20Calling%20BoxBlurASM
und noch einen anderen MMX ASM Code (Leider auch mit magerer Beschreibung) gefunden
Werde mir am Wochenende mal alles genauer ansehen und gucken was ich daraus gebastelt bekomme... habe unter der Woche leider nicht so viel Zeit
Danke schon einmal im vorraus _________________
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 26.03.2015, 18:09 Titel: |
|
|
Mit der Option "-fpu SSE" zeigt der Compiler ein seltsames Verhalten:
Die Zeile Code: | sollwertfloat = Abs(Val(g)) * -1 | erzeugt die Fehlermeldung "Aborting due to runtime error 12 ("segmentation violation" signal)" während Code: | sollwertfloat = Abs(Val(g)) * -2 | fehlerfrei compiliert wird, und auch der Workaround Code: | sollwertfloat = Abs(Val(g))
sollwertfloat = 0 - sollwertfloat | funktioniert einwandfrei.
Ist das ein Bug oder prinzipbedingt?
Auf die Ausführungsgeschwindigkeit hat "-fpu SSE" übrigens keinen Einfluss, obwohl eindeutig Single-Multiplikation.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.03.2015, 18:20 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Auf die Ausführungsgeschwindigkeit hat "-fpu SSE" übrigens keinen Einfluss, obwohl eindeutig Single-Multiplikation. |
Doch, hat es, oder kann es haben, muss aber nicht in jedem Beispiel offensichtlich sein. Wenn man auf dem Level Code optimiert, sollte man aber auch ein gewisses Verständnis von den Innereien einer modernen CPU mitbringen, sonst wird es nicht klar, warum manche Dinge schneller laufen und manche nicht.
Wenn der Code mit -fpu SSE crasht, kann es auch sein, dass der Emitter defekt ist. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 26.03.2015, 20:23 Titel: |
|
|
@grindstone
welche FB Version benutzt du?
Code: | 'fbc -s console -fpu SSE
?__FB_VERSION__ '1.01.0
Dim As Single s
Dim As Double d
Dim As Integer i
Dim As String g ="64.38 €", gn =" "
s = Abs(Val(g)) * -1
?s
s = Abs(Val(gn)) * -1
?s
d = Abs(Val(g)) * -1
?d
d = Abs(Val(gn)) * -1
?d
i = Abs(Val(g)) * -1
?i
i = Abs(Val(gn)) * -1
?i
?
d = -Abs(Val(g))
?d
Sleep |
mit FB 1.01.0 keine Probleme.
Workaround : sollwertfloat = -Abs(Val(g)) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 27.03.2015, 12:45 Titel: |
|
|
Bei mir tritt der Fehler sowohl mit 1.01.0 als auch mit 0.90.1 auf. Die Ursache steckt aber irgendwo anders im Quellcode. Wenn ich die Zeilen Code: | Dim As String g = "18"
Dim As Single sollwertfloat
sollwertfloat = Abs(Val(g)) * -1 | für sich alleine compiliere, gibt es keine Fehlermeldung. Es wird wohl kein "richtiger" Fehler sein, sondern nur eine unglückliche Konstellation. Was genau, wird wohl auf ewig ein Mysterium bleiben...
volta hat Folgendes geschrieben: | Workaround : sollwertfloat = -Abs(Val(g)) mit den Augen rollen | Wie soll man denn auch auf so etwas kommen? Das ist doch viel zu einfach!
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.03.2015, 08:50 Titel: |
|
|
Mein eigenen Code konnte ich noch ein klein wenig optimieren und erreiche damit nun ca ~16FPS auf dem Desktop-PC
Code: |
Sub ScreenSoft()
static as Integer scrWidth, scrHeight, scrPitch
static as integer ptr scradr
Static as Integer red, green, blue
static as Integer pix(0 to 3)
Static as Byte XR, YD
If scrPitch=0 Then
ScreenInfo scrWidth, scrHeight,,,scrPitch
scrPitch shr = 2
scradr = screenptr
scrWidth -= 1 : scrHeight -= 1
End If
For y as Integer = 0 to scrHeight
If (y < scrHeight) Then YD=1 Else YD = 0 : pix(2) = 0 : pix(3) = 0
For x as Integer = 0 to scrWidth
red = 0 : green = 0 : blue = 0
pix(0) = scradr[x + (y*scrPitch)]
If (x < scrWidth ) Then XR=1 Else XR = 0 : pix(1) = 0 : pix(3) = 0
If XR Then pix(1) = scradr[(x+1) + (y*scrPitch)]
If YD Then
pix(2) = scradr[(x ) + ((y+1)*scrPitch)]
If XR Then pix(3) = scradr[(x+1) + ((y+1)*scrPitch)]
End If
For l as Integer = 0 to 3
red += lobyte(hiword(pix(l)))
green += hibyte(loword(pix(l)))
blue += lobyte(loword(pix(l)))
Next l
red shr = 2
green shr = 2
blue shr = 2
scradr[x + (y*scrPitch)] = rgb(red,green,blue)
Next x
Next y
End Sub
|
Habe den dann einfach mal durch Voltas MMX-Fader ausgetauscht... und erstaunliche ~65FPS erzielt.
Allerdings gibt es einen nicht sehr schönen Rand bei dem ich noch nicht sicher bin wie ich den 'beheben' kann
_________________
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 28.03.2015, 11:39 Titel: |
|
|
Welche Größe hat dein Testbild? Ich komme bei 1280 x 1024 Pixel auf 13 bzw. 50 FPS -ohne Rand.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
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.
|
|