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:

Gfx Spielereien
Gehe zu Seite 1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

BeitragVerfasst am: 28.07.2016, 23:33    Titel: Gfx Spielereien Antworten mit Zitat

Hier eine kleine grafische Spielerei mit GDI.

GDI Particles Mouse Attraction:
Code:
'coded by UEZ build 2016-07-28
'idea taken from http://jsdo.it/FumioNonaka/jQcv

#include "windows.bi"
#include "fbgfx.bi"
Using FB

Declare Sub MoveParticles(fX As Single, fY As Single, iPos As ULong, fSpeed As Single)

Type tParticles
   x As Single
   y As Single
   vx As Single
   vy As Single
   friction As Single
   argb As UInteger
End Type

Dim As Integer sW, sH
ScreenInfo(sW, sH)

Dim Shared As Ulong iW, iH, iParticles = 50000
Dim Shared aParticles(0 To iParticles - 1) As tParticles

Sub MoveParticles(fX As Single, fY As Single, iPos As ULong, fSpeed As Single)
   Dim As Single _x, _y, _vx, _vy, fDiffX, fDiffY, fSquare, fRatio, fAccX, fAccY
   _x = aParticles(iPos).x
   _y = aParticles(iPos).y
   _vx = aParticles(iPos).vx
   _vy = aParticles(iPos).vy
   fDiffX = fX - _x
   fDiffY = fY - _y
   fSquare = (fDiffX * fDiffX + fDiffY * fDiffY)
   fRatio = IIf(fSquare > 0, fSpeed / fSquare, 0)
   fAccX = fDiffX * fRatio
   fAccY = fDiffY * fRatio
   _vx += fAccX
   _vy += fAccY
   _vx *= aParticles(iPos).friction
   _vy *= aParticles(iPos).friction
   _x += _vx
   _y += _vy
   If _x < 0 Then _x += iW
   If _x > iW Then _x -= iW
   If _y < 0 Then _y += iH
   If _y > iH Then _y -= iH
   aParticles(iPos).x = _x
   aParticles(iPos).y = _y
   aParticles(iPos).vx = _vx
   aParticles(iPos).vy = _vy
End Sub

iW = Int(sW * 0.95)
iH = Int(sH * 0.9)

ScreenControl FB.SET_DRIVER_NAME, "GDI"
ScreenRes iW, iH, 32

Dim As String sTitle = "GDI Particles Mouse Attraction / Particles: " & iParticles & " / FPS: "
WindowTitle sTitle

Dim as HWND hHWND
ScreenControl(FB.GET_WINDOW_HANDLE, Cast(integer, hHWND))

Dim As HDC hDC = GetDC(hHWND)

Dim As BITMAPV5HEADER tBIV5HDR
tBIV5HDR.bV5Size = SizeOf(BITMAPV5HEADER)
tBIV5HDR.bV5Width = iW
tBIV5HDR.bV5Height = -iH
tBIV5HDR.bV5Planes = 1
tBIV5HDR.bV5BitCount = 32
tBIV5HDR.bV5Compression = BI_RGB
tBIV5HDR.bV5AlphaMask = &hFF000000
tBIV5HDR.bV5RedMask =    &h00FF0000
tBIV5HDR.bV5GreenMask = &h0000FF00
tBIV5HDR.bV5BlueMask =    &h000000FF

Dim As UInteger Ptr aBits
Dim As HBitmap hBitmapGDI
Dim As HDC hGfxDC

hBitmapGDI = CreateDIBSection(hDC, @tBIV5HDR, DIB_RGB_COLORS, @aBits, NULL, NULL)
hGfxDC = CreateCompatibleDC(hDC)
Var hObjOld = SelectObject(hGfxDC, hBitmapGDI)



Dim evt As EVENT
Dim As ULong iFPS = 0, i, iMPx = iW / 2, iMPy = iH / 2, iPos, iMax = iW * iH - 1

Dim fTimer As Double

For i = 0 To iParticles - 1
   aParticles(i).x = Rnd() * iW
   aParticles(i).y = Rnd() * iH
   aParticles(i).friction = 0.975
   aParticles(i).argb = &hFFFFFFFF
Next

fTimer = Timer

Do
   BitBlt(hGfxDC, 0, 0, iW, iH, hGfxDC, 0, 0, BLACKNESS)
   GetMouse(iMPx, iMPy)
   For i = 0 To iParticles - 1
      MoveParticles(iMPx, iMPy, i, 100)
      iPos = Int(aParticles(i).x) + Int(aParticles(i).y) * iW
      If iPos > iMax Then iPos = iMax
      aBits[iPos] = aParticles(i).argb
   Next
   BitBlt(hDC, 0, 0, iW, iH, hGfxDC, 0, 0, SRCCOPY)
   
   If Timer - fTimer > 1.0000 Then
      WindowTitle sTitle & iFPS
      iFPS = 0
      fTimer = Timer
   EndIf
   iFPS += 1
   
   'If GetKey = 27 Then Exit Do
   If (ScreenEvent(@evt)) Then
      If evt.type = EVENT_WINDOW_CLOSE Or evt.type = SC_ESCAPE Then
         SelectObject(hGfxDC, hObjOld)
         ReleaseDC(hHWND, hDC)
         DeleteDC(hGfxDC)
         DeleteObject(hBitmapGDI)
         Exit Do
      EndIf
   EndIf
   Sleep(10)
Loop


Einfach die Maus über der GUI bewegen. happy

Viel Spaß beim Ausprobieren.
_________________
Gruß,
UEZ


Zuletzt bearbeitet von UEZ am 12.10.2016, 10:45, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 30.07.2016, 09:56    Titel: Antworten mit Zitat

Netter Effekt! Aber warum nimmst Du da nicht die FreeBASIC-Bitmap statt der GDI? Damit wäre es Plattform übergreifend.
Die Variable „argb“ würde ich als “uLong“ deklarieren da „uInteger“ unter 64Bit-Systemen 8 Byte Lang ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

BeitragVerfasst am: 30.07.2016, 11:41    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Netter Effekt! Aber warum nimmst Du da nicht die FreeBASIC-Bitmap statt der GDI? Damit wäre es Plattform übergreifend.
Die Variable „argb“ würde ich als “uLong“ deklarieren da „uInteger“ unter 64Bit-Systemen 8 Byte Lang ist.


Danke für dein Feedback.

Dass ich GDI genommen habe, hat einen einfachen Grund. Ich wollte die Ausführungsgeschwindigkeit mit einer anderen ähnlichen Programmiersprache testen und der gemeinsame Nenner war für mich die GDI (WinAPI) Schnittstelle, wobei der Vergleich nicht ganz fair ist.

Abgesehen davon, kenne ich mich nicht gut genug in FB aus, um dass volle Repertoire zu kennen bzw. zu nutzen.

An Plattform übergreifende Kodierung habe ich nicht gedacht...
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 30.07.2016, 14:06    Titel: FreeBASIC als C-Emitter, -gen gcc Kommandozeilenparameter Antworten mit Zitat

Hallo!
UEZ hat Folgendes geschrieben:
Ich wollte die Ausführungsgeschwindigkeit mit einer anderen ähnlichen Programmiersprache testen und der gemeinsame Nenner war für mich die GDI (WinAPI) Schnittstelle, wobei der Vergleich nicht ganz fair ist.

Übrigens: FreeBASIC kann (neben experimentellem LLVM-Support??)

  • einerseits Assembler-Code ausgeben, der anschließend einfach mit dem GNU Assembler as assembliert wird (traditioneller Standard),
  • andererseits C-Code, der dann über ein gcc-Backend compiliert wird (der FreeBASIC-Compiler als C-Emitter). In der C-Backend-Variante stehen verschiedene Optimierungslevels und -optionen des gcc zur Verfügung!


Siehe dazu http://www.freebasic.net/wiki/wikka.php?wakka=CompilerOptgen. Je nach Anwendung könnte sich die Optimierung des gcc in der "gen gcc"-Variante performancemäßig stark bemerkbar machen.

Viele Grüße!
Sebastian
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 30.07.2016, 15:20    Titel: Antworten mit Zitat

Ich hab mal eine Variante aus deinem Programm erstellt das sowohl unter Windows als auch unter Linux Funktionieren sollte.
Code:

'coded by UEZ build 2016-07-28
'idea taken from http://jsdo.it/FumioNonaka/jQcv

'#include "windows.bi"
#include "fbgfx.bi"

Using FB

Declare Sub MoveParticles(fX As Single, fY As Single, iPos As ULong, _
                                                                     fSpeed As Single)

Type tParticles
  x As Single
  y As Single
  vx As Single
  vy As Single
  friction As Single
  argb As uLong
End Type

Dim As Integer sW, sH
   ScreenInfo(sW, sH)

Dim Shared As Ulong iW, iH, iParticles = 50000
Dim Shared aParticles(0 To iParticles - 1) As tParticles

Sub MoveParticles(fX As Single, fY As Single, iPos As ULong, fSpeed As Single)
Dim As Single _x, _y, _vx, _vy, fDiffX, fDiffY, fSquare, fRatio, fAccX, fAccY
  _x = aParticles(iPos).x
  _y = aParticles(iPos).y
  _vx = aParticles(iPos).vx
  _vy = aParticles(iPos).vy
  fDiffX = fX - _x
  fDiffY = fY - _y
  fSquare = (fDiffX * fDiffX + fDiffY * fDiffY)
  fRatio = IIf(fSquare > 0, fSpeed / fSquare, 0)
  fAccX = fDiffX * fRatio
  fAccY = fDiffY * fRatio
  _vx += fAccX
  _vy += fAccY
  _vx *= aParticles(iPos).friction
  _vy *= aParticles(iPos).friction
  _x += _vx
  _y += _vy
  If _x < 0 Then _x += iW
  If _x > iW Then _x -= iW
  If _y < 0 Then _y += iH
  If _y > iH Then _y -= iH
  aParticles(iPos).x = _x
  aParticles(iPos).y = _y
  aParticles(iPos).vx = _vx
  aParticles(iPos).vy = _vy
End Sub

  iW = Int(sW * 0.95)
  iH = Int(sH * 0.9)

  'ScreenControl FB.SET_DRIVER_NAME, "GDI"
  ScreenRes (iW, iH, 32)

Dim As String sTitle = "GDI Particles Mouse Attraction / Particles: " & iParticles & " / FPS: "
  'WindowTitle sTitle

Dim As IMAGE Ptr tBIV5HDR
  tBIV5HDR= ImageCreate (iW, iH, 0, 32)

Dim evt As EVENT
Dim As ULong iFPS = 0, i, iMPx = iW / 2, iMPy = iH / 2', iPos, iMax = iW * iH - 1
Dim fTimer As Double

  For i = 0 To iParticles - 1
    aParticles(i).x = Rnd() * iW
    aParticles(i).y = Rnd() * iH
    aParticles(i).friction = 0.975
    aParticles(i).argb = &hFFFFFFFF
  Next i

  fTimer= Timer ()

Dim As Integer Size
Dim As uByte Ptr aBits

  ImageInfo (tBIV5HDR,,,,, aBits, Size)
  Size= Size- SizeOf (IMAGE)

Do
  Clear (*aBits, 0, Size)
'  GetMouse (iMPx, iMPy)
  For i= 0 To iParticles - 1
    MoveParticles(iMPx, iMPy, i, 100)
    PSet tBIV5HDR, (aParticles(i).x, aParticles(i).y), aParticles(i).argb
  Next i
  Put (0, 0), tBIV5HDR, PSet
   
  If Timer - fTimer > 1.0000 Then
    WindowTitle sTitle & iFPS
    iFPS = 0
    fTimer = Timer
  EndIf
  iFPS += 1
   
  If ScreenEvent(@evt) Then
    Select Case evt.Type
      Case EVENT_MOUSE_MOVE
        iMPx= evt.x: iMPy= evt.y
      Case SC_ESCAPE, EVENT_WINDOW_CLOSE
        ImageDestroy (tBIV5HDR)
        Exit Do
    End Select
  EndIf
  Sleep(1)
Loop


Es ist aber nicht gerade die schnellste Variante weil ich hier mit „PSET“ in die Bitmap schreibe. Es soll dir ja aber auch nur zeigen wie es gehen könnte. Ich hab jetzt nichts Kommentiert, schau dir mal ImageCreate, ImageInfo und ImageDestroy an. Du hast also auch hier direkten zugriff auf die Pixel Daten was die FPS um mehr als 100% erhöht (Linux 64Bit). Ob es unter Windows auch so gut Funktioniert hab ich allerdings nicht getestet.
Ach ja, da Du mit „ScreenEvent“ Arbeitest, kannst Du auf diese Ewige „GetMaouse“ abfrage verzichten und dieses Ereignis in deiner „If ScreenEvent ())“ abfragen (siehe mein Beispiel (EVENT_MOUSE_MOVE)).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

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

@Sebastian: vielen Dank für die Tipps! Daumen rauf!


@Elor: ich bin mit Linux nicht so vertraut, aber ich werde mal FB unter Linux (VM) installieren.
Um den Code als x64 laufen zu lassen, reicht es, die 64-bit Variante von FB zu nutzen?

Wie läuft denn die FB Bitmap Variante unter der Haupe? Sieht auch aus wie die GDI Variante.

Das Mausverhalten durch Case EVENT_MOUSE_MOVE zu steuern war mir nicht bekannt.

Danke für dein Feedback. Daumen rauf!
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4212
Wohnort: ~/

BeitragVerfasst am: 30.07.2016, 21:43    Titel: Antworten mit Zitat

Um ein x64-Programm zu erstellen benötigst du lediglich die x64-Version des Compilers (in einem x64-Betriebssystem versteht sich happy ) und die zugehörigen x64-Bibliotheken. Wenn du ein 64bit-Linux aufsetzt, werden dir sowieso zuerst einmal die 64bit-Bibliotheken angeboten und du müsstest dem Paketmanager gesondert mitteilen, wenn du 32bit-Bibliotheken haben willst; von daher ist das also kein Problem. Schau auf jeden Fall im FB-Downloadpaket in die Readme; da steht drin, welche Bibliotheken du brauchst.

Für den internen Aufbau eines Images empfehle ich https://www.freebasic-portal.de/befehlsreferenz/interne-pixelformate-464.html. Da sind auch kurze Beispiele für den direkten Speicherzugriff.
Viel Lesestoff, aber interessant ist erst einmal nur "Version 2 (aktuell)"; die "Version 1 (veraltet)" ist nur wichtig, wenn man mit alten QB-Images arbeiten will.

Hier auch nochmal alle Möglichkeiten für SCREENEVENT: https://www.freebasic-portal.de/befehlsreferenz/screenevent-367.html
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 31.07.2016, 10:19    Titel: Antworten mit Zitat

UEZ hat Folgendes geschrieben:

@Elor: ich bin mit Linux nicht so vertraut, aber ich werde mal FB unter Linux (VM) installieren.
Um den Code als x64 laufen zu lassen, reicht es, die 64-bit Variante von FB zu nutzen?

Ich bin mir nicht sicher ob ich das jetzt richtig verstehe, willst Du jetzt extra ein Linux installieren um mein Beispiel zu testen? Das brauchst Du nicht! Das kannst Du überall Kompilieren, ob Windows, Linux, 32 oder 64Bit ist egal. Lediglich dein Beispiel läuft nur unter Windows und deshalb kam ich ja auf die FB-Bitmap Variante.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

BeitragVerfasst am: 31.07.2016, 12:34    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
UEZ hat Folgendes geschrieben:

@Elor: ich bin mit Linux nicht so vertraut, aber ich werde mal FB unter Linux (VM) installieren.
Um den Code als x64 laufen zu lassen, reicht es, die 64-bit Variante von FB zu nutzen?

Ich bin mir nicht sicher ob ich das jetzt richtig verstehe, willst Du jetzt extra ein Linux installieren um mein Beispiel zu testen? Das brauchst Du nicht! Das kannst Du überall Kompilieren, ob Windows, Linux, 32 oder 64Bit ist egal. Lediglich dein Beispiel läuft nur unter Windows und deshalb kam ich ja auf die FB-Bitmap Variante.


Ich habe seit langem Mint Linux in einer VM laufen. lächeln
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 31.07.2016, 14:16    Titel: Antworten mit Zitat

UEZ hat Folgendes geschrieben:

Ich habe seit langem Mint Linux in einer VM laufen.

Ach so, dass hab ich so jetzt irgendwie nicht mit bekommen. Das ist aber erst mal gar nicht sooo wichtig, aber etwas anderes schon. Den ich hab jetzt mal die Werte direkt in den BitMap Speicher geschrieben und zwar so wie das Original .

Code:

Dim As uLong iPos, iMax= iW* iH- 1
Dim As uLong Ptr aBits  ‘ Bitte beachten: uLong, nicht uByte!
Do
  Clear (*aBits, 0, Size)
  For i= 0 To iParticles - 1
    MoveParticles(iMPx, iMPy, i, 100)
    iPos= Int (aParticles(i).y)* iW+ Int (aParticles(i).x)
    If(iPos > iMax) Then iPos= iMax
    aBits[iPos]= aParticles(i).argb
  Next i
  Put (0, 0), tBIV5HDR, Pset
...


Unter Linux Pflutscht das wie Sau, da kann noch nicht mal die GDI mit halten. Wenn ich das aber unter Windows 10 (32) laufen lasse, dann teilt sich das Bild (Diagonal) in zwei Hälften die nach links und rechts auseinander driften. Die Mausposition liegt auch an einer ganz anderen stelle.
Da sind jetzt die Profis gefragt: Ist das ein Bug? Oder hab ich was übersehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RWK



Anmeldungsdatum: 04.07.2011
Beiträge: 44

BeitragVerfasst am: 01.08.2016, 15:07    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Ist das ein Bug? Oder hab ich was übersehen?


Code:
 
   iW = Int(sW * 0.95)
   iH = Int(sH * 0.9)
   
   print "Width:iW: " & iW & " - High:iH " & iH

  'ScreenControl FB.SET_DRIVER_NAME, "GDI"
  ScreenRes (iW, iH, 32)


weil sW*0.95 nicht unbedingt etwas durch 32? teilbares ergibt ist das ganze versetzt.
Ich nehme an da trennen sich die Win- und Linux Welten in der Interpretation der übergebenen ScreenRes Werte.

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 01.08.2016, 17:23    Titel: Antworten mit Zitat

RWK hat Folgendes geschrieben:

weil sW*0.95 nicht unbedingt etwas durch 32? teilbares ergibt ist das ganze versetzt.
Ich nehme an da trennen sich die Win- und Linux Welten in der Interpretation der übergebenen ScreenRes Werte.

Das ist die Lösung, warum ist mir allerdings schleierhaft? Ich hab die werte bezüglich Bildschirm Auflösung und Image bei beiden Systemen ausgelesen, da gibt es keine Unterschiede. Wenn ich unter Windows, nach Deiner Lösung, eine feste Auflösung verwende, z.B. 1024x768, dann Funktioniert es einwandfrei. Ob man damit allerdings zufrieden sein muss?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

BeitragVerfasst am: 01.08.2016, 20:18    Titel: Antworten mit Zitat

Als Workaround könnte man einfach
Code:
iW = Int(sW * 0.95) - Int(sW * 0.95) Mod 32
iH = Int(sH * 0.9) - Int(sH * 0.9) Mod 32

nehmen.

Unter Linux habe ich FreeBasic installiert, aber kann leider nichts kompilieren, da Fehler auftreten.

Btw, gibt es unter FB ein OnEvent Mode?
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 01.08.2016, 21:17    Titel: Antworten mit Zitat

Zitat:
Das ist die Lösung, warum ist mir allerdings schleierhaft? Ich hab die werte bezüglich Bildschirm Auflösung und Image bei beiden Systemen ausgelesen, da gibt es keine Unterschiede. Wenn ich unter Windows, nach Deiner Lösung, eine feste Auflösung verwende, z.B. 1024x768, dann Funktioniert es einwandfrei. Ob man damit allerdings zufrieden sein muss?

Wer unbedingt die Überholspur verwenden will, darf sich nicht wundern, wenn man danach doch wieder alles selber machen muss und es genau so langsam wird. lächeln Genau wie GET/PUT-Grafikpuffer hat auch der SCREEN Anforderungen an die Zeilenlänge (Pitch). Wenn du den Pitch-Wert nicht beachtest beim berechnen der Pixeladresse, wird dein Pixel irgendwo landen, nur nicht da, wo er hinsoll.
_________________
» 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
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 02.08.2016, 12:54    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:

Genau wie GET/PUT-Grafikpuffer hat auch der SCREEN Anforderungen an die Zeilenlänge (Pitch). Wenn du den Pitch-Wert nicht beachtest beim berechnen der Pixeladresse, wird dein Pixel irgendwo landen, nur nicht da, wo er hinsoll.

Das hat mit der Berechnung gar nichts zu tun, sondern mit den unterschiedlichen Werten die vom Linux-FBC und Windows-FBC erzeugt werden. Folgende Daten (bezogen auf mein LT):

Linux:
ScreenInfo ImageInfo
W = 1216 W = 1216
H = 720 H = 720
Bpp = 4 Bpp = 4
Pitch = 4864 Pitch = 4864

Windows:
ScreenInfo ImageInfo
W = 1215 W = 1215
H = 720 H = 720
Bpp = 4 Bpp = 4
Pitch = 4860 !!! Pitch = 4864 ?

Der Pitch Wert ist tatsächlich unterschiedlich. Wenn ich jetzt die breite für den Screen um ein Pixel erhöhe (und damit ja auch für das Image), ändert sich aber nur der Pitch Wert für den Screen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4212
Wohnort: ~/

BeitragVerfasst am: 02.08.2016, 13:36    Titel: Antworten mit Zitat

Zitat:
Der Pitch Wert ist tatsächlich unterschiedlich. Wenn ich jetzt die breite für den Screen um ein Pixel erhöhe (und damit ja auch für das Image), ändert sich aber nur der Pitch Wert für den Screen.

Und genau deshalb schreibt Jojo ja, dass man den Pitch bei der Berechnung mit berücksichtigen muss. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 02.08.2016, 13:57    Titel: Antworten mit Zitat

Richtig, du musst den Pitch in der Berechnung von iPos berücksichtigen. Der Pitch-Wert kann sich sowohl unter Linux als auch Windows ändern, wie er lustig ist.
Die Pitch-Werte werden übrigens nicht vom FBC "erzeugt", sondern von deiner Grafikumgebung. Da ist also nicht der FreeBASIC-Compiler so gemein und schiebt dir unterschiedliche Werte unter (wenn das so wäre, könntest du den korrekten Pitch-Wert ja einfach zur Compilezeit ermitteln). Die unterschiedlichen Werte stammen aus der jeweils verwendeten Grafikumgebung und können auch innerhalb des verwendeten Betriebssystems variieren.

Es gibt unter anderem alte Windows-Software, die auch den Pitch-Wert (bzw das jeweilige Äquivalent in der verwendeten Grafikumgebung) ignorierte und z.B. unter Windows 98 noch korrekt aussah, weil dort Pitch nur durch 4 teilbar sein musste (was bei einem 32-Bit-Farbmodus immer gegeben ist), aber auf moderneren System muss es öfter durch 16 oder noch größere Teiler teilbar sein - typischerweise, weil SSE-Anweisungen zum kopieren der Pixeldaten verwendet werden, und die Daten dann ein Alignment von 16 Byte haben müssen. Solche Software zeigt dann unter modernen Windows-Systemen dieselben Symptome wie dein Programm hier.
_________________
» 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
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 75
Wohnort: Opel Stadt

BeitragVerfasst am: 03.08.2016, 00:24    Titel: Antworten mit Zitat

Wenn ich z.B. 1000000 Partikel darstelle, dann dauert es relativ lange, bis die GUI geschlossen wird, wenn ich die Ausführung beenden möchte.

Gibt es unter FB ein OnEvent Mode? Damit könnte man dieses Problem des Schließens lösen.
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 03.08.2016, 11:38    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:

Und genau deshalb schreibt Jojo ja, dass man den Pitch bei der Berechnung mit berücksichtigen muss.

Das hab ich schon verstanden, ich wollte nur mal zeigen wo und wie sich die werte unterscheiden. Ich bin ja sicher nicht der einzige der dieses verhalten nicht kannte.

@Jojo: Ich hab mal noch mit verschiedenen Auflösungen herum gespielt. Dabei ist aufgefallen das der Fehler immer nur bei ungeraden Zeilen breite aufgetaucht ist. Also ein einfaches „iW= iW+ (iW Mod 2)“ tut es also auch schon.
Jedenfalls ist für mich das verhalten schon mal erklärt und hab somit wieder was dazu gelernt! happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 03.08.2016, 16:30    Titel: Antworten mit Zitat

Ich hoffe dass du daraus mehr gelernt hast als nur immer eine gerade Screen-Breite zu wählen. Kopf schütteln Es ist keineswegs garantiert (weder unter Windows noch unter Linux) dass dies für immer und ewig die einzige Bedingung an die Zeilenlänge sein wird - genau deswegen gibt es ja den Pitch-Wert, den man für die Berechnungen verwenden soll! Der nächste Grafiktreiber wird vielleicht aus Performancegründen fordern, dass die Zeilenlänge durch 32 teilbar ist, dann hast denselben Salat wieder wenn du den Pitch-Wert ignorierst.
_________________
» 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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3, 4  Weiter
Seite 1 von 4

 
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