und ich dachte Sprites sind schneller

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

BAS

Betreff: und ich dachte Sprites sind schneller

BeitragDi, Apr 26, 2005 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Warum werden 1000 Cubes schneller berechnet als 1000 Sprites?


BlitzBasic:

; speed test
; 1000 cubes vs. 1000 sprites

Graphics3D 800, 600, 0, 3
SetBuffer BackBuffer()
Global camera, light, cube, tex

; FPS-Stuff
Const FPS_OVER_TIME_MAX = 20
Dim FPS_overTime#(FPS_OVER_TIME_MAX)
FPS_overTimeIndex = 0
FPS_Start# = 0
FPS_overTimeSum# = 0
CurFPS = 0

; create camera, light, mastercube, ...
makeWorld(1)

While Not KeyHit(1)

FPS_Start = MilliSecs()

pitch#=0
yaw#=0
roll#=0

; user-input
If KeyDown(208)=1 Then pitch#=-1
If KeyDown(200)=1 Then pitch#=1
If KeyDown(203)=1 Then yaw#=-1
If KeyDown(205)=1 Then yaw#=1
If KeyDown(45)=1 Then roll#=-1
If KeyDown(44)=1 Then roll#=1
If KeyHit(2)=1 Then makeCubes(1)
If KeyHit(3)=1 Then makeCubes(4)
If KeyHit(4)=1 Then makeSprites(1)
If KeyHit(5)=1 Then makeSprites(4)

TurnEntity cube,pitch#,yaw#,roll#
RenderWorld

; HUD
Color 0, 0, 0
Rect 0, 0, 480, 140, 1
Color 255, 255, 255
Text 20, 20, \"FPS: \" + CurFPS
Text 20, 40, \"Press '1' for createCubes(solid)\"
Text 20, 60, \"Press '2' for createCubes(transparent)\"
Text 20, 80, \"Press '3' for createSprites(solid)\"
Text 20, 100, \"Press '4' for createSprites(transparent)\"
Text 20, 120, \"Press left, right, up, down , x, y to turn master-cube\"
Flip

; FPS-Stuff
FPS_overTime(FPS_overTimeIndex) = 1000.0 / (MilliSecs() - FPS_Start)
FPS_overTimeIndex = (FPS_overTimeIndex + 1) Mod FPS_OVER_TIME_MAX
For i=0 To FPS_OVER_TIME_MAX-1
FPS_overTimeSum = FPS_overTimeSum + FPS_overTime(i)
Next
CurFPS = FPS_overTimeSum / FPS_OVER_TIME_MAX
FPS_overTimeSum = 0

Wend
End

; called after each user-input (1..4)
Function makeWorld(flag)
ClearWorld
camera=CreateCamera()
light=CreateLight()
RotateEntity light,90,0,0
; create master-cube
cube=CreateCube()
PositionEntity cube,0,0,10
tex = makeTexture(256, flag)
EntityTexture cube,tex
End Function

; put 1000 flat cubes randomly in front of camera
; cubes will be copies of master cube (makeWorld())
; flag=1 -> solid cubes
; flag=4 -> black as transparent
Function makeCubes(flag)
makeWorld(flag)
For i=1 To 1000
e = CopyEntity(cube)
ScaleEntity e, Rnd(0.1,1), Rnd(0.1,1), 0.001
z = Rnd(5,50)
PositionEntity e, z*Rnd(-1,1), z*Rnd(-1,1), z
Next
End Function

; put 1000 sprites randomly in front of camera
; flag=1 -> solid sprites
; flag=4 -> black as transparent
Function makeSprites(flag)
makeWorld(flag)
sprite = LoadSprite(\"tmp.bmp\", flag) ; tmp.bmp is created by makeTexture()
For i=1 To 1000
e = CopyEntity(sprite)
ScaleEntity e, Rnd(0.1,0.5), Rnd(0.1,0.1), 0.001
z = Rnd(5,50)
PositionEntity e, z*Rnd(-1,1), z*Rnd(-1,1), z
Next
End Function

; returns texture-handle (size X size) and safes \"tmp.bmp\" to disk
; flag=1 -> solid
; flag=4 -> black as transparent
Function makeTexture%(size, flag)
localImg = CreateImage(size, size)
SetBuffer ImageBuffer(localImg)
ClsColor 0, 0, 0
Cls
For i=0 To size Step 5
Color 250, i, 250
Oval i, i, i, i, 0
Next
Oval size/4, size/4, size/4, size/4, 1
SetBuffer BackBuffer()
; workaround to get transparent textures: use LoadTexture() instead of CreateTexture()
SaveImage(localImg,\"tmp.bmp\")
localTex = LoadTexture(\"tmp.bmp\", flag)
If (0 = localTex) Then RuntimeError(\"Cannot load 'tmp.bmp'\")
Return localTex
End Function


Auf meiner Maschine ergeben sich folgende FPS:
1000 Cubes, Texture = Solid: 75 FPS
1000 Cubes, Texture = black as transparent: 75 FPS
1000 Sprites, Texture = Solid: 33 FPS
1000 Sprites, Texture = black as transparent: 18 FPS

Sytem:
DX9, BB3D v.1.83, Radeon 9200SE

Hintergrund:
In meinem neuen Spiel sinken die FPS auf ca. 30, wenn mehr
als 10 Sprites (Textur: 256 x 256 / Flag=4 [Masked]) sichtbar sind.

Wann benutzt man denn Sprites, wenn die so langsam berechnet werden?

Danke für jeglichen Hinweis,
BAS
 

Dreamora

BeitragDi, Apr 26, 2005 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Sprites kann man höchtens für Menüs und HUD Elemente gebrauchen.
Ansonsten musst du single surface systeme nutzen (gibt es sources dazu entweder hier oder auf bb.com), diese sind um welten schneller Smile

geht natürlich nur wenn du viele "Sprites" aber nur wenige verschiedene Texturen hast
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BAS

BeitragDi, Apr 26, 2005 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die gute Antwort.
Ich werde in meinem Spiel die Sprites gegen texturierte Cubes austauschen. Single Surface Systeme werde ich mir anguggen.

BAS
 

lettorTrepuS

BeitragMi, Apr 27, 2005 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

MaTrixCruiser

BeitragMi, Apr 27, 2005 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei sprites ist es sehr abhängig von der Texture größe.
Was ist denn der unterschied zwischen selbst gemachten sprites oder fertige sprites?
Amd 64 3200+ (939 winchester)
nvidea 6600gt (PCI-E)
1024 ddr400
200GB HDD
S
 

NetPad

BeitragMi, Apr 27, 2005 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du ein sprite selbst machst, ist es nicht wirklich ein sprite, sonder einfach zwei dreiecke zu einem rechteck zusammengebaut. zu beachten ist hier, dass natürlich die rückseite nicht angezeigt wird, das wird aber bei sprites wohl auch der fall sein.

grs NP
User posted image
CCC:http://www.ccc.de/campaigns/music/
//aufmerksam gemacht von gameworx

MaTrixCruiser

BeitragMi, Apr 27, 2005 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist doch aber alles gleich.
Eigene spites: 2 dreiecke , von hinten nicht gezeichnet
fertige spites: 2 dreiecke , von hinten nicht gezeichnet

Warum sind die eigenen schneller?
Amd 64 3200+ (939 winchester)
nvidea 6600gt (PCI-E)
1024 ddr400
200GB HDD
S
 

Dreamora

BeitragMi, Apr 27, 2005 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du bei eigenen dafür sorgen kannst, dass alle die die gleiche Textur haben auch auf der gleichen Surface sind.
Surfaces können relativ schnell Mal an der Performance ziehen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

lettorTrepuS

BeitragMi, Apr 27, 2005 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group