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:

ASM Blur
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.03.2015, 23:24    Titel: ASM Blur Antworten mit Zitat

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 22.03.2015, 13:54    Titel: Antworten mit Zitat

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. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 22.03.2015, 14:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 22.03.2015, 17:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 22.03.2015, 19:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 22.03.2015, 21:14    Titel: Antworten mit Zitat

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... lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 22.03.2015, 21:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 23.03.2015, 23:07    Titel: Antworten mit Zitat

es war einmal in einer anderen Galaxy ...........

ach, Eternel hat das damals selbst ins Freebasic-Portal übertragen grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 25.03.2015, 11:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 130

BeitragVerfasst am: 25.03.2015, 15:06    Titel: SIMD Befehle Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 25.03.2015, 16:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 130

BeitragVerfasst am: 25.03.2015, 16:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 25.03.2015, 19:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 26.03.2015, 06:33    Titel: Antworten mit Zitat

Das Fading-Beispiel hatte ich auch schon gesucht gehabt, hatte es aber unter 'Grafik und Fonts' gesucht und entsprechend nicht gefunden zwinkern

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 lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 26.03.2015, 17:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 26.03.2015, 17:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 26.03.2015, 19:23    Titel: Antworten mit Zitat

@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)) mit den Augen rollen
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 27.03.2015, 11:45    Titel: Antworten mit Zitat

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! grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.03.2015, 07:50    Titel: Antworten mit Zitat



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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 830
Wohnort: Ruhrpott

BeitragVerfasst am: 28.03.2015, 10:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
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