mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-24 08:00:14 +00:00
Defer normal map generation to reduce GPU model upload stalls by ~50%
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run
Each loadTexture call was generating a normal/height map inline (3 full-image passes: luminance + blur + Sobel). For models with 15-20 textures this added 30-40ms to the 70ms model upload. Now deferred to a per-frame budget (2/frame in-game, 10/frame during load screen). Models render without POM until their normal maps are ready.
This commit is contained in:
parent
faca22ac5f
commit
24f2ec75ec
3 changed files with 62 additions and 9 deletions
|
|
@ -922,14 +922,20 @@ void Application::update(float deltaTime) {
|
|||
auto t3 = std::chrono::steady_clock::now();
|
||||
processDeferredEquipmentQueue();
|
||||
auto t4 = std::chrono::steady_clock::now();
|
||||
// Process deferred normal maps (2 per frame to spread CPU cost)
|
||||
if (auto* cr = renderer ? renderer->getCharacterRenderer() : nullptr) {
|
||||
cr->processPendingNormalMaps(2);
|
||||
}
|
||||
auto t5 = std::chrono::steady_clock::now();
|
||||
float pMs = std::chrono::duration<float, std::milli>(t1 - t0).count();
|
||||
float cMs = std::chrono::duration<float, std::milli>(t2 - t1).count();
|
||||
float nMs = std::chrono::duration<float, std::milli>(t3 - t2).count();
|
||||
float eMs = std::chrono::duration<float, std::milli>(t4 - t3).count();
|
||||
float total = pMs + cMs + nMs + eMs;
|
||||
float nmMs = std::chrono::duration<float, std::milli>(t5 - t4).count();
|
||||
float total = pMs + cMs + nMs + eMs + nmMs;
|
||||
if (total > 4.0f) {
|
||||
LOG_WARNING("spawn/equip breakdown: player=", pMs, "ms creature=", cMs,
|
||||
"ms npcComposite=", nMs, "ms equip=", eMs, "ms");
|
||||
"ms npcComposite=", nMs, "ms equip=", eMs, "ms normalMaps=", nmMs, "ms");
|
||||
}
|
||||
});
|
||||
// Self-heal missing creature visuals: if a nearby UNIT exists in
|
||||
|
|
@ -4250,6 +4256,9 @@ void Application::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
processCreatureSpawnQueue();
|
||||
processAsyncNpcCompositeResults();
|
||||
processDeferredEquipmentQueue();
|
||||
if (auto* cr = renderer ? renderer->getCharacterRenderer() : nullptr) {
|
||||
cr->processPendingNormalMaps(10); // higher budget during load screen
|
||||
}
|
||||
|
||||
// Process ALL pending game object spawns (no 1-per-frame cap during load screen).
|
||||
while (!pendingGameObjectSpawns_.empty()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue