Aktuelle Zeit: 15.11.2018 21:52

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Unterschied Image/Sprite
BeitragVerfasst: 15.02.2018 19:10 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Ja die Geschwindigkeitsunterschiede sind enorm.

Man sollte eigentlich nur so viel wie nötig StartDrawing()...StopDrawing() im Loop einsetzen.

Hier ein kleiner Test.
(Das mit dem transparenten Image kann aber für andere Zwecke ganz nützlich sein.)

Code:
InitSprite()
InitKeyboard()

EnableExplicit

UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTGAImageDecoder()
UseGIFImageDecoder()
UseTIFFImageDecoder()

Global fname.s = ""
Global i = 0, j = 0, d1 = 0, d2 = 0

Procedure ByteSwap32(addrLong)
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov rax, [p.v_addrLong]
    !mov ecx, [rax]
    !bswap ecx
    !mov [rax], ecx
  CompilerElse
    !mov eax, [p.v_addrLong]
    !mov ecx, [eax]
    !bswap ecx
    !mov [eax], ecx
  CompilerEndIf
EndProcedure

Procedure.i LoadImageTransparent (hLoadImg, TransparentColorRGB.l)
  Protected width,height,pitch,imgbase, x,y, hImg32, *RGBA.Long
  width = ImageWidth(hLoadImg)
  height = ImageHeight(hLoadImg)
  hImg32 = CreateImage(#PB_Any, width, height, 32)
  If hImg32 = 0: ProcedureReturn 0: EndIf
  If StartDrawing(ImageOutput(hImg32)) = 0
    FreeImage(hImg32):   ProcedureReturn 0
  EndIf
  If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
    TransparentColorRGB | $FF000000    ;Linux & OSX
  Else
    ByteSwap32(@TransparentColorRGB)   ;Windows
    TransparentColorRGB = (TransparentColorRGB >> 8) | $FF000000
  EndIf
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(hLoadImg),0,0,width,height)
  pitch = DrawingBufferPitch()
  imgbase = DrawingBuffer()
  width-1: height-1
  For y = 0 To height
    *RGBA = imgbase + (y * pitch)
    For x = 0 To width
      If *RGBA\l = TransparentColorRGB
        *RGBA\l = 0
      EndIf
      *RGBA+4
    Next x
  Next y
  StopDrawing()
  ProcedureReturn hImg32
EndProcedure

fname = OpenFileRequester("Wähle ein Bild","", "*.*", 0)
Define hLoadImg = LoadImage(#PB_Any, fname)

ResizeImage(hLoadImg, 100, 100)

Define TransparentColor.l = RGB(255,255,255)
Define hTransparentImg = LoadImageTransparent(hLoadImg, TransparentColor)
If hTransparentImg = 0
  Debug "Das Bild konnte nicht geladen werden." : End
EndIf

;FreeImage(hLoadImg)

;Speed-Draw-Test
If OpenScreen(800,600,32,"Draw-Test")
  Define hTransparentSpr = CreateSprite(#PB_Any, 100, 100, #PB_Sprite_AlphaBlending)
  If hTransparentSpr
    If StartDrawing(SpriteOutput(hTransparentSpr))
      DrawingMode(#PB_2DDrawing_AlphaClip)
      DrawAlphaImage(ImageID(hLoadImg),0,0)
      StopDrawing()
    EndIf
    TransparentSpriteColor(hTransparentSpr, TransparentColor)
  Else
    Debug "Das Sprite konnte nicht erstellt werden." : End
  EndIf
  Repeat
    ExamineKeyboard()
    ClearScreen(RGB(255,255,0))
    If Not KeyboardPushed(#PB_Key_All)
      If StartDrawing(ScreenOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10,10, "Bitte 1 - Taste für Image-Draw oder 2 - Taste für Sprite-Draw gedrückt halten.",RGB(0,0,255))
        StopDrawing()
      EndIf
    EndIf
    If KeyboardPushed(#PB_Key_1)
      d1 = ElapsedMilliseconds()
      If StartDrawing(ScreenOutput())
        DrawingMode(#PB_2DDrawing_AlphaClip)
        For i = 0 To 100
          DrawImage(ImageID(hTransparentImg), Random(800,0), Random(600,0))
        Next i
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10,10, Str(ElapsedMilliseconds()-d1),RGB(0,0,0))
        StopDrawing()
      EndIf
    EndIf
    If KeyboardPushed(#PB_Key_2)
      d2 = ElapsedMilliseconds()
      For j = 0 To 100
        DisplayTransparentSprite(hTransparentSpr, Random(800,0), Random(600,0))
      Next j
      If StartDrawing(ScreenOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10,10, Str(ElapsedMilliseconds()-d2),RGB(0,0,255))
        StopDrawing()
      EndIf
    EndIf
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
   
  Until KeyboardPushed(#PB_Key_Escape)
  CloseScreen()
EndIf
End


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Unterschied Image/Sprite
BeitragVerfasst: 23.02.2018 15:19 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo ccode_new, diceman

um welchen Faktor schneller ist die wiederholte Spriteausgabe in einem StartDrawing, StopDrawing Block als bei DrawImage?
Wie lange braucht der allererste Aufruf von DisplayTransparentSprite?
Wie schnell ist das bei OpenWindowedScreen?
Warum nutzt Du nicht ExamineDesktops() und Breite=DesktopWidth(0), Hoehe=DesktopHeight(0)? Wenn mein Display beleidigt sein könnte, dann mit einem Aufruf 800x600.

Gruß

_________________
PB Spickzettel

Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im sichtbaren Universum.
Bitte Frage fragen.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Unterschied Image/Sprite
BeitragVerfasst: 23.02.2018 15:30 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Hallo Herr Kulow aus Düsseldorf,

deine Fragen kannst du dir doch leicht selber beantworten.

Was denn letzten Punkt betrifft:

Das nächste Mal nehme ich dann eben 640 x 480 Pixel bei 16 bit Farbtiefe. ( :D )

....
Danke für deine Meinung.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye