Code archives/3D Graphics - Mesh/Faster vertice manipulation
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
1> Thanks to BlackD for the idea!!!! In your code, replace vertexcolor, vertextexcoord and tertexcoord commands with vertexcolor2, vertextexcoord2 and tertexcoord2. Before rendering, use UPDATEMESHES(). After a few tests, i can tell you that if you are NOT doing much with a mesh other than updating it, you can actually lose speed using this technique. If you are updating a mesh which is pickable, and are picking, you get a massive increase. | |||||
Graphics3D 640,480,16,2 light=CreateLight() mesh=CreateSphere(8) Global dst# camera=CreateCamera() EntityFX mesh,3 MoveEntity camera,0,20,-30 PointEntity camera,mesh EntityPickMode mesh,2 sf=GetSurface(mesh,1) ms=MilliSecs() For n=1 To 2500 vert=Rand(0,CountVertices(sf)) VertexCoords(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) LinePick(0,0,0,1,1,1) Next ms2=MilliSecs() normalupdate=ms2-ms ms=MilliSecs() For n=1 To 2500 vert=Rand(0,CountVertices(sf)) VertexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) LinePick(0,0,0,1,1,1) Next updatemeshes() ms2=MilliSecs() Speedupdate=ms2-ms WireFrame 1 Repeat If mode=1 Then For n=1 To 1000 vert=Rand(0,CountVertices(sf)) VertexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) LinePick(0,0,0,1,1,1) Next updatemeshes Else For n=1 To 1000 vert=Rand(0,CountVertices(sf)) VertexCoords(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) LinePick(0,0,0,1,1,1) Next EndIf MoveEntity mesh,KeyDown(203)-KeyDown(205),0,KeyDown(200)-KeyDown(208) TurnEntity mesh,1,1,1 RenderWorld Text 0,0,dst Text 0,20,"Normal update:"+normalupdate Text 0,32,"Speed update:"+speedupdate Text 0,50,"Hit space to toggle mode" If KeyHit(57) Then mode=(mode+1) Mod 2 If mode=0 Then txt$="Normal" Else txt$="Speed" Text 0,62,"Current mode:"+txt$ Flip Until KeyDown(1) End ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Functions ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Type vertexupd Field commandindex Field surface,index,x#,y#,z# Field u#,v#,w#,coordset Field r#,g#,b#,a# End Type Function VertexCoords2(surface,index,x#,y#,z#) Local t.vertexupd t.vertexupd=New vertexupd t\commandindex=1 t\surface=surface t\index=index t\x=x t\y=y t\z=z End Function Function VertexTexCoords2(surface,index,u#,v#,w#=0,coord_set=0) Local t.vertexupd t.vertexupd=New vertexupd t\commandindex=2 t\surface=surface t\index=index t\u#=u t\v#=v t\w#=w t\coordset=coord_set End Function Function VertexColor2(surface,index,r#,g#,b#,a#=1) Local t.vertexupd t.vertexupd=New vertexupd t\commandindex=3 t\surface=surface t\index=index t\r=r t\g=g t\b=b t\a=a End Function Function updatemeshes() Local t.vertexupd Local dogrouped=1 For t.vertexupd=Each vertexupd Select t\commandindex Case 1 VertexCoords t\surface,t\index,t\x,t\y,t\z Case 2 VertexTexCoords t\surface,t\index,t\u,t\v,t\w,t\coordset Case 3 VertexColor t\surface,t\index,t\r,t\g,t\b,t\a End Select Delete t Next End Function |
Comments
| ||
Keep in mind that this:For n=1 To 1000 vert=Rand(0,CountVertices(sf)) VertexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) LinePick(0,0,0,1,1,1) Next updatemeshes is equivalent to this: For n=1 To 1000 LinePick(0,0,0,1,1,1) Next For n=1 To 1000 vert=Rand(0,CountVertices(sf)) VertexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) VertexTexCoords2(sf,vert,Rand(-10,10),Rand(-10,10),Rand(-10,10)) Next updatemeshes The increase in speed presumably happens because LinePick has some overhead when the entities it's concerned with change. An alternate (and marginally faster) optimization would be to perform all your LinePicks before you start moving vertices around. |
| ||
Ok there is an increase of the performance . But why do you do "LinePick(0,0,0,1,1,1)" ? What is the interest ? I don't undertsand in this particular case. it is just to demonstrate the improvement ? But what is the interset If we never use linepick in this way ? Thanks to clarify :) |
| ||
If you never use linepick, then you may not need the code :) Octothorpe. Yes its equivalent, However, Calling Linepick after updating a mesh forces the mesh to be uploaded to the card. Thats where there's a major improvement :) |
Code Archives Forum