From 07d57d7114cdf9d71f086cc1c5a31900e8ce5f5a Mon Sep 17 00:00:00 2001 From: Xottab-DUTY Date: Mon, 14 May 2018 15:40:01 +0500 Subject: [PATCH] Multithreading: use tbb::parallel_for to calculate RASTER-triangles Changed prefetch log --- src/Layers/xrRender/HOM.cpp | 42 +++++++++++-------- src/Layers/xrRender/ModelPool.cpp | 3 +- src/Layers/xrRender/ResourceManager.cpp | 11 ----- .../xrRender/ResourceManager_Loader.cpp | 2 +- src/xrEngine/IGame_Persistent.cpp | 14 ++++--- 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/Layers/xrRender/HOM.cpp b/src/Layers/xrRender/HOM.cpp index cf17abbef49..72828366710 100644 --- a/src/Layers/xrRender/HOM.cpp +++ b/src/Layers/xrRender/HOM.cpp @@ -3,6 +3,10 @@ ////////////////////////////////////////////////////////////////////// #include "stdafx.h" + +#include +#include + #include "HOM.h" #include "occRasterizer.h" #include "xrEngine/GameFont.h" @@ -93,26 +97,30 @@ void CHOM::Load() // Create RASTER-triangles m_pTris = xr_alloc(u32(CL.getTS())); - for (u32 it = 0; it < CL.getTS(); it++) + + tbb::parallel_for(tbb::blocked_range(0, CL.getTS()), [&](const auto& range) { - CDB::TRI& clT = CL.getT()[it]; - occTri& rT = m_pTris[it]; - Fvector& v0 = CL.getV()[clT.verts[0]]; - Fvector& v1 = CL.getV()[clT.verts[1]]; - Fvector& v2 = CL.getV()[clT.verts[2]]; - rT.adjacent[0] = (0xffffffff == adjacency[3 * it + 0]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 0]); - rT.adjacent[1] = (0xffffffff == adjacency[3 * it + 1]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 1]); - rT.adjacent[2] = (0xffffffff == adjacency[3 * it + 2]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 2]); - rT.flags = clT.dummy; - rT.area = Area(v0, v1, v2); - if (rT.area < EPS_L) + for (u32 it = range.begin(); it != range.end(); ++it) { - Msg("! Invalid HOM triangle (%f,%f,%f)-(%f,%f,%f)-(%f,%f,%f)", VPUSH(v0), VPUSH(v1), VPUSH(v2)); + CDB::TRI& clT = CL.getT()[it]; + occTri& rT = m_pTris[it]; + Fvector& v0 = CL.getV()[clT.verts[0]]; + Fvector& v1 = CL.getV()[clT.verts[1]]; + Fvector& v2 = CL.getV()[clT.verts[2]]; + rT.adjacent[0] = (0xffffffff == adjacency[3 * it + 0]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 0]); + rT.adjacent[1] = (0xffffffff == adjacency[3 * it + 1]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 1]); + rT.adjacent[2] = (0xffffffff == adjacency[3 * it + 2]) ? ((occTri*)(-1)) : (m_pTris + adjacency[3 * it + 2]); + rT.flags = clT.dummy; + rT.area = Area(v0, v1, v2); + + if (rT.area < EPS_L) + Msg("! Invalid HOM triangle (%f,%f,%f)-(%f,%f,%f)-(%f,%f,%f)", VPUSH(v0), VPUSH(v1), VPUSH(v2)); + + rT.plane.build(v0, v1, v2); + rT.skip = 0; + rT.center.add(v0, v1).add(v2).div(3.f); } - rT.plane.build(v0, v1, v2); - rT.skip = 0; - rT.center.add(v0, v1).add(v2).div(3.f); - } + }); // Create AABB-tree m_pModel = new CDB::MODEL(); diff --git a/src/Layers/xrRender/ModelPool.cpp b/src/Layers/xrRender/ModelPool.cpp index f351a3ea71d..4c52bd0a304 100644 --- a/src/Layers/xrRender/ModelPool.cpp +++ b/src/Layers/xrRender/ModelPool.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#pragma hdrstop #include "ModelPool.h" @@ -395,7 +394,7 @@ void CModelPool::Prefetch() // prefetch visuals string256 section; strconcat(sizeof(section), section, "prefetch_visuals_", g_pGamePersistent->m_game_params.m_game_type); - CInifile::Sect& sect = pSettings->r_section(section); + const CInifile::Sect& sect = pSettings->r_section(section); for (auto I = sect.Data.cbegin(); I != sect.Data.cend(); I++) { const CInifile::Item& item = *I; diff --git a/src/Layers/xrRender/ResourceManager.cpp b/src/Layers/xrRender/ResourceManager.cpp index 9ea1c5c98f1..5a716e1831e 100644 --- a/src/Layers/xrRender/ResourceManager.cpp +++ b/src/Layers/xrRender/ResourceManager.cpp @@ -348,23 +348,12 @@ void CResourceManager::DeferredUpload() if (!RDEVICE.b_is_Ready) return; -#ifndef MASTER_GOLD - Msg("%s, amount of textures: %d", __FUNCTION__, m_textures.size()); - - CTimer timer; - timer.Start(); -#endif - #ifndef USE_OGL tbb::parallel_for_each(m_textures, [&](auto m_tex) { m_tex.second->Load(); }); #else for (auto& texture : m_textures) texture.second->Load(); #endif - -#ifndef MASTER_GOLD - Msg("%s, texture loading time: %d ms", __FUNCTION__, timer.GetElapsed_ms()); -#endif } /* void CResourceManager::DeferredUnload () diff --git a/src/Layers/xrRender/ResourceManager_Loader.cpp b/src/Layers/xrRender/ResourceManager_Loader.cpp index 05a9426a375..268d5f8ac6e 100644 --- a/src/Layers/xrRender/ResourceManager_Loader.cpp +++ b/src/Layers/xrRender/ResourceManager_Loader.cpp @@ -2,7 +2,7 @@ #pragma hdrstop #include "ResourceManager.h" -#include "blenders\blender.h" +#include "blenders/blender.h" void CResourceManager::OnDeviceDestroy(BOOL) { diff --git a/src/xrEngine/IGame_Persistent.cpp b/src/xrEngine/IGame_Persistent.cpp index 3b933815421..d9475085abe 100644 --- a/src/xrEngine/IGame_Persistent.cpp +++ b/src/xrEngine/IGame_Persistent.cpp @@ -138,21 +138,23 @@ void IGame_Persistent::OnGameStart() void IGame_Persistent::Prefetch() { // prefetch game objects & models - float p_time = 1000.f * Device.GetTimerGlobal()->GetElapsed_sec(); - u32 mem_0 = Memory.mem_usage(); + CTimer timer; + timer.Start(); + const auto memoryBefore = Memory.mem_usage(); Log("Loading objects..."); ObjectPool.prefetch(); + Log("Loading models..."); GEnv.Render->models_Prefetch(); + Log("Loading textures..."); GEnv.Render->ResourcesDeferredUpload(); - p_time = 1000.f * Device.GetTimerGlobal()->GetElapsed_sec() - p_time; - u32 p_mem = Memory.mem_usage() - mem_0; + const auto memoryAfter = Memory.mem_usage() - memoryBefore; - Msg("* [prefetch] time: %d ms", iFloor(p_time)); - Msg("* [prefetch] memory: %dKb", p_mem / 1024); + Msg("* [prefetch] time: %d ms", timer.GetElapsed_ms()); + Msg("* [prefetch] memory: %d Kb", memoryAfter / 1024); } #endif