Показать сообщение отдельно
Старый 24.01.2013, 22:47   #149
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Советы по оптимизации

Извиняюсь, что на тему подзабил, выкидываю екзешник и исходник в спойлере.

Мой вывод был правильный, не создавайте геморой. Максимум что можно помудрить - это разбиение на секторы. И то, надо ли это... Вряд ли ктото будет делать Обливион или Фалаут )

Погоняйте пример, мне показалось что Хайд ентити чуть быстрее работает чем Альфа(0). Тестил в углу на 3к кубиках и Хайд выиграл на пару сотен кубиков )


Global n=30000			;Число кубиков   count of cubes
;=========================
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global camAX#,camAY#
PositionEntity camera,0,0,-10
RotateEntity camera,0,0,0
CameraRange camera,0.1,400
lit=CreateLight()

Type mesh
	Field mesh
	Field x#,y#,z#
	Field ax,ay,az
	Field scale#
	Field r,g,b
End Type

Global cube=CreateCube()

For i=1 To n
	mesh.mesh=New mesh
	mesh\mesh=CopyMesh(cube)
	mesh\x=Rnd(-200,200)
	mesh\z=Rnd(-200,200)
	mesh\ay=Rand(0,360)
	mesh\scale=Rnd(0.2,0.4)
	mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
		PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
		ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
		RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
		EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
	EntityAutoFade mesh\mesh,200,200
Next

Global distPivot=CreatePivot()

Global mode=0 
Global time,timeMean#,timeHAF
Global f1=MilliSecs()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
While Not KeyHit(1)
frame=MilliSecs()
CameraControl(camera)
If mode=1 Then AutoHFade(500)
timeHAF=MilliSecs()-frame
RenderWorld

If KeyHit(57) Then 
	mode=mode+1
	RestoreAllMesh()
	If mode=2 Then HideAllMesh(n-3000)
	If mode=4 Then AlphaAllMesh(0,n-3000)
	If mode>4 Then mode=0
EndIf

Text 5,10,"Tris: "+TrisRendered()
Text 5,30,"Cubes: "+TrisRendered()/12
If time=0 Then time=17
fps=1000/time
timeMean=(timeMean+time)/2
Text 5,50,"FPS: "+fps+"    "+1000/timeMean
Text 5,70,"Mode: "+mode
Select mode
	Case 0 : modeStr$="normal auto fade"
	Case 1 : modeStr$="delete auto fade"
	Case 2 : modeStr$="hide entity"
	Case 3 : modeStr$="normal auto fade"
	Case 4 : modeStr$="Alpha = 0"
End Select
Text 5,90,"Mode: "+modeStr
Text 5,140,"AutoHFade time: "+timeHAF
Color 200,100,100 : Text GraphicsWidth()/2,300,"Key SPACE to switch mode!" : Color 255,255,255
Flip 
time=MilliSecs()-frame
Wend
End

Function CameraControl(cam)
	camAX=camAX-MouseXSpeed()*0.3
	camAY=camAY+MouseYSpeed()*0.3
	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
	RotateEntity cam,camAY,camAX,0
	MoveEntity cam,(KeyDown(205)-KeyDown(203))*3,0,(KeyDown(200)-KeyDown(208))*3
End Function

Function HideAllMesh(n)
m=0
For mesh.mesh=Each mesh
	m=m+1
	If m<n Then HideEntity mesh\mesh
Next
End Function 

Function AlphaAllMesh(alp#,n)
m=0
For mesh.mesh=Each mesh
	m=m+1
	If m<n Then EntityAlpha mesh\mesh,alp
Next
End Function 

Function RestoreAllMesh()
For mesh.mesh=Each mesh
	If mesh\mesh=0 Then 
		mesh\mesh=CreateCube()
		PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
		ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
		RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
		EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b	
	EndIf
	ShowEntity mesh\mesh
	EntityAlpha mesh\mesh,1
	EntityAutoFade mesh\mesh,200,200
	If mode<>0 Then EntityAutoFade mesh\mesh,1000,1000	
Next
End Function

Function AutoHFade(n)
For i=1 To n
	mesh.mesh=First mesh
	dx=mesh\x-EntityX(camera)
	dy=mesh\y-EntityY(camera)
	dz=mesh\z-EntityZ(camera)
	dist=Sqr(dx*dx+dy*dy+dz*dz)
	If dist>200 Then 
			FreeEntity(mesh\mesh) : mesh\mesh=0
		Else
			If mesh\mesh=0 Then 
				mesh\mesh=CreateCube()
				PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
				ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
				RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
				EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b	
			EndIf		
	EndIf
	Insert mesh.mesh After Last mesh
Next
End Function


Компиль http://www.sendspace.com/file/ia8zkw
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Arton (24.01.2013)