Hallo ...
meine ersten versuche mit 3D in GLBasic. Um weitere Tests für die Object Optimierung zu machen. Wäre es gut wenn ihr den Code mal ausfürt und Postet wiefiel Quad und FPS bei euch rauskommt. Das Programm nähert sich an die 30 FPS grenze an und bleibt dann bei einer gewissen anzahl Quad stehen.
ich habe einen : P4 HT 2.8 GHz mit 2 GB Ram und Radeon X1600, macht 6480 Quad bei 28 FPS
// --------------------------------- //
// Project: First3D
// Start: Friday, August 10, 2007
// IDE Version: 4.254
LIMITFPS -1
donut = 0
sphere = 1
// Donut machen
CreateCube(donut, 1, RGB(255,255,255))
// CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Kugel machen
CreateCube(sphere, 24, RGB(255,255,255))
LOCAL mx, my, b1, b2
fpse=0
fps=-1
WHILE TRUE
// 3000 ist weit genug hier
X_MAKE3D 1, 3000, 65
// ein Winkel für alles
phi = GETTIMERALL() / 150
X_CAMERA 800,800,800, 0,0,0
X_SPOT_LT 0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180
// Ringelreihen
FOR i=0 TO kl1
psi = phi + i/kl1*360
px = SIN(psi)*300
py = COS(psi)*300
pz = (SIN(psi)+COS(psi)*2)*300
// bewegen und bisserl drehen
X_MOVEMENT px, py, pz
X_ROTATION psi*40, 3,4,5
// Jetzt relaitv zum Torus die Kugeln
X_PUSHMATRIX
FOR j=0 TO 29
X_MOVEMENT SIN(j/29*360)*150, 0, COS(j/29*360)*150
X_SCALING .3, .3, .3
X_DRAWOBJ sphere, 0
NEXT
X_POPMATRIX
X_DRAWOBJ donut,0
NEXT
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF
X_MAKE2D
PRINT fps+" Frames "+i*j+" Quads",10,100
IF fps>30 AND fpse=0
INC kl1,1
ELSEIF fps>-1
fpse=1
ENDIF
SHOWSCREEN
WEND
// ------------------------------------------------------------- //
// -=# SPHERE #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
pi = ACOS(0)*2
IF r < 0 THEN r = -r
IF n < 4 THEN n = 4
X_AUTONORMALS 2 // smooth edges
X_OBJSTART num
FOR j=0 TO INTEGER(n/2) -1
theta1 = j * 2*pi / n - pi/2;
theta2 = (j + 1) * 2*pi / n - pi/2;
FOR i=0 TO n
theta3 = i * 2*pi / n;
X_OBJADDVERTEX r*COS(theta2) * COS(theta3), r*SIN(theta2), _
r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
X_OBJADDVERTEX r*COS(theta1) * COS(theta3), r*SIN(theta1), _
r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
NEXT
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION // n
// ------------------------------------------------------------- //
// -=# CREATETORUS #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
// Diese Variablen sind als LOCAL definiert:
// x, y,
// Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r
X_AUTONORMALS 2
X_OBJSTART num
FOR di=0 TO NumWraps-1
FOR j=0 TO NumPerWrap
FOR i=di+1 TO di STEP -1
wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
wrapFracTex = j/NumPerWrap
phi = 360*wrapFrac
thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
thetaFracTex = (i+wrapFracTex)/NumWraps
theta = 360*thetaFrac
r = MajorRadius + MinorRadius*COS(phi)
x = SIN(theta)*r
z = COS(theta)*r
y = MinorRadius*SIN(phi)
X_OBJADDVERTEX x,y,z, thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
RGB(255, 255, 255)
NEXT
NEXT
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION
// ------------------------------------------------------------- //
// -=# CREATECUBE #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz, sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, sz, sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND
ENDFUNCTION // sz
// ------------------------------------------------------------- //
// -=# CREATECYLINDER - also creates a cone if any radius = 0 #=-
// ------------------------------------------------------------- //
FUNCTION CreateCylinder: num, baseRadius, topRadius, height, slices, stacks, col
LOCAL da, r, dr, dz, x, y, z, i, j
LOCAL x1, y1, x2, y2
da = 360 / slices
dr = (topRadius-baseRadius) / stacks
dz = height / stacks
X_OBJSTART num
FOR i=0 TO slices-1
x1 = COS(i*da)
y1 = SIN(i*da)
x2 = COS((i+1)*da)
y2 = SIN((i+1)*da)
z = 0
r = baseRadius
// Bottom lid
IF baseRadius>0
X_OBJADDVERTEX 0, 0, 0, .5, .5, col
X_OBJADDVERTEX x1*r, y1*r, 0, x1/2+.5, y1/2+.5, col
X_OBJADDVERTEX x2*r, y2*r, 0, x2/2+.5, y2/2+.5, col
X_OBJNEWGROUP
ENDIF
// side
FOR j=0 TO stacks
X_OBJADDVERTEX x2*r, y2*r, z, (i+1)/slices, j/stacks, col
X_OBJADDVERTEX x1*r, y1*r, z, i /slices, j/stacks, col
z = z+dz
r = r+dr
NEXT
// Top lid
IF topRadius>0
X_OBJNEWGROUP
X_OBJADDVERTEX x2*r, y2*r, height, x2/2+.5, y2/2+.5, col
X_OBJADDVERTEX x1*r, y1*r, height, x1/2+.5, y1/2+.5, col
X_OBJADDVERTEX 0, 0, height, .5, .5, col
ENDIF
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION
4500 bei 28 fps
sieht ja chic aus ;), was wird das, wenns fertig ist?
Achja, bei mir 40 FPS und 9390 Quads, was immer das heißen mag.
Hi ....
@Quentin was hast du für einen rechner?
das ist nur ein Test .... brauche ich um die maximale anzahl CopyObjeted zu ermitteln.
Core Duo 1,86 hat mein Schlapptöpfchen, mit mäßiger Geforce 7600
Hi ...
ist aber flott auf den Beinen.
FPS: 26
Quads: 7530
Hi ...
und jetzt das ganze noch etwas aufgepeppt. Alpha und so.
// --------------------------------- //
// Project: First3D
// Start: Friday, August 10, 2007
// IDE Version: 4.254
LIMITFPS -1
donut = 0
sphere = 1
//LOADFONT "smalfont.bmp",1
// Donut machen
CreateCube(donut, 24, RGB(255,255,255))
// CreateTorus(donut, 12, 24, 12, 9, 2, 1)
// Kugel machen
CreateCube(sphere, 24, RGB(255,255,255))
LOCAL mx, my, b1, b2
fpse=0
fps=-1
DIM s[30]
DIM c[30]
FOR i =0 TO 29
s[i]=SIN(i/29*360)*150
c[i]=COS(i/29*360)*150
NEXT
WHILE TRUE
// 1000 ist weit genug hier
X_MAKE3D 1, 3000, 65
// ein Winkel für alles
phi = GETTIMERALL() / 650
X_CAMERA 800,800,800, 0,0,0
X_SPOT_LT 0, RGB(0,255,255), 0,0,0, -1,-1,-1, 180
// Ringelreihen
FOR i=0 TO kl1
psi = phi + i/kl1*360
px = SIN(psi)*300
py = COS(psi)*300
pz = (SIN(psi)+COS(psi)*2)*300
// bewegen und bisserl drehen
X_MOVEMENT px, py, pz
X_ROTATION psi*40, 3,4,5
// Jetzt relaitv zum Torus die Kugeln
X_PUSHMATRIX
FOR j=0 TO 29
X_MOVEMENT s[j], 0, c[j]
X_SCALING .3, .3, .3
ALPHAMODE .1
X_DRAWOBJ sphere, 0
NEXT
X_POPMATRIX
X_DRAWOBJ donut,0
NEXT
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF
X_MAKE2D
PRINT fps+" Frames "+i*j+" Quads",10,100
IF fps>30 AND fpse=0
INC kl1,1
ELSEIF fps>-1
fpse=1
ENDIF
SHOWSCREEN
WEND
//END
// ------------------------------------------------------------- //
// -=# SPHERE #=-
// ------------------------------------------------------------- //
FUNCTION CreateSphere: num, r, n, col
LOCAL i,j, theta1, theta2, theta3, pi
pi = ACOS(0)*2
IF r < 0 THEN r = -r
IF n < 4 THEN n = 4
X_AUTONORMALS 2 // smooth edges
X_OBJSTART num
FOR j=0 TO INTEGER(n/2) -1
theta1 = j * 2*pi / n - pi/2;
theta2 = (j + 1) * 2*pi / n - pi/2;
FOR i=0 TO n
theta3 = i * 2*pi / n;
X_OBJADDVERTEX r*COS(theta2) * COS(theta3), r*SIN(theta2), _
r*COS(theta2) * SIN(theta3), i/n, 2*(j+1)/n, col
X_OBJADDVERTEX r*COS(theta1) * COS(theta3), r*SIN(theta1), _
r*COS(theta1) * SIN(theta3), i/n, 2*j/n, col
NEXT
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION // n
// ------------------------------------------------------------- //
// -=# CREATETORUS #=-
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
// Diese Variablen sind als LOCAL definiert:
// x, y,
// Draw the torus
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r
X_AUTONORMALS 2
X_OBJSTART num
FOR di=0 TO NumWraps-1
FOR j=0 TO NumPerWrap
FOR i=di+1 TO di STEP -1
wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
wrapFracTex = j/NumPerWrap
phi = 360*wrapFrac
thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
thetaFracTex = (i+wrapFracTex)/NumWraps
theta = 360*thetaFrac
r = MajorRadius + MinorRadius*COS(phi)
x = SIN(theta)*r
z = COS(theta)*r
y = MinorRadius*SIN(phi)
X_OBJADDVERTEX x,y,z, thetaFracTex*TextureWrapVert, wrapFracTex*TextureWrapHoriz, _
RGB(255, 255, 255)
NEXT
NEXT
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION
// ------------------------------------------------------------- //
// -=# CREATECUBE #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz, sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, sz, sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND
ENDFUNCTION // sz
// ------------------------------------------------------------- //
// -=# CREATECYLINDER - also creates a cone if any radius = 0 #=-
// ------------------------------------------------------------- //
FUNCTION CreateCylinder: num, baseRadius, topRadius, height, slices, stacks, col
LOCAL da, r, dr, dz, x, y, z, i, j
LOCAL x1, y1, x2, y2
da = 360 / slices
dr = (topRadius-baseRadius) / stacks
dz = height / stacks
X_OBJSTART num
FOR i=0 TO slices-1
x1 = COS(i*da)
y1 = SIN(i*da)
x2 = COS((i+1)*da)
y2 = SIN((i+1)*da)
z = 0
r = baseRadius
// Bottom lid
IF baseRadius>0
X_OBJADDVERTEX 0, 0, 0, .5, .5, col
X_OBJADDVERTEX x1*r, y1*r, 0, x1/2+.5, y1/2+.5, col
X_OBJADDVERTEX x2*r, y2*r, 0, x2/2+.5, y2/2+.5, col
X_OBJNEWGROUP
ENDIF
// side
FOR j=0 TO stacks
X_OBJADDVERTEX x2*r, y2*r, z, (i+1)/slices, j/stacks, col
X_OBJADDVERTEX x1*r, y1*r, z, i /slices, j/stacks, col
z = z+dz
r = r+dr
NEXT
// Top lid
IF topRadius>0
X_OBJNEWGROUP
X_OBJADDVERTEX x2*r, y2*r, height, x2/2+.5, y2/2+.5, col
X_OBJADDVERTEX x1*r, y1*r, height, x1/2+.5, y1/2+.5, col
X_OBJADDVERTEX 0, 0, height, .5, .5, col
ENDIF
X_OBJNEWGROUP
NEXT
X_OBJEND
ENDFUNCTION
Bei beiden Mehtoden, 24 FPS und 2500. Eine Auslastung von knapp 35% auf beide Prozessoren.
Rechner: Intel E6300, 1.86 GHz, 2 GB Ram, NVIDA 7950 GT, 512 MB Ram
OS: Windows XP Home
Wieso ist meine Kiste so langsam?
4400 bei 30 fps
Hi ....
das mit den unterschiedlichen geschwindigkeiten ist zum teile eine alte Windows Macke. Ich kann manchmal nur durch setzten eines zusätzlichen Zeichens im Quellcode die geschwindigkeit um 30-40% erhöhen. Ich weis nicht wie das zusammen hängt.
In ASM war es so, das es sich dabei um das problem der ungraden und graden Speicheradressen und des Programm anfangs handelte. Aber moderne Rechner sollten imme auf `4 Adressen den Code ablegen. Auch der Compiller solte darauf achten das einsprungadressen auf `4 erweitert werden, und gegebenenfala füll bytes in form von NOP anweisungen einschieben.
Warum jetzt der DualCore so langsam ist. Kann am Shared Ram liegen, wenn es sich dabei um einen Laptop handelt. Es gibt welche die haben 64 MB eigenens Ram und können mit bis zu 256 MB Shared zusätzlich anfordern. Das ist dann aber ein Nadelöhr.
Hi ..
FPS ist ja klar. Die anzahl Quad sind die sichtbaren und bewegten Quader. Blitz schafft etwa 75% dafon was GLBasic hinbekommt.
mit der neuen Version 30 FPS bei 11610 quads
sieht klasse aus. das Gebilde erinnert mich ein wenig an die Jahreshauptversammlung aller Borg-Kuben ;)
@Kidpaddle
das ist in der Tat seltsam. Gleicher Proz und du hast mehr RAM und eine bessere Graka. Bist du sicher, daß nicht einer der Proze bei der Bahn-Gewerkschaft ist? ;)
Hi ...
werde auch der Quad Master genannt. :-)
Also, bei mir:
9810 Quads bei 28 FPS...
Sieht aber super aus!
21 und 2130 quads
naja is auch nur ne Geforce 7300LE 50% CPU Auslastung bei einem X2 4600+