Regen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

STARGÅTE hat geschrieben:SpecialFX( ist unglaublich langsam (im gegensatz zu Start3D)

Und da DisplaySprite3D eh einen transparentswert hat, wäre das auf jedenfall sinnvoller.

Sprite3D heißt ja nicht unbedingt das du 3D hast, es ist nur schneller weil es DX7 verwendet.

Mein Rat: Mache alle Sprite2D zu Sprite3D (und halt die Start3D() sache mit einbauen)
Die 2D-Sprite- Befehle greifen doch auch auf DX7 zurueck oder nicht?

Und wie ueberpruefe ich nun ob sich zwei 3D-Sprites flaechenmaessig ueberlappen?

naja werd mal einwenig damit rumspielen :)
Bild + Bild

Bild
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:... wobei ein Haufen 2D sprites immer noch schneller ist ist wenn man Draw benutzt ...
versteh ich nicht... :shock:
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sorry, typo.
... wobei ein Haufen 2D sprites immer noch schneller ist als wenn man Draw benutzt ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:sorry, typo.
... wobei ein Haufen 2D sprites immer noch schneller ist als wenn man Draw benutzt ...
Achso lol das meinte ich eigtl. nicht..

Ich meinte, wie meinst du das mit dem "Draw benutzen"? Etwa "DrawingMode()"? Wenn ja - fuer was ist das gut?

Sry fuer die Nob-Frage :oops:
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> wie meinst du das mit dem "Draw benutzen"? Etwa "DrawingMode()"?

generell Drawen, also irgendetwas mit StartDrawing/StopDrawing auf den Screen bringen.

ein einfaches Plot(x,y,color) (mit Farbangabe) ist noch recht schnell, weil es DirectSurfaceAccess benutzt,
dürfte aber trotzdem langsamer sein als eine Sprite-Darstellung, wäre mal genau zu testen.

alle anderen Draw-Befehle, auch Plot ohne Farbangabe, benutzen die standard Draw-routinen des DeviceContext.
diese sind extrem langsamer als DSA oder Sprites.

siehe hier für einen test:
http://www.purebasic.fr/english/viewtop ... 962#257962

DSA braucht (auf meinem rechner) 67ms, DC 9718ms,
und DSA ist maximal so schnell wie wenn man 2D-Sprites benutzt, womöglich langsamer.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:> wie meinst du das mit dem "Draw benutzen"? Etwa "DrawingMode()"?

generell Drawen, also irgendetwas mit StartDrawing/StopDrawing auf den Screen bringen.

ein einfaches Plot(x,y,color) (mit Farbangabe) ist noch recht schnell, weil es DirectSurfaceAccess benutzt,
dürfte aber trotzdem langsamer sein als eine Sprite-Darstellung, wäre mal genau zu testen.

alle anderen Draw-Befehle, auch Plot ohne Farbangabe, benutzen die standard Draw-routinen des DeviceContext.
diese sind extrem langsamer als DSA oder Sprites.

siehe hier für einen test:
http://www.purebasic.fr/english/viewtop ... 962#257962

DSA braucht (auf meinem rechner) 67ms, DC 9718ms,
und DSA ist maximal so schnell wie wenn man 2D-Sprites benutzt, womöglich langsamer.
Der Test geht bei mir nich - stuerzt ab...

Hab mir aber auf die Schnelle einen eigenen kleinen Test gemacht: Zum Vergleich: 2D-Sprites mit 3D-Sprites:

Code: Alles auswählen

InitSprite() 
InitSprite3D()
InitKeyboard() 
OpenWindow(0,0,0,600,500,"test") 
OpenWindowedScreen(WindowID(0),0,0,600,600,0,0,0) 

CreateSprite(1, 20, 20, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
DrawText(0, 0, "hi!")
StopDrawing()

CreateSprite3D(2, 1)

starttime = ElapsedMilliseconds()

Start3D()
DisplaySprite3D(2, 0, 0)
Stop3D()
FlipBuffers()

Debug ElapsedMilliseconds() - starttime

starttime = ElapsedMilliseconds()

DisplaySprite(1, 0, 0)
FlipBuffers()

Debug ElapsedMilliseconds() - starttime

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Und bei mir scheint es, dass die 2D-Sprites wesentlich schneller sind:
Bei mir kommt raus:

47
15

:shock:
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

lolz?

schreib dir mal nen test OHNE debugger, du jokemaster! ;)

debugger abschalten, oben mit dem käferknopf, und das ergebnis mit nem MsgReq ausgeben.

außerdem ist die darstellung von EINEM sprite wohl kaum was, was man testen sollte.
stelle mal HUNDERT sprites dar, mach diesen vorgang HUNDERT mal,
und lass das FlipBuffers weg, das wartet nämlich auf den nächsten VSync.

also, du hast da im endeffekt GARNIX getestet, nur gemessen,
wie weit den erster ElapsedMilliseconds-Aufruf vom nächsten VSync entfernt ist!


> Der Test geht bei mir nich - stuerzt ab...

oy! muss ich makl gucken woran es liegen könnte.

hast du's wenigstens mit 4.20 ausprobiert?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:lolz?

schreib dir mal nen test OHNE debugger, du jokemaster!

debugger abschalten, oben mit dem käferknopf, und das ergebnis mit nem MsgReq ausgeben.


> Der Test geht bei mir nich - stuerzt ab...

oy! muss ich makl gucken woran es liegen könnte.

hast du's wenigstens mit 4.20 ausprobiert?
Ja - und es lag am Debugger - er war eingeschaltet - Da hat dein Programm solange gebraucht, bis es abgestuerzt ist - mit ausgeschaltetem Debugger warens bei DC starke 9 Sek..., bei DSA nur 125ms... :o

Zu meinem Test:

Code: Alles auswählen

InitSprite() 
InitSprite3D()
InitKeyboard() 
OpenWindow(0,0,0,600,500,"test") 
OpenWindowedScreen(WindowID(0),0,0,600,600,0,0,0) 

CreateSprite(1, 20, 20, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
DrawText(0, 0, "hi!")
StopDrawing()

CreateSprite3D(2, 1)

starttime = ElapsedMilliseconds()

Start3D()
DisplaySprite3D(2, 0, 0)
Stop3D()
FlipBuffers()

time3D = ElapsedMilliseconds() - starttime

starttime = ElapsedMilliseconds()

DisplaySprite(1, 0, 0)
FlipBuffers()

time2D = ElapsedMilliseconds() - starttime

MessageRequester("Test", "3D: " + Str(time3D) + Chr(13) + Chr(10) + "2D: " + Str(time2D))

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Im Durchschnitt gibt es aber keinen Unterschied ob der Debugger an oder aus ist. Kommt das gleiche raus, 47, 15....

Hab ich einen Fehler gemacht oder ist 2D tatsaechlich schneller? (was auch imho irgendwie logischer waere...)
Weil wenn ja - kann ich mir die Konvertierung zu 3D sparen...
Bild + Bild

Bild
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:außerdem ist die darstellung von EINEM sprite wohl kaum was, was man testen sollte.
stelle mal HUNDERT sprites dar, mach diesen vorgang HUNDERT mal,
und lass das FlipBuffers weg, das wartet nämlich auf den nächsten VSync.

also, du hast da im endeffekt GARNIX getestet, nur gemessen,
wie weit den erster ElapsedMilliseconds-Aufruf vom nächsten VSync entfernt ist!
Okay - aber wieso ohne FlipBuffers??? Gehoert das denn nicht irgendwie dazu?

Hab das mal getestet indem ich die Sprites jeweils 1000 mal gezeichnet hab - kommen teilweise unglaubwuerdige Ergebnisse raus /:-> z.B. 32, 15
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

FlipBuffers willst du aber nicht messen.

1. brauchst du das in deinem fertigen Game nur 1x pro Frame.
was dich interessiert ist, wenn du tausend objekte in jedem Frame hast,
ob du die besser mit 2D oder 3D darstellst.

2. wie schon gesagt, wartet FlipBuffers ohne explizites NoSync auf den Nächsten VSync,
das macht deine komplette Messung nutzlos.

> ich die Sprites jeweils 1000 mal gezeichnet hab - kommen teilweise unglaubwuerdige Ergebnisse raus

tausend sprites ist GARNIX.

nimm mal 100.000 oder 10.000.000, damit du signifikant über einer sekunde brauchst, dann hat der Test auch aussagekraft.
und lass wie gesagt das FlipBuffers weg :!:

testergebnisse von 32 bzw. 15 sind garnix, das heißt nur 2 bzw. 1 timeslice, genauer ist der Standard-Timer garnicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten