From c3472b8abd8185f392e6c2afb68a7411232396d6 Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Sun, 27 Jan 2019 08:10:36 +0500 Subject: Added slow GameState sync --- src/GameState.cpp | 17 +++++++++++++++++ src/GameState.hpp | 12 +++++++++++- src/Render.cpp | 3 ++- src/RendererEntity.cpp | 8 ++++---- src/RendererEntity.hpp | 4 +--- src/RendererWorld.cpp | 22 +++++++++++++--------- src/World.cpp | 36 +++++------------------------------- src/World.hpp | 11 ++--------- 8 files changed, 55 insertions(+), 58 deletions(-) diff --git a/src/GameState.cpp b/src/GameState.cpp index ace2488..df227b3 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -10,6 +10,8 @@ void GameState::Update(float deltaTime) { if (!gameStatus.isGameStarted) return; + std::lock_guard guard(accessMutex); + std::chrono::steady_clock clock; static auto timeOfPreviousSendedPacket(clock.now()); auto delta = clock.now() - timeOfPreviousSendedPacket; @@ -67,6 +69,7 @@ void GameState::Update(float deltaTime) { } void GameState::UpdatePacket(std::shared_ptr ptr) { + std::lock_guard guard(accessMutex); switch ((PacketNamePlayCB)ptr->GetPacketId()) { case SpawnObject: { auto packet = std::static_pointer_cast(ptr); @@ -487,6 +490,8 @@ void GameState::HandleMovement(GameState::MoveType direction, float deltaTime) { if (!gameStatus.isGameStarted) return; + std::lock_guard guard(accessMutex); + const double playerSpeed = 43; float velocity = playerSpeed * deltaTime; @@ -543,6 +548,8 @@ void GameState::HandleRotation(double yaw, double pitch) { if (!gameStatus.isGameStarted) return; + std::lock_guard guard(accessMutex); + double playerYaw = Entity::DecodeYaw(player->yaw); double playerPitch = Entity::DecodePitch(player->pitch); playerYaw += yaw; @@ -556,6 +563,8 @@ void GameState::HandleRotation(double yaw, double pitch) { } glm::mat4 GameState::GetViewMatrix() { + std::lock_guard guard(accessMutex); + double playerYaw = Entity::DecodeYaw(player->yaw); double playerPitch = Entity::DecodePitch(player->pitch); glm::vec3 front, right, worldUp, up; @@ -580,6 +589,8 @@ void GameState::StartDigging() { if (!selectionStatus.isBlockSelected) return; + std::lock_guard guard(accessMutex); + auto packetStart = std::make_shared(0, selectionStatus.selectedBlock, 1); auto packet = std::static_pointer_cast(packetStart); PUSH_EVENT("SendPacket", packet); @@ -588,6 +599,8 @@ void GameState::StartDigging() { } void GameState::FinishDigging() { + std::lock_guard guard(accessMutex); + auto packetFinish = std::make_shared(2, selectionStatus.selectedBlock, 1); auto packet = std::static_pointer_cast(packetFinish); PUSH_EVENT("SendPacket", packet); @@ -599,6 +612,8 @@ void GameState::FinishDigging() { // send_packet(packet_type=start_digging_packet) // remove_delayed_action(finish_digging) void GameState::CancelDigging() { + std::lock_guard guard(accessMutex); + auto packetCancel = std::make_shared(1, selectionStatus.selectedBlock, 1); auto packet = std::static_pointer_cast(packetCancel); PUSH_EVENT("SendPacket", packet); @@ -637,6 +652,8 @@ void GameState::PlaceBlock() { if (!selectionStatus.isBlockSelected) return; + std::lock_guard guard(accessMutex); + BlockFacing face = detectHitFace(selectionStatus.raycastHit, selectionStatus.selectedBlock); auto packetPlace = std::make_shared( selectionStatus.selectedBlock, (unsigned char)face, 0, 0, 0, 0); diff --git a/src/GameState.hpp b/src/GameState.hpp index cd39a48..dbea2c3 100644 --- a/src/GameState.hpp +++ b/src/GameState.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -67,6 +68,8 @@ class GameState { Window playerInventory; std::vector openedWindows; + + std::mutex accessMutex; public: void Update(float deltaTime); @@ -92,30 +95,37 @@ public: glm::mat4 GetViewMatrix(); inline Entity *GetPlayer() { + std::lock_guard guard(accessMutex); return player; } - inline World &GetWorld() { + inline World GetWorld() { + std::lock_guard guard(accessMutex); return world; } inline TimeStatus GetTimeStatus() { + std::lock_guard guard(accessMutex); return timeStatus; } inline GameStatus GetGameStatus() { + std::lock_guard guard(accessMutex); return gameStatus; } inline PlayerStatus GetPlayerStatus() { + std::lock_guard guard(accessMutex); return playerStatus; } inline SelectionStatus GetSelectionStatus() { + std::lock_guard guard(accessMutex); return selectionStatus; } inline Window &GetInventory() { + std::lock_guard guard(accessMutex); return playerInventory; } }; diff --git a/src/Render.cpp b/src/Render.cpp index b5dea63..5432979 100644 --- a/src/Render.cpp +++ b/src/Render.cpp @@ -384,7 +384,8 @@ void Render::RenderGui() { if (world) { Entity *playerPtr = world->GameStatePtr()->GetPlayer(); SelectionStatus selectionStatus = world->GameStatePtr()->GetSelectionStatus(); - World *worldPtr = &world->GameStatePtr()->GetWorld(); + World worldObj = world->GameStatePtr()->GetWorld(); + World *worldPtr = &worldObj; ImGui::Text("TPS: %.1f (%.2fms)", 1000.0f / gameTime, gameTime); ImGui::Text("Sections loaded: %d", (int) DebugInfo::totalSections); diff --git a/src/RendererEntity.cpp b/src/RendererEntity.cpp index a1c9566..fef7dbd 100644 --- a/src/RendererEntity.cpp +++ b/src/RendererEntity.cpp @@ -4,9 +4,10 @@ #include #include "Entity.hpp" -#include "World.hpp" +#include "GameState.hpp" #include "Renderer.hpp" #include "AssetManager.hpp" +#include "GlobalState.hpp" const GLfloat vertices[] = { -0.5f, 0.5f, 0.5f, @@ -114,9 +115,8 @@ GLuint RendererEntity::GetVao(){ return Vao; } -RendererEntity::RendererEntity(World *ptr, unsigned int id) +RendererEntity::RendererEntity(unsigned int id) { - world = ptr; entityId = id; } @@ -125,7 +125,7 @@ RendererEntity::~RendererEntity() { void RendererEntity::Render(RenderState & renderState) { glm::mat4 model = glm::mat4(1.0); - Entity& entity = world->GetEntity(entityId); + Entity entity = GlobalState::GetGameState()->GetWorld().GetEntity(entityId); model = glm::translate(model, entity.pos.glm()); model = glm::translate(model, glm::vec3(0, entity.height / 2.0, 0)); model = glm::scale(model, glm::vec3(entity.width, entity.height, entity.width)); diff --git a/src/RendererEntity.hpp b/src/RendererEntity.hpp index e2e8bf1..961ef45 100644 --- a/src/RendererEntity.hpp +++ b/src/RendererEntity.hpp @@ -2,14 +2,12 @@ #include -class World; class RenderState; class RendererEntity { unsigned int entityId; - World *world; public: - RendererEntity(World *ptr, unsigned int id); + RendererEntity(unsigned int id); ~RendererEntity(); void Render(RenderState& renderState); diff --git a/src/RendererWorld.cpp b/src/RendererWorld.cpp index 78519f3..d798343 100644 --- a/src/RendererWorld.cpp +++ b/src/RendererWorld.cpp @@ -36,6 +36,8 @@ void RendererWorld::WorkerFunction(size_t workerId) { } void RendererWorld::ParseQueueUpdate() { + World world = gs->GetWorld(); + while (!parseQueue.empty()) { size_t id = 0; for (; id < RendererWorld::parsingBufferSize && parsing[id].parsing; ++id) {} @@ -52,13 +54,13 @@ void RendererWorld::ParseQueueUpdate() { vec.y -= 4500; } - parsing[id].data.section = gs->GetWorld().GetSection(vec); - parsing[id].data.north = gs->GetWorld().GetSection(vec + Vector(0, 0, 1)); - parsing[id].data.south = gs->GetWorld().GetSection(vec + Vector(0, 0, -1)); - parsing[id].data.west = gs->GetWorld().GetSection(vec + Vector(1, 0, 0)); - parsing[id].data.east = gs->GetWorld().GetSection(vec + Vector(-1, 0, 0)); - parsing[id].data.bottom = gs->GetWorld().GetSection(vec + Vector(0, -1, 0)); - parsing[id].data.top = gs->GetWorld().GetSection(vec + Vector(0, 1, 0)); + parsing[id].data.section = world.GetSection(vec); + parsing[id].data.north = world.GetSection(vec + Vector(0, 0, 1)); + parsing[id].data.south = world.GetSection(vec + Vector(0, 0, -1)); + parsing[id].data.west = world.GetSection(vec + Vector(1, 0, 0)); + parsing[id].data.east = world.GetSection(vec + Vector(-1, 0, 0)); + parsing[id].data.bottom = world.GetSection(vec + Vector(0, -1, 0)); + parsing[id].data.top = world.GetSection(vec + Vector(0, 1, 0)); parsing[id].parsing = true; @@ -74,6 +76,8 @@ void RendererWorld::ParseQeueueRemoveUnnecessary() { elements.clear(); elements.reserve(size); + World world = gs->GetWorld(); + for (size_t i = 0; i < size; i++) { Vector vec = parseQueue.front(); parseQueue.pop(); @@ -86,7 +90,7 @@ void RendererWorld::ParseQeueueRemoveUnnecessary() { if (std::find(elements.begin(), elements.end(), vec) != elements.end()) continue; - const Section& section = gs->GetWorld().GetSection(vec); + const Section& section = world.GetSection(vec); bool skip = false; @@ -186,7 +190,7 @@ RendererWorld::RendererWorld(GameState* ptr) { auto data = eventData.get(); for (unsigned int entityId : gs->GetWorld().GetEntitiesList()) { if (entityId == data) { - entities.push_back(RendererEntity(&gs->GetWorld(), entityId)); + entities.push_back(RendererEntity(entityId)); } } }); diff --git a/src/World.cpp b/src/World.cpp index 9a4bfd1..ffb657f 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -3,7 +3,6 @@ #include #include -#include "Section.hpp" #include "Event.hpp" #include "DebugInfo.hpp" #include "Packet.hpp" @@ -18,13 +17,13 @@ void World::ParseChunkData(std::shared_ptr packet) { Section section = ParseSection(&chunkData, chunkPosition); if (packet->GroundUpContinuous) { - if (!sections.insert(std::make_pair(chunkPosition, std::make_unique
(section))).second) { + if (!sections.insert(std::make_pair(chunkPosition, section)).second) { LOG(ERROR) << "New chunk not created " << chunkPosition << " potential memory leak"; } UpdateSectionsList(); } else { - std::swap(*sections.at(chunkPosition).get(), section); + std::swap(sections.at(chunkPosition), section); } PUSH_EVENT("ChunkChanged", chunkPosition); @@ -58,12 +57,6 @@ Section World::ParseSection(StreamInput *data, Vector position) { std::move(blockLight), std::move(skyLight)); } -World::~World() { -} - -World::World() { -} - bool World::isPlayerCollides(double X, double Y, double Z) { Vector PlayerChunk(floor(X / 16.0), floor(Y / 16.0), floor(Z / 16.0)); if (sections.find(PlayerChunk) == sections.end() || @@ -119,9 +112,7 @@ bool World::isPlayerCollides(double X, double Y, double Z) { } std::vector World::GetSectionsList() { - sectionsListMutex.lock(); auto vec = sectionsList; - sectionsListMutex.unlock(); return vec; } @@ -134,7 +125,7 @@ const Section &World::GetSection(Vector sectionPos) { return fallbackSection; } else { - return *result->second.get(); + return result->second; } } @@ -199,7 +190,6 @@ void World::UpdatePhysics(float delta) { return { false }; }; - entitiesMutex.lock(); for (auto& it : entities) { if (it.isFlying) { VectorF newPos = it.pos + VectorF(it.vel.x, it.vel.y, it.vel.z) * delta; @@ -247,49 +237,39 @@ void World::UpdatePhysics(float delta) { it.vel = it.vel + resistForce; } } - entitiesMutex.unlock(); DebugInfo::totalSections = sections.size(); } Entity& World::GetEntity(unsigned int EntityId){ - entitiesMutex.lock(); for (auto& it : entities) { if (it.entityId == EntityId) { - entitiesMutex.unlock(); return it; } } - entitiesMutex.unlock(); static Entity fallback; return fallback; } std::vector World::GetEntitiesList() { - entitiesMutex.lock(); std::vector ret; for (auto& it : entities) { ret.push_back(it.entityId); } - entitiesMutex.unlock(); return ret; } void World::AddEntity(Entity entity) { - entitiesMutex.lock(); for (auto& it : entities) { if (it.entityId == entity.entityId) { LOG(ERROR) << "Adding already existing entity: " << entity.entityId; - entitiesMutex.unlock(); return; } } entities.push_back(entity); - entitiesMutex.unlock(); } void World::DeleteEntity(unsigned int EntityId) { - entitiesMutex.lock(); auto it = entities.begin(); for (; it != entities.end(); ++it) { if (it->entityId == EntityId) { @@ -298,7 +278,6 @@ void World::DeleteEntity(unsigned int EntityId) { } if (it != entities.end()) entities.erase(it); - entitiesMutex.unlock(); } void World::ParseChunkData(std::shared_ptr packet) { @@ -333,7 +312,7 @@ void World::ParseChunkData(std::shared_ptr packet) { } void World::ParseChunkData(std::shared_ptr packet) { - std::vector>::iterator> toRemove; + std::vector::iterator> toRemove; for (auto it = sections.begin(); it != sections.end(); ++it) { if (it->first.x == packet->ChunkX && it->first.z == packet->ChunkZ) toRemove.push_back(it); @@ -346,12 +325,10 @@ void World::ParseChunkData(std::shared_ptr packet) { } void World::UpdateSectionsList() { - sectionsListMutex.lock(); sectionsList.clear(); for (auto& it : sections) { sectionsList.push_back(it.first); } - sectionsListMutex.unlock(); } BlockId World::GetBlockId(Vector pos) { @@ -399,18 +376,15 @@ Section *World::GetSectionPtr(Vector position) { if (it == sections.end()) return nullptr; - return it->second.get(); + return &it->second; } Entity* World::GetEntityPtr(unsigned int EntityId) { - entitiesMutex.lock(); for (auto& it : entities) { if (it.entityId == EntityId) { - entitiesMutex.unlock(); return ⁢ } } - entitiesMutex.unlock(); return nullptr; } diff --git a/src/World.hpp b/src/World.hpp index 165e73d..94e17f6 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -11,8 +11,8 @@ #include "Entity.hpp" #include "Block.hpp" #include "Vector.hpp" +#include "Section.hpp" -class Section; class PacketChunkData; class PacketBlockChange; class PacketMultiBlockChange; @@ -28,24 +28,17 @@ struct RaycastResult { class World { int dimension = 0; - std::map> sections; + std::map sections; Section ParseSection(StreamInput *data, Vector position); std::list entities; - std::mutex entitiesMutex; - std::vector sectionsList; - std::mutex sectionsListMutex; - void UpdateSectionsList(); public: - World(); - - ~World(); void ParseChunkData(std::shared_ptr packet); -- cgit v1.2.3