manuel.gysin Posted October 30, 2011 Posted October 30, 2011 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
frustum Posted October 30, 2011 Posted October 30, 2011 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.
manuel.gysin Posted October 30, 2011 Author Posted October 30, 2011 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
frustum Posted October 31, 2011 Posted October 31, 2011 What type of CPU do you use? This problem can be related to the hyper-threading. Or some background process.
manuel.gysin Posted October 31, 2011 Author Posted October 31, 2011 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
manuel.gysin Posted November 1, 2011 Author Posted November 1, 2011 New core i7 arrived, gona test it and report back later. :)
steve3d Posted November 9, 2011 Posted November 9, 2011 render_threads 0? Unigine support multi-threaded rendering now??
ulf.schroeter Posted November 9, 2011 Posted November 9, 2011 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
Recommended Posts