Seite 1 von 5

Illusion Graphics 2D

Verfasst: 13.03.2008 18:11
von Vermilion
Die "Illusion Graphics 2D" Engine ist eine OpenGL basierte 2D Engine, die als Ersatz dienen soll für die PureBasic interne Sprite&Screen Library (noch nicht vervollständigt).
  • Hardware-beschleunigte Darstellung, das Drehen oder beliebige vergrößern von Grafiken übernimmt vollkommen die Grafikkarte.
  • Volle Alpha-Kanal Unterstützung.
  • Flexibilität; Die angezeigten Grafiken können ganz einfach gedreht und in der Größe verändert werden, ohne spürbare Leistungseinbußen.
  • Intern werden unkomprimierte Targa Image Files unterstützt. Für alles andere gibt es eine Funktion die ein RGB/A Datenarray aus dem Speicherliest (somit theoretisch alle Bildformate ladbar). Beispielloader vorhanden.
  • Geringe Dateigröße der Bibliothek
Ein Bug den ich immer noch nicht beheben konnte: Das Clipping, funktioniert immernoch nicht wirklich korrekt. Ich werde auch noch bekloppt. Das ist eigentlich ganz simpel, aber ich habe stundenlang probiert und experimentiert, jedoch wollte das trotzdem nicht gescheid funktionieren.

Lizenzbestimmungen
Diese Software ist vollkommen frei. Quelltext wird mitgeliefert. Macht was immer ihr damit wollt. Jedoch übernehme ich keine Verantwortung für Schäden die aus der Benutzung resultieren (genaueres in der mitgelieferten "License.txt").

Weiterentwicklung
Die Weiterentwicklung wird offiziell auf unbestimmte Dauer eingestellt. Somit gibt es auch keine Dokumentation, allerdings sind die Befehle so gut wie selbsterklärend und so stark wie möglich denen der PureBasic Sprite&Screen Befehle nachempfunden. Und es sind ganze 2(!) Beispielquelltexte mitgeliefert. Ansonsten im Quelltext der Engine selbst sind noch Kurzbeschreibungen vor jeder Prozedur (Mini Hilfe) und ist meiner Meinung nach genug kommentiert.

Für Verbesserungen, neue Beispielquelltexte oder komplett neue Includes (wie z.B. die Unterstützung von Videowiedergabe) von Nutzern (wie z.B. euch) habe ich immer ein Ohr offen und werde sie in die offizielle Version (wer weiß, wer sein eigenes Derivat davon ableitet) einbauen, sofern sie eine gewisse Qualität aufweisen / in den Rest des Salates passen.
Dies ist mein letztes Projekt durchgeführt in PureBasic, da ich nun meine Prioritäten auf Spiele Entwicklung in C# mit XNA verlege (bzw. C++ im Zusammenspiel mit der OGRE und Irrlicht Engine).

Runterladen!
98KB, *.zip Archiv

Verfasst: 13.03.2008 18:17
von RSBasic
@Vermilion
Habs getestet. Gute Lib :allright:
Nur ich bleibe erstmal noch bei der 2DDrawing/Sprite(3D)-Lib^^

PS: Systemvorraussetzungen: bitte nur mit einem r :)

Verfasst: 13.03.2008 18:19
von Vermilion
Ups, ok, das nächste mal nicht mehr vorzufinden. :oops: Ja, Rechtschreibung ist so eine Sache...

Verfasst: 13.03.2008 18:56
von STARGÅTE
Hast du vllt ein Beispiel Code mit den normalen PB-Befehlung und deinen Befehlen wo man sieht das deins wirklich schneller ist.
zB :
- Darstellung von 10000 Sprites
- Darstellung von 10000 gezerrten Sprites

habe zZ keine Zeit um mich tiefer damit zu befassen, deswegen stelle ich diese Frage :oops:


PS: Die Hilfedatei funzt nicht, habe nur leere Seiten :?

Verfasst: 13.03.2008 19:06
von Vermilion
Wo steht, dass ich behaupte, dass sie insgesamt schneller ist? ^^ Naja, kann ich ja mal gleich machen, solche Tests.

Bei der Hilfedatei kann ich nicht helfen, also bei mir wird alles einwandfrei angezeigt, ich kann aber sagen, dass ich sie mit HelpMaker erstellt habe.

Verfasst: 13.03.2008 19:11
von STARGÅTE
habe gerade mal n Test gemacht :

Code: Alles auswählen

XIncludeFile "Illusion2d.pbi"
Global Image.l, n.l
IllOpenScreen(640, 480, "Simple", #False) ; Open the Screen with a Resolution of 640x480
Image = IllLoadTargaImage("media/ground0.tga") ; Load the image

Time = timeGetTime_()
For i = 1 To 100
  IllBegin()
    For n = 1 To 1000 
      IllSetImagePosition(Image, Random(1000), Random(1000)) ; Position it
      IllSetImageRotation(Image, Random(359))
      IllDisplayImage(Image) ; Just Display the image
    Next n  
  IllEnd()  
Next i
Time1 = timeGetTime_()-Time

Ergebnis = MessageRequester("", Str(Time1))
vs.

Code: Alles auswählen

InitSprite()
InitSprite3D()
UseTGAImageDecoder()

OpenWindow(0, 0, 0, 640, 480, "Simple", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
 
 LoadSprite(1, "media/ground0.tga", #PB_Sprite_Texture)
 CreateSprite3D(1,1)
 
Time = timeGetTime_()
For i = 1 To 100
 WindowEvent()
 ClearScreen(0)

 Start3D()
  For n = 1 To 1000 
   RotateSprite3D(1, Random(359),0)
   DisplaySprite3D(1, Random(1000), Random(1000)) ; Just Display the image
  Next n
 Stop3D()

 FlipBuffers()  
Next i
Time1 = timeGetTime_()-Time

Ergebnis = MessageRequester("", Str(Time1))
Ergebnis:
928 zu 1738

also ist deins fast doppelt so schnell wie PB :allright:

EDIT: Jedoch bei 10facher Bilderanzahl pro Frame:
8700 zu 8600 :?

Verfasst: 13.03.2008 19:28
von Vermilion
Das hat einen Grund, ich suche gerade bloß welchen, weil ich denke, das lässt sich noch optimieren... bei meiner Engine wird übrigens die Bildschirmwiederholungsrate (Hz) nicht verändert. Weitere Notiz (bin gerade mit Vista online): Bei Sprite3D schaltet sich die Aero Oberfläche aus, bei Illusion2Dnicht.
Und bei mir werden alle Quads geblendet gerendert, also es ist egal ob sie 24 Bit Farbtiefe haben (also dann ohne Transparenz) oder Alpha Kanal haben, sie werden so oder so mit der Blending Funktion gerendert. Vielleicht sollte ich das ändern...

Also wenn man nun nicht tausende Sprites auf ein mal darstellen möchte, ist meine die bessere Wahl bezüglich Performance. Wobei ich persönlich nicht gerade so Wert lege auf diese Milisekunden Unterschied, die da beim Rendern von tausenden Sprites sind. :)

Edit: Bei 10-facher Bildzahl ist meine Engine immer noch um 2 Sekunden schneller. :?

Verfasst: 13.03.2008 20:31
von DrShrek
Damit ist PB schneller:

Code: Alles auswählen

InitSprite() 
InitSprite3D() 
UseTGAImageDecoder() 

OpenWindow(0, 0, 0, 640, 480, "Simple", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0) 
  
 SetFrameRate(99999)
 LoadSprite(1, "media/ground0.tga", #PB_Sprite_Texture) 
 CreateSprite3D(1,1) 
  
Time = timeGetTime_() 
For i = 1 To 100 
 
 ClearScreen(0) 

 Start3D() 
  
  For n = 1 To 1000 
    RotateSprite3D(1, Random(359),0) 
   DisplaySprite3D(1, Random(1000), Random(1000)) ; Just Display the image 
  Next n 
 Stop3D() 

 FlipBuffers(0)  
Next i 
Time1 = timeGetTime_()-Time 

Ergebnis = MessageRequester("", Str(Time1)) 

Verfasst: 13.03.2008 20:43
von Vermilion
Bei mir variiert das irgendwie, wahrscheinlich wegen dem Kram im Hintergrund.

Sprite3D: ~3700 Millisekunden
Illusion2D: ~2650 Millisekunden

Bei mir einfach schneller. Kann aber auch daran liegen (dass DirectX so langsam ist), dass ich DirectX 10 als Software aber nur DirectX 9 als Hardware habe, und der dann wieder emulieren/interpolieren oder soetwas muss.

Verfasst: 13.03.2008 20:45
von DarkDragon
Vermilion hat geschrieben:Bei mir variiert das irgendwie, wahrscheinlich wegen dem Kram im Hintergrund.

Sprite3D: ~3700 Millisekunden
Illusion2D: ~2650 Millisekunden

Bei mir einfach schneller. Kann aber auch daran liegen (dass DirectX so langsam ist), dass ich DirectX 10 als Software aber nur DirectX 9 als Hardware habe, und der dann wieder emulieren/interpolieren oder soetwas muss.
Du hast doch OpenGL verwendet und nicht DirectX :freak: .

Hast du wenigstens die Display-Lists oder Vertex-Arrays/VBOs verwendet? Dann wäre es schon um ein vielfaches schneller.