OK, using that function I was able to notice maybe 10 FPS difference by using more polygons since my machine seems to cap at 121 FPS. Using the AddSufaceToMesh() I got 121 still (without the second mesh, which I added since you can only have so many verts per mesh). Without it I got 108-110 FPS. If I add the second mesh called mesh_two and surface_two to jump the polygons up to 114,000 I get about 63 FPS using AddSurfaceToMesh() and about 57 normally.
It seems to me that the surface count may only make big differences on older video cards. I'm running a GeForce 3 Ti 200 and while there is a difference, it isn't huge.
Check this out:
screen_width=640
screen_height=480
Graphics3D(screen_width,screen_height,16,1)
camera=CreateCamera()
PositionEntity(camera,80,150,80)
RotateEntity(camera,90,0,0)
mesh=CreateMesh()
surface=CreateSurface(mesh)
mesh_two=CreateMesh()
surface_two=CreateSurface(mesh_two)
For i=1 To 160 Step 10
For j=1 To 160 Step 10
sphere=CreateSphere(8)
PositionMesh(sphere,i,0,j)
;AddMeshToSurface(sphere,mesh,surface)
;FreeEntity(sphere)
sphere=CreateSphere(8)
PositionMesh(sphere,i,0,j)
;AddMeshToSurface(sphere,mesh_two,surface_two)
;FreeEntity(sphere)
Next
Next
While KeyDown(1)=0
RenderWorld
Gosub Framerate
Flip
Wend
;====== FRAMERATE ========================================================
.Framerate
fps_counter=fps_counter+1
If framecounter_time=0 Then framecounter_time=MilliSecs()
If framecounter_time+1001<MilliSecs()
framerate=fps_counter
machine_framerate=framerate
fps_counter=0
framecounter_time=MilliSecs()
last_framerate=framerate
EndIf
Text ((screen_width*280)/640),((screen_height*430)/480),"Polygons "+TrisRendered()
Text ((screen_width*280)/640),((screen_height*450)/480),"FPS-- "+framerate
Return
;=========================================================================
;====== ADD MESH TO SURFACE ==============================================
Function AddMeshToSurface(SrcMesh, DestMesh, DestSurface, Voffsetx#=0, Voffsety#=0, Voffsetz#=0, Vpitch#=0, Vyaw#=0, Vroll#=0, Vscalex#=1, Vscaley#=1, VscaleZ#=1)
; Determine if we can optimize the mesh copying.
TransformVertices = True
If (Vpitch#=0) And (Vyaw#=0) And (Vroll#=0)
TransformVertices = False
EndIf
; Make sure there's a surface to copy, because the mesh might be empty.
If CountSurfaces(SrcMesh) > 0
SrcSurface = GetSurface(SrcMesh, 1)
DestVerts = CountVertices(DestSurface)
SrcVerts = CountVertices(SrcSurface)
; If we need to transform the vertices in a complex way...
If TransformVertices
; Do slower copy method because we need to rotate the vertices.
; Create a pivot to do the transformations with.
ThisPivot = CreatePivot()
PositionEntity ThisPivot, Voffsetx#, Voffsety#, Voffsetz#, True
RotateEntity ThisPivot, Vpitch#, Vyaw#, Vroll#, True
ScaleEntity ThisPivot, Vscalex#, Vscaley#, Vscalez#
; Copy all the vertices from the source mesh to the destination surface.
For VertLoop = 0 To SrcVerts-1
Vu# = VertexU#(SrcSurface, VertLoop)
Vv# = VertexV#(SrcSurface, VertLoop)
Vw# = VertexW#(SrcSurface, VertLoop)
Vr = VertexRed(SrcSurface, VertLoop)
Vg = VertexGreen(SrcSurface, VertLoop)
Vb = VertexBlue(SrcSurface, VertLoop)
TFormPoint VertexX#(SrcSurface, VertLoop), VertexY#(SrcSurface, VertLoop), VertexZ#(SrcSurface, VertLoop), ThisPivot, 0
Vx# = TFormedX#()
Vy# = TFormedY#()
Vz# = TFormedZ#()
TFormNormal VertexNX#(SrcSurface, VertLoop), VertexNY#(SrcSurface, VertLoop), VertexNZ#(SrcSurface, VertLoop), ThisPivot, 0
Vnx# = TFormedX#()
Vny# = TFormedY#()
Vnz# = TFormedZ#()
AddVertex(DestSurface, Vx#, Vy#, Vz#, Vu#, Vv#, Vw#)
VertexNormal(DestSurface, VertLoop+DestVerts, Vnx#, Vny#, Vnz#)
VertexColor(DestSurface, VertLoop+DestVerts, Vr, Vg, Vb)
Next
FreeEntity ThisPivot
Else
; Do the fast copy.
; Fast copy can do offset and scaling, but not rotation.
; Copy all the vertices from the source mesh to the destination surface.
For VertLoop = 0 To SrcVerts-1
Vx# = VertexX#(SrcSurface, VertLoop)
Vy# = VertexY#(SrcSurface, VertLoop)
Vz# = VertexZ#(SrcSurface, VertLoop)
Vu# = VertexU#(SrcSurface, VertLoop)
Vv# = VertexV#(SrcSurface, VertLoop)
Vw# = VertexW#(SrcSurface, VertLoop)
Vnx# = VertexNX#(SrcSurface, VertLoop)
Vny# = VertexNY#(SrcSurface, VertLoop)
Vnz# = VertexNZ#(SrcSurface, VertLoop)
Vr = VertexRed(SrcSurface, VertLoop)
Vg = VertexGreen(SrcSurface, VertLoop)
Vb = VertexBlue(SrcSurface, VertLoop)
AddVertex(DestSurface, (Vx#*Vscalex#)+Voffsetx#, (Vy#*Vscaley#)+Voffsety#, (Vz#*Vscalez#)+Voffsetz#, Vu#, Vv#, Vw#)
VertexNormal(DestSurface, VertLoop+DestVerts, Vnx#, Vny#, Vnz#)
VertexColor(DestSurface, VertLoop+DestVerts, Vr, Vg, Vb)
Next
EndIf
; Copy all triangles from the source surface to the destination surface.
SrcTris = CountTriangles(SrcSurface)
For TriLoop = 0 To SrcTris-1
V0 = TriangleVertex(SrcSurface, TriLoop, 0)
V1 = TriangleVertex(SrcSurface, TriLoop, 1)
V2 = TriangleVertex(SrcSurface, TriLoop, 2)
AddTriangle(DestSurface, V0+DestVerts, V1+DestVerts, V2+DestVerts)
Next
EndIf
End Function
;=========================================================================
|