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

Отчет!!
Ну что, господа булочники)

Начну со слов Джокера
Мудрость предыдущих поколений блитцеров гласит:
не используй HideEntity без крайней нужды ибо тормазит оно, используй EntityAlpha(0) вместо него, да ускорится программа твоя.
Эта легенда не оправдалась.
У меня терпения хватило на 50к кубиков.
Скрытие в Ксорс, что с помощью xHideEntity (fps-60) ,что с помощью xEntityAlpha (fps-60)
Блитц HideEntity (fps-58 ) , EntityAlpha (fps-58 )
Легенда разрушена!!

Зато порадовала производительность Ксорса, она выше блитца на + 20%
Тест на 40к кубиков, результат отдаление с AutoFade
Blitz 4к кубиков - fps(20)
Xors 5к кубиков - fps(20)

Blitz 15к кубиков - fps(6-7)
Xors 15к кубиков - fps(8-9)
семпл блитца
Global n=15000 ;Число кубиков 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
lit=CreateLight()

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

For i=1 To n
mesh.mesh=New mesh
mesh\mesh=CreateCube()
dist#=Rnd(10,200)
mesh\x=Rnd(-dist,dist)
mesh\z=dist
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,210,210
Next

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

If KeyHit(57) Then
mode=mode+1
RestoreAllMesh()
If mode=1 Then HideAllMesh()
If mode=3 Then AlphaAllMesh(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
Text GraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
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(20)*3
End Function

Function HideAllMesh()
For mesh.mesh=Each mesh
HideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
EntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
ShowEntity mesh\mesh
EntityAlpha mesh\mesh,1
Next
End Function

семпл ксорса

Global n=15000 ;Число кубиков count of cubes
;=========================
xGraphics3D 1024,768,32,1,0
xCreateLog(1,1,"xors_log.html")
Include "./incl/maxMode3d.bb"
xSetTextureFiltering TF_ANISOTROPIC
xSetBuffer xBackBuffer()

Global camera=xCreateCamera()
Global camAX#,camAY#
xPositionEntity camera,0,2,-10
lit=xCreateLight()

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

For i=1 To n
mesh.mesh=New mesh
mesh\mesh=xCreateCube();xCreateSphere(4)
dist#=Rnd(10,200)
mesh\x=Rnd(-dist,dist)
mesh\z=dist
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)
xPositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
xScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
xRotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
xEntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
xEntityAutoFade mesh\mesh,200,200
Next

Global mode=0
Global time,timeMean#
While Not xKeyHit(1)
frame=xMillisecs()
CameraControl(camera)
xRenderWorld

If xKeyHit(KEY_SPACE) Then
mode=mode+1
RestoreAllMesh()
If mode=1 Then HideAllMesh()
If mode=3 Then AlphaAllMesh(0)
EndIf

xText 5,10,"Tris: "+xTrisRendered()
xText 5,30,"Cubes: "+xDIPCounter()
xText 5,50,"FPS: "+xGetFPS()
If time=0 Then time=17
timeMean=(timeMean+time)/2
xText 5,70,"Mode: "+mode
xText xGraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
xFlip
time=frame
Wend
End

Function CameraControl(cam)
camAX=camAX-xMouseXSpeed()*0.3
camAY=camAY+xMouseYSpeed()*0.3
xRotateEntity cam,camAY,camAX,0
xMoveEntity cam,xKeyDown(KEY_RIGHT)-xKeyDown(KEY_LEFT),0,xKeyDown(KEY_UP)-xKeyDown(KEY_DOWN)
End Function

Function HideAllMesh()
For mesh.mesh=Each mesh
xHideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
xEntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
xShowEntity mesh\mesh
xEntityAlpha mesh\mesh,1
Next
End Function


Щас попробовал написать такую функцию:
Function AutoHFade(n)
For i=1 To n
	mesh.mesh=First mesh
	If EntityDistance(camera,mesh\mesh)>200 Then 
		HideEntity(mesh\mesh)
		Else
		ShowEntity(mesh\mesh)
	EndIf
	Insert mesh.mesh After Last mesh
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


сам семпл bb

Global n=15000			;Число кубиков   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
lit=CreateLight()

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

For i=1 To n
	mesh.mesh=New mesh
	mesh\mesh=CreateCube()
	dist#=Rnd(10,200)
	mesh\x=Rnd(-dist,dist)
	mesh\z=dist
	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
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)
AutoHFade(500)
timeHAF=xMillisecs()-frame
RenderWorld

If KeyHit(57) Then 
	mode=mode+1
	RestoreAllMesh()
	If mode=1 Then HideAllMesh()
	If mode=3 Then AlphaAllMesh(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
Text 5,120,"AutoHFade time: "+timeHAF
Text GraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
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()
For mesh.mesh=Each mesh
	HideEntity mesh\mesh
Next
End Function 

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
	EntityAlpha mesh\mesh,alp
Next
End Function 

Function RestoreAllMesh()
For mesh.mesh=Each mesh
	ShowEntity mesh\mesh
	EntityAlpha mesh\mesh,1
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

Я выполняю xFreeEntity(), а в диспечере смотрю за оперативкой и за процессором, там ничего не меняется!!
Че за фигня?!
У меня только один вывод, не придумывайте себе геморой, как это делаю я. Используйте меньше ентити и ЛОДы. Ибудет счастье!!
__________________

Последний раз редактировалось burovalex, 15.01.2013 в 14:42.
(Offline)
 
Ответить с цитированием