Main forum > Beta Tests

Speed bitte

(1/4) > >>

tft:
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


--- Code: (glbasic) ---// --------------------------------- //
// 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
--- End code ---

D2O:
4500 bei 28 fps

Quentin:
sieht ja chic aus ;), was wird das, wenns fertig ist?

Achja, bei mir 40 FPS und 9390 Quads, was immer das heißen mag.

tft:
Hi ....

@Quentin was hast du für einen rechner?

das ist nur ein Test .... brauche ich um die maximale anzahl CopyObjeted zu ermitteln.

Quentin:
Core Duo 1,86 hat mein Schlapptöpfchen, mit mäßiger Geforce 7600

Navigation

[0] Message Index

[#] Next page

Go to full version