Jump to content

[SOLVED] World::update_multiple()


photo

Recommended Posts

Hello

 

 

While searching a bottleneck with fps I got this output from engine_analyze:

 

  total 	self         		total  	self
  seconds   seconds 	calls	ms/call	ms/call  name
  106.395   104.579  	8406	12.6570	12.4410  World::update_multiple()
5.425 	3.744  	8406 	0.6454 	0.4454  RenderRenderer::render_world(const char*,int)
2.179 	2.177 	84060 	0.0259 	0.0259  ObjectGrass::render(int,ObjectSurface*)
1.045 	1.045 	42030 	0.0249 	0.0249  ObjectGrass::flush(float)
1.151 	0.973 	84060 	0.0137 	0.0116  ObjectTerrain::render(int,ObjectSurface*)
0.974 	0.970  	8406 	0.1158 	0.1154  WorldSpatial::update()
0.849 	0.833  	7222 	0.1175 	0.1153  WorldSpatial::flush()
  107.758 	0.389  	8406	12.8192 	0.0463  World::update()
0.373 	0.373 	16812 	0.0222 	0.0222  ObjectTerrain::flush(float)
0.278 	0.277	151308 	0.0018 	0.0018  RenderState::setMaterial(int,Material*)
1.665 	0.264 	16812 	0.0991 	0.0157  RenderRenderer::render_deferred_surfaces(Vector<ObjectSurface*>&,int)
0.221 	0.209  	8406 	0.0263 	0.0249  ObjectSky::flush(float)
0.176 	0.176  	8406 	0.0210 	0.0210  ObjectWater::flush(float)
1.472 	0.169  	8406 	0.1751 	0.0201  RenderLights::renderDeferredLights(RenderScene*,RenderDeferred*,const Vector<Node*>&,int)
0.183 	0.145  	8406 	0.0217 	0.0172  RenderPost::renderComposite(Texture*,RenderDeferred*,Texture*,Texture*,Texture*,Texture*,Texture*,Texture*,Texture*,Texture*)
0.608 	0.140	420300 	0.0014 	0.0003  RenderRenderer::setObjectSurface(int,int,ObjectSurface*,Shader*,Material*)
0.978 	0.117  	7222 	0.1355 	0.0162  World::flush()
0.129 	0.113  	8406 	0.0153 	0.0134  RenderLights::get_light_world_shadow_surfaces(LightWorld*,const Vector<Node*>&)
1.073 	0.106  	8406 	0.1276 	0.0127  RenderLights::render_shadow_world(LightWorld*,Vector<ObjectSurface*>*)
0.103 	0.102  	7222 	0.0143 	0.0142  WorldSpatial::getCollision(const WorldBoundSphere&,Vector<Object*>&)
0.092 	0.092	428706 	0.0002 	0.0002  RenderRenderer::setShaderMaterialParameters(int)
0.163 	0.057  	7222 	0.0226 	0.0078  PhysicsScene::getIntersection(const BoundSphere&)
0.047 	0.047  	8406 	0.0056 	0.0056  RenderLights::set_light_world_parameters(LightWorld*)
0.043 	0.043	361458 	0.0001 	0.0001  RenderRenderer::setShaderParameters()
1.303 	0.041  	8406 	0.1550 	0.0048  RenderLights::render_deferred_light_world(LightWorld*,Material*,RenderDeferred*,const Vector<Node*>&,int)
0.035 	0.035 	58842 	0.0006 	0.0006  SortSurfaceShader(Vector<ObjectSurface*>&,int)
0.032 	0.032 	67248 	0.0005 	0.0005  MakeSurfaceChain(Vector<ObjectSurface*>&,int)
1.318 	0.031 	16812 	0.0784 	0.0018  RenderRenderer::render_ambient_surfaces(Vector<ObjectSurface*>&)
0.035 	0.030  	8406 	0.0041 	0.0035  RenderRenderer::render_deferred_queries(RenderScene*)
0.029 	0.029	243774 	0.0001 	0.0001  RenderLights::setShaderLightParameters(int)
0.037 	0.027  	8406 	0.0044 	0.0032  RenderPost::renderPostMaterial2D(Material*,const RenderPostTexture*)
1.498 	0.026  	8406 	0.1782 	0.0030  RenderRenderer::render_deferred_light(RenderScene*,RenderDeferred*,int)
0.183 	0.022 	33624 	0.0055 	0.0007  RenderRenderer::render_transparent(RenderScene*,RenderDeferred*,int,int)
0.026 	0.021  	8406 	0.0031 	0.0025  WorldSpatial::update_intersection(const WorldBoundFrustum&,Vector<Node*>&)
0.070 	0.019  	8406 	0.0084 	0.0023  WorldSpatial::getIntersection(const BoundFrustum&,const Mat4&,Vector<Node*>&)
0.966 	0.019 	33624 	0.0287 	0.0006  RenderLights::render_shadow_opacity_surfaces(Light*,Vector<ObjectSurface*>&)
0.019 	0.018 	50436 	0.0004 	0.0004  UpdateSurfaces(Vector<ObjectSurface*>&,const Vec3&)
2.686 	0.015  	8406 	0.3196 	0.0018  RenderRenderer::render_scene_opacity(RenderScene*,RenderDeferred*,int)
0.015 	0.015  	8406 	0.0018 	0.0018  RenderScene::update_intersection()
0.015 	0.014  	8406 	0.0018 	0.0017  RenderRenderer::render_visualizer(RenderScene*)
0.014 	0.014 	16812 	0.0008 	0.0008  WorldSpatial::getIntersection(const WorldBoundSphere&,int,Vector<Node*>&)
2.890 	0.014  	8406 	0.3438 	0.0016  RenderRenderer::render_scene(RenderScene*,RenderDeferred*,Texture*&,Texture*&,TextureRender*,int)
0.016 	0.014  	7222 	0.0022 	0.0019  Physics::simulation_multiple(float)
0.012 	0.012  	8406 	0.0015 	0.0015  ObjectSky::render(int,ObjectSurface*)
0.011 	0.011  	8406 	0.0013 	0.0013  WorldSpatial::getIntersection(const WorldBoundFrustum&,const Vec3&,float,Vector<Object*>&)
0.010 	0.010 	75654 	0.0001 	0.0001  RenderRenderer::setShaderMaterialAmbientParameters(int)
0.010 	0.010 	25218 	0.0004 	0.0004  SortLight(Vector<Light*>&)
0.009 	0.009  	8406 	0.0011 	0.0011  ObjectMesh::render(int,ObjectSurface*)
0.009 	0.009  	8406 	0.0011 	0.0011  RenderLights::render_forward_light_prob(const Vector<ObjectSurface*>&,const Vector<Node*>&,int)
0.190 	0.007  	8406 	0.0226 	0.0008  RenderRenderer::render_scene_transparent(RenderScene*,RenderDeferred*,int,int)
0.006 	0.006  	8406 	0.0007 	0.0007  SortSurfaceTransparent(Vector<ObjectSurface*>&,const vec3&)
0.011 	0.006 	16812 	0.0007 	0.0004  RenderRenderer::setShader(int,Shader*)
0.010 	0.006  	8406 	0.0012 	0.0007  RenderRenderer::render_deferred_decals(Vector<ObjectDecal*>&)
0.005 	0.005  	8406 	0.0006 	0.0006  RenderScene::optimize()
0.005 	0.004  	8406 	0.0006 	0.0005  World::update_intersection(const BoundFrustum&,const Mat4&,Vector<Node*>&)
0.004 	0.004  	8406 	0.0005 	0.0005  WorldSpatial::add_positions()
0.004 	0.004  	8406 	0.0004 	0.0004  SortDecalShader(Vector<ObjectDecal*>&,int)
0.004 	0.004  	8406 	0.0004 	0.0004  RenderLights::setShaderMaterialLightParameters(int)
0.012 	0.004  	8406 	0.0015 	0.0004  RenderLights::renderForwardOpacityLights(RenderScene*,const Vector<ObjectSurface*>&,const Vector<Node*>&,int)
0.003 	0.003  	8406 	0.0004 	0.0004  Physics::flush()
0.003 	0.003  	8406 	0.0004 	0.0003  RenderRenderer::render_ambient_decals(Vector<ObjectDecal*>&)
0.004 	0.003  	8406 	0.0005 	0.0003  RenderRenderer::setMaterial(int,Material*)
0.002 	0.002  	7222 	0.0003 	0.0003  PhysicsScene::restoreContacts()
0.002 	0.002  	8406 	0.0002 	0.0002  RenderPost::renderFade(Texture*)
0.001 	0.001  	8406 	0.0002 	0.0002  RenderLights::renderDecalLights(RenderScene*,Vector<ObjectDecal*>&)
0.001 	0.001 	16812 	0.0001 	0.0001  MakeImpostorChain(Vector<ObjectDecal*>&,int)
0.004	-0.015 	25218 	0.0001	-0.0006  WorldSpatial::getIntersection(const WorldBoundFrustum&,int,Vector<Node*>&)
0.026	-0.015	403488 	0.0001	-0.0000  RenderState::setMaterial(Material*)
0.081	-0.034  	8406 	0.0097	-0.0040  World::getIntersection(const BoundFrustum&,const Mat4&,Vector<Node*>&)
0.403	-1.022  	8406 	0.0479	-0.1216  RenderScene::getIntersection(BoundFrustum&,Occluder&,const Vector<Node*>&)
0.019	-1.260  	8406 	0.0022	-0.1499  PathFind::update()
1.203	-2.158  	7214 	0.1668	-0.2991  Physics::update()

 

My question is what is World::update_multiple() doing? And how I can find out while it takes so much time?

 

 

 

Thanks and greets

Manuel

Link to comment

All "*_analyze" functions are not working with multi-threading correctly. You should disable all engine multi-threading (render_threads 0, pathfind_threads 0, world_threads 0). Profiler uses rdtsc instruction which returns CPU ticks count. This value is different across the CPU threads. Because of that profiler have incorrect time values.

 

update_multiple() is a multi-threaded update function for Nodes. It updates all active Nodes (visible + physics + manual).

update_single() is a single-threaded analogue.

Link to comment
All "*_analyze" functions are not working with multi-threading correctly. You should disable all engine multi-threading (render_threads 0, pathfind_threads 0, world_threads 0). Profiler uses rdtsc instruction which returns CPU ticks count. This value is different across the CPU threads. Because of that profiler have incorrect time values. update_multiple() is a multi-threaded update function for Nodes. It updates all active Nodes (visible + physics + manual). update_single() is a single-threaded analogue.

 

Hello Frustum

 

 

Wow, thanks a lot for the fast answer!

I run the engine in single-threaded mode and there was no fps problem.

But when I switch back to world_threaded 1, fps drops on factor 10! That is strange.

 

Single: 600 FPS

Threaded: 60 FPS

 

 

Thanks again

Manuel

Link to comment
What type of CPU do you use? This problem can be related to the hyper-threading. Or some background process.

 

 

Hello Frustum

 

 

It's an AMD Phenom 2 X4, system is debian sid with linux kernel 3.0 x86_64.

 

 

Greets

Manuel

Link to comment

Unigine support multi-threaded rendering now??

 

Object culling and update operations can accelerated with multiple threads, the actual rendering (submission of draw calls) will be handled single-threaded

Link to comment
×
×
  • Create New...