mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 09:33:51 +00:00
Performance: ring buffer UBOs, batched load screen uploads, background world preloader
- Replace per-frame VMA alloc/free of material UBOs with a ring buffer in CharacterRenderer (~500 allocations/frame eliminated) - Batch all ready terrain tiles into a single GPU upload during load screen (processAllReadyTiles instead of one-at-a-time with individual fence waits) - Lift per-frame creature/GO spawn budgets during load screen warmup phase - Add background world preloader: saves last world position to disk, pre-warms AssetManager file cache with ADT files starting at app init (login screen) so terrain workers get instant cache hits when Enter World is clicked - Distance-filter expensive collision guard to 8-unit melee range - Merge 3 CharacterRenderer update loops into single pass - Time-budget instrumentation for slow update stages (>3ms threshold) - Count-based async creature model upload budget (max 3/frame in-game) - 1-per-frame game object spawn + per-doodad time budget for transport loading - Use deque for creature spawn queue to avoid O(n) front-erase
This commit is contained in:
parent
71e8ed5b7d
commit
0313bd8692
7 changed files with 390 additions and 121 deletions
|
|
@ -6,12 +6,15 @@
|
|||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <array>
|
||||
#include <optional>
|
||||
#include <future>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
namespace wowee {
|
||||
|
||||
|
|
@ -282,7 +285,7 @@ private:
|
|||
uint32_t displayId;
|
||||
float x, y, z, orientation;
|
||||
};
|
||||
std::vector<PendingCreatureSpawn> pendingCreatureSpawns_;
|
||||
std::deque<PendingCreatureSpawn> pendingCreatureSpawns_;
|
||||
static constexpr int MAX_SPAWNS_PER_FRAME = 3;
|
||||
static constexpr int MAX_NEW_CREATURE_MODELS_PER_FRAME = 1;
|
||||
static constexpr uint16_t MAX_CREATURE_SPAWN_RETRIES = 300;
|
||||
|
|
@ -353,6 +356,23 @@ private:
|
|||
// Quest marker billboard sprites (above NPCs)
|
||||
void loadQuestMarkerModels(); // Now loads BLP textures
|
||||
void updateQuestMarkers(); // Updates billboard positions
|
||||
|
||||
// Background world preloader — warms AssetManager file cache for the
|
||||
// expected world before the user clicks Enter World.
|
||||
struct WorldPreload {
|
||||
uint32_t mapId = 0;
|
||||
std::string mapName;
|
||||
int centerTileX = 0;
|
||||
int centerTileY = 0;
|
||||
std::atomic<bool> cancel{false};
|
||||
std::vector<std::thread> workers;
|
||||
};
|
||||
std::unique_ptr<WorldPreload> worldPreload_;
|
||||
void startWorldPreload(uint32_t mapId, const std::string& mapName, float serverX, float serverY);
|
||||
void cancelWorldPreload();
|
||||
void saveLastWorldInfo(uint32_t mapId, const std::string& mapName, float serverX, float serverY);
|
||||
struct LastWorldInfo { uint32_t mapId = 0; std::string mapName; float x = 0, y = 0; bool valid = false; };
|
||||
LastWorldInfo loadLastWorldInfo() const;
|
||||
};
|
||||
|
||||
} // namespace core
|
||||
|
|
|
|||
|
|
@ -254,7 +254,14 @@ private:
|
|||
VkDescriptorPool materialDescPools_[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
|
||||
VkDescriptorPool boneDescPool_ = VK_NULL_HANDLE;
|
||||
uint32_t lastMaterialPoolResetFrame_ = 0xFFFFFFFFu;
|
||||
std::vector<std::pair<VkBuffer, VmaAllocation>> transientMaterialUbos_[2];
|
||||
|
||||
// Material UBO ring buffer — pre-allocated per frame slot, sub-allocated each draw
|
||||
VkBuffer materialRingBuffer_[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
|
||||
VmaAllocation materialRingAlloc_[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
|
||||
void* materialRingMapped_[2] = {nullptr, nullptr};
|
||||
uint32_t materialRingOffset_[2] = {0, 0};
|
||||
uint32_t materialUboAlignment_ = 256; // minUniformBufferOffsetAlignment
|
||||
static constexpr uint32_t MATERIAL_RING_CAPACITY = 4096;
|
||||
|
||||
// Texture cache
|
||||
struct TextureCacheEntry {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue