Seite 1 von 1

_..-~* sprite3D Catchsprite? *~-.._

Verfasst: 06.07.2012 12:58
von Max_der_Held
Hallo Leute,

[Grundfrage: Wie kann ich Catchsprite beschleunigen, oder
- wie kann ich ein sprite3D mit transparentem Text ohne catchsprite erzeugen]

Ich möchte einen Zeiger drehen und Winkelmaße darunter anzeigen. - mit sprite3d.
Dafür muss Text mit Alpha-channel gebaut werden. das geht nur über den catchsprite-Umweg..

sprich:
  • CreateImage
  • -> drauf gezeichnet ->
  • Catchsprite
  • createsprite3d
Das läuft alles gut.. bis auf den catchsprite Aufruf..
Manchmal braucht er einfach 15 ms. Immer wieder mal -> Zufällig.
Wie kann ich die Font-Texte jetzt schneller anzeigen?..
Startdrawing( screenoutput()) dauert noch viel länger.

Kann ich catchsprite() in einen thread auslagern, muss ich dann auf flipbuffers aufpassen, dass das nicht zwischenfunkt ??..

Bild

Sourcecode zu groß.. Teile:

Code: Alles auswählen

Structure gui_sprite
   spriteID.i
   sprite3d.i
   spriteBuffer.i; falls es ein TEXT bild ist, hat es ein original-bild.
EndStructure 

mein_text.gui_sprite = gui_createtext ( " Hallo Welt" , 100 , 20 ) ; einfach ein Sprite3d erstellen mit transparentem Text!.. 

Procedure gui_SaveImage32_ToMemory(imagenum) ; Adds alpha to Image

  colorsize = ImageWidth(imagenum)*ImageHeight(imagenum)*SizeOf(RGBQUAD)
  ImageSize = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + colorsize
  *rawimage = AllocateMemory(ImageSize) 
  *fileheader.BITMAPFILEHEADER = *rawimage 
  *header.BITMAPINFOHEADER = *rawimage + SizeOf(BITMAPFILEHEADER) 
  
  With *fileheader 
    \bfType = 19778 ; word containing 2 bytes, 'BM' for 'BIT' 'MAP' ;) 
    \bfSize = ImageSize 
    \bfOffBits = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) 
  EndWith 
  
  With *header
    \biSize         = SizeOf(BITMAPINFOHEADER) 
    \biWidth        = ImageWidth(imagenum) 
    \biHeight       = ImageHeight(imagenum)
    \biPlanes       = 1 
    \biBitCount     = 32
  EndWith 
  
  If StartDrawing(ImageOutput(imagenum))
    CopyMemory  (DrawingBuffer(), *rawimage + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER), colorsize) 
    StopDrawing()
  EndIf 
  
  ProcedureReturn *rawimage
  
EndProcedure

Procedure gui_CreateText(gesamttext.s,width,height , color=#gui_menucolor, Ausrichtung = #gui_ausrichtung_zentriert, IsTransparent = 1) ; returns a gui_sprite-pointer!!
   Protected ImageID , *gui_sprite.gui_sprite ,x,y, zeilenzahl , text.s , textheight
   startzeit = ElapsedMilliseconds()
   *gui_sprite    = AllocateMemory( SizeOf( gui_sprite))
   ImageID        = CreateImage(#PB_Any , width , height ,32)
   gesamttext     + Chr(10) ; für stringfield.. damit er auch 1-zeilen-texte erkennt.!=)
   zeilenzahl     = CountString ( gesamttext , Chr(10))
   
   ;{ auf Bild zeichnen
   If StartDrawing ( ImageOutput(ImageID ))
      DrawingMode  ( #PB_2DDrawing_AlphaChannel )
      Box          ( 0, 0, ImageWidth(ImageID), ImageHeight(ImageID),0)
      DrawingMode  ( #PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
      DrawingFont  ( FontID(gui_font ))
      FrontColor   ( RGB(255,104,37 ))
      textheight   = TextHeight ( gesamttext)
      
      For n = 1 To zeilenzahl ; alle zeilen anzeigen (multizeilen support.)
         text  = StringField( gesamttext  , n , Chr(10))
          If Ausrichtung = #gui_ausrichtung_zentriert
            x = width  / 2 - TextWidth(text)  / 2
          EndIf 
          y = height / 2 - textheight *0.5 * zeilenzahl  + textheight *(n-1) 
          DrawText(1+x,1+y,text ,#gui_menucolor_shadow)   ; background des textes zum bessern Lesen.
          DrawText(  x,  y,text ,color)   ;RGBA(255,216,43,255))
      Next 
      
      StopDrawing()
   EndIf 
   ;}
   
   *imagemem                = gui_SaveImage32_ToMemory(ImageID  ) 
   *gui_sprite\spriteBuffer = *imagemem
   FreeImage  ( ImageID )
   
      *gui_sprite\spriteID   = CatchSprite(#PB_Any , *imagemem ,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending )
      *gui_sprite\sprite3d   = CreateSprite3D( #PB_Any , *gui_sprite\spriteID  )
    ; FreeMemory ( *imagemem ) ; macht er unten
    dauer = ElapsedMilliseconds() - startzeit
      If dauer > 0
        Debug "DAUER: " + Str(dauer ) + " " + gesamttext 
      EndIf 
   ; 
   ProcedureReturn *gui_sprite
EndProcedure 

Re: _..-~* sprite3D Catchsprite? *~-.._

Verfasst: 06.07.2012 15:26
von WPö
Max, tu Dir bitte selbst und uns einen Gefallen und laß die kindischen Spielereien mit dem Thementitel. Du wirst sehen: Mit einem seriösen und aussagekräftigen wirst Du mehr Rückmeldungen bekommen. Danke.

Gruß - WPö

Re: _..-~* sprite3D Catchsprite? *~-.._

Verfasst: 06.07.2012 16:59
von Max_der_Held
Ich glaube Arthur oder Stargate haben schonmal was in der Richtung gemacht (?)
Kann catchsprite mit flipbuffers kollidieren in threads?

Re: _..-~* sprite3D Catchsprite? *~-.._

Verfasst: 06.07.2012 18:57
von PMV
DX9 darf nur in ein und dem selben Thread ausgeführt
werden. Da ist nix mit Multithreading.
Mache dir vorgefertigte Sprites die du dann nur noch anzeigen
musst, anstelle immer alles komplett neu zu zeichnen. :wink:

MFG PMV

Re: _..-~* sprite3D Catchsprite? *~-.._

Verfasst: 09.07.2012 14:53
von bobobo
Warum fällt mir dazu knobman ein ?