From 73e721513caa0b736ca3a47af519b2d5b916111f Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Thu, 1 Aug 2024 23:35:13 +0300 Subject: [PATCH 01/17] fix: optimization: PVS-Studio warning V836 Expression's value is copied at variable declaration. The variable is never modified. Consider declaring it as a reference. Changed variables to be a reference to avoid unnecessary copy. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/content/ContentLoader.cpp | 2 +- src/graphics/ui/gui_xml.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 448754a2b..a156d6abc 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -85,7 +85,7 @@ bool ContentLoader::fixPackIndices( indexed.push_back(name); } } - for (auto name : detected) { + for (const auto &name : detected) { if (!util::contains(indexed, name)) { arr->put(name); modified = true; diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 297ee4acf..637b2220c 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -203,7 +203,7 @@ static void _readPanel(UiXmlReader& reader, const xml::xmlelement& element, Pane panel.setMaxLength(element->attr("max-length").asInt()); } if (element->has("orientation")) { - auto oname = element->attr("orientation").getText(); + const auto &oname = element->attr("orientation").getText(); if (oname == "horizontal") { panel.setOrientation(Orientation::horizontal); } From 5dd7a15c098f5d3164bb7574a3c81b6b84c3b205 Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Thu, 1 Aug 2024 23:48:24 +0300 Subject: [PATCH 02/17] fix: optimization: PVS-Studio warning V832 It's better to use '= default;' syntax instead of empty constructor and destructor body. Using '= default;' can help the compiler generate more optimal code. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/assets/Assets.cpp | 3 +-- src/assets/Assets.hpp | 2 +- src/audio/audio.cpp | 6 +++--- src/coders/xml.hpp | 2 +- src/content/Content.cpp | 3 +-- src/content/ContentBuilder.cpp | 2 +- src/content/ContentPack.cpp | 3 +-- src/content/PacksManager.cpp | 5 ++--- src/data/dynamic.hpp | 4 ++-- src/files/WorldFiles.cpp | 3 +-- src/files/WorldRegions.cpp | 6 ++---- src/frontend/ContentGfxCache.cpp | 3 +-- src/frontend/LevelFrontend.cpp | 3 +-- src/graphics/core/Atlas.cpp | 3 +-- src/graphics/core/Atlas.hpp | 2 +- src/graphics/core/Font.cpp | 3 +-- src/graphics/core/ImageData.cpp | 3 +-- src/graphics/core/PostProcessing.cpp | 3 +-- src/graphics/core/Shader.cpp | 2 +- src/graphics/core/TextureAnimation.hpp | 2 +- src/graphics/render/ModelBatch.cpp | 3 +-- src/graphics/render/Skybox.cpp | 3 +-- src/graphics/render/WorldRenderer.cpp | 3 +-- src/graphics/ui/GUI.cpp | 3 +-- src/items/Inventories.cpp | 3 +-- src/lighting/Lighting.cpp | 3 +-- src/logic/ChunksController.cpp | 3 +-- src/logic/CommandsInterpreter.hpp | 2 +- src/maths/FrustumCulling.hpp | 2 +- src/maths/rays.hpp | 2 +- src/util/ThreadPool.hpp | 4 ++-- src/window/input.hpp | 2 +- 32 files changed, 38 insertions(+), 58 deletions(-) diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index c7ef69461..993e7360c 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -1,7 +1,6 @@ #include "Assets.hpp" -Assets::~Assets() { -} +Assets::~Assets() = default; const std::vector& Assets::getAnimations() { return animations; diff --git a/src/assets/Assets.hpp b/src/assets/Assets.hpp index 4474301e5..d30f81870 100644 --- a/src/assets/Assets.hpp +++ b/src/assets/Assets.hpp @@ -68,7 +68,7 @@ class Assets { std::unordered_map assets; std::vector setupFuncs; public: - Assets() {} + Assets() = default; Assets(const Assets&) = delete; ~Assets(); diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index b6a36e425..56887994a 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -266,7 +266,7 @@ speakerid_t audio::play( } auto speaker = speaker_ptr.get(); speakerid_t id = nextId++; - speakers.emplace(id, std::move(speaker_ptr)); + speakers.try_emplace(id, std::move(speaker_ptr)); speaker->setPosition(position); speaker->setVolume(volume); speaker->setPitch(pitch); @@ -295,8 +295,8 @@ speakerid_t audio::play( } auto speaker = speaker_ptr.get(); speakerid_t id = nextId++; - streams.emplace(id, stream); - speakers.emplace(id, std::move(speaker_ptr)); + streams.try_emplace(id, stream); + speakers.try_emplace(id, std::move(speaker_ptr)); stream->bindSpeaker(id); speaker->setPosition(position); diff --git a/src/coders/xml.hpp b/src/coders/xml.hpp index c70ce9c24..4af2e4b15 100644 --- a/src/coders/xml.hpp +++ b/src/coders/xml.hpp @@ -23,7 +23,7 @@ namespace xml { std::string name; std::string text; public: - Attribute() {}; + Attribute() = default; Attribute(std::string name, std::string text); const std::string& getName() const; diff --git a/src/content/Content.cpp b/src/content/Content.cpp index 11e204d6b..2e5612a41 100644 --- a/src/content/Content.cpp +++ b/src/content/Content.cpp @@ -46,8 +46,7 @@ Content::Content( } } -Content::~Content() { -} +Content::~Content() = default; const rigging::SkeletonConfig* Content::getSkeleton(const std::string& id) const { auto found = skeletons.find(id); diff --git a/src/content/ContentBuilder.cpp b/src/content/ContentBuilder.cpp index 6f7b730b0..76f3052c9 100644 --- a/src/content/ContentBuilder.cpp +++ b/src/content/ContentBuilder.cpp @@ -2,7 +2,7 @@ #include "../objects/rigging.hpp" -ContentBuilder::~ContentBuilder() {} +ContentBuilder::~ContentBuilder() = default; void ContentBuilder::add(std::unique_ptr pack) { packs[pack->getId()] = std::move(pack); diff --git a/src/content/ContentPack.cpp b/src/content/ContentPack.cpp index 8388e30c1..0c88c7b0b 100644 --- a/src/content/ContentPack.cpp +++ b/src/content/ContentPack.cpp @@ -142,5 +142,4 @@ ContentPackRuntime::ContentPackRuntime( { } -ContentPackRuntime::~ContentPackRuntime() { -} +ContentPackRuntime::~ContentPackRuntime() = default; diff --git a/src/content/PacksManager.cpp b/src/content/PacksManager.cpp index c8bb4e054..675efee9f 100644 --- a/src/content/PacksManager.cpp +++ b/src/content/PacksManager.cpp @@ -5,8 +5,7 @@ #include #include -PacksManager::PacksManager() { -} +PacksManager::PacksManager() = default; void PacksManager::setSources(std::vector sources) { this->sources = sources; @@ -19,7 +18,7 @@ void PacksManager::scan() { for (auto& folder : sources) { ContentPack::scanFolder(folder, packsList); for (auto& pack : packsList) { - packs.emplace(pack.id, pack); + packs.try_emplace(pack.id, pack); } } } diff --git a/src/data/dynamic.hpp b/src/data/dynamic.hpp index 90f4fe69c..6299a1c73 100644 --- a/src/data/dynamic.hpp +++ b/src/data/dynamic.hpp @@ -41,7 +41,7 @@ namespace dynamic { public: std::vector values; - List() {} + List() = default; List(std::vector values) : values(std::move(values)) {} std::string str(size_t index) const; @@ -79,7 +79,7 @@ namespace dynamic { public: std::unordered_map values; - Map() {} + Map() = default; Map(std::unordered_map values) : values(std::move(values)) {}; diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 0d2f96c59..31868e81d 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -47,8 +47,7 @@ WorldFiles::WorldFiles(const fs::path& directory, const DebugSettings& settings) regions.doWriteLights = doWriteLights; } -WorldFiles::~WorldFiles() { -} +WorldFiles::~WorldFiles() = default; void WorldFiles::createDirectories() { fs::create_directories(directory / fs::path("data")); diff --git a/src/files/WorldRegions.cpp b/src/files/WorldRegions.cpp index 92feacdaf..642453f87 100644 --- a/src/files/WorldRegions.cpp +++ b/src/files/WorldRegions.cpp @@ -56,8 +56,7 @@ WorldRegion::WorldRegion() sizes(std::make_unique(REGION_CHUNKS_COUNT)) {} -WorldRegion::~WorldRegion() { -} +WorldRegion::~WorldRegion() = default; void WorldRegion::setUnsaved(bool unsaved) { this->unsaved = unsaved; @@ -98,8 +97,7 @@ WorldRegions::WorldRegions(const fs::path& directory) : directory(directory) { layers[REGION_LAYER_ENTITIES].folder = directory/fs::path("entities"); } -WorldRegions::~WorldRegions() { -} +WorldRegions::~WorldRegions() = default; WorldRegion* WorldRegions::getRegion(int x, int z, int layer) { RegionsLayer& regions = layers[layer]; diff --git a/src/frontend/ContentGfxCache.cpp b/src/frontend/ContentGfxCache.cpp index b18492fdd..4de800697 100644 --- a/src/frontend/ContentGfxCache.cpp +++ b/src/frontend/ContentGfxCache.cpp @@ -38,8 +38,7 @@ ContentGfxCache::ContentGfxCache(const Content* content, Assets* assets) : conte } } -ContentGfxCache::~ContentGfxCache() { -} +ContentGfxCache::~ContentGfxCache() = default; const Content* ContentGfxCache::getContent() const { return content; diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index 067b71a3c..e5cadff53 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -81,8 +81,7 @@ LevelFrontend::LevelFrontend( ); } -LevelFrontend::~LevelFrontend() { -} +LevelFrontend::~LevelFrontend() = default; Level* LevelFrontend::getLevel() const { return level; diff --git a/src/graphics/core/Atlas.cpp b/src/graphics/core/Atlas.cpp index 7d8f7a316..6823757dc 100644 --- a/src/graphics/core/Atlas.cpp +++ b/src/graphics/core/Atlas.cpp @@ -19,8 +19,7 @@ Atlas::Atlas( } } -Atlas::~Atlas() { -} +Atlas::~Atlas() = default; void Atlas::prepare() { texture = Texture::from(image.get()); diff --git a/src/graphics/core/Atlas.hpp b/src/graphics/core/Atlas.hpp index 8e8a7b339..827f6d0a7 100644 --- a/src/graphics/core/Atlas.hpp +++ b/src/graphics/core/Atlas.hpp @@ -47,7 +47,7 @@ class AtlasBuilder { std::vector entries; std::set names; public: - AtlasBuilder() {} + AtlasBuilder() = default; void add(const std::string& name, std::unique_ptr image); bool has(const std::string& name) const; const std::set& getNames() { return names; }; diff --git a/src/graphics/core/Font.cpp b/src/graphics/core/Font.cpp index 14a052965..ca94bd8bd 100644 --- a/src/graphics/core/Font.cpp +++ b/src/graphics/core/Font.cpp @@ -12,8 +12,7 @@ Font::Font(std::vector> pages, int lineHeight, int yoff : lineHeight(lineHeight), yoffset(yoffset), pages(std::move(pages)) { } -Font::~Font(){ -} +Font::~Font() = default; int Font::getYOffset() const { return yoffset; diff --git a/src/graphics/core/ImageData.cpp b/src/graphics/core/ImageData.cpp index 6499afb47..ee40bafc9 100644 --- a/src/graphics/core/ImageData.cpp +++ b/src/graphics/core/ImageData.cpp @@ -41,8 +41,7 @@ ImageData::ImageData(ImageFormat format, uint width, uint height, const ubyte* d std::memcpy(this->data.get(), data, width * height * pixsize); } -ImageData::~ImageData() { -} +ImageData::~ImageData() = default; void ImageData::flipX() { switch (format) { diff --git a/src/graphics/core/PostProcessing.cpp b/src/graphics/core/PostProcessing.cpp index 0498c5e73..7352c3b55 100644 --- a/src/graphics/core/PostProcessing.cpp +++ b/src/graphics/core/PostProcessing.cpp @@ -18,8 +18,7 @@ PostProcessing::PostProcessing() { quadMesh = std::make_unique(vertices, 6, attrs); } -PostProcessing::~PostProcessing() { -} +PostProcessing::~PostProcessing() = default; void PostProcessing::use(DrawContext& context) { const auto& vp = context.getViewport(); diff --git a/src/graphics/core/Shader.cpp b/src/graphics/core/Shader.cpp index 62d82ee34..7f551fb58 100644 --- a/src/graphics/core/Shader.cpp +++ b/src/graphics/core/Shader.cpp @@ -32,7 +32,7 @@ uint Shader::getUniformLocation(const std::string& name) { auto found = uniformLocations.find(name); if (found == uniformLocations.end()) { uint location = glGetUniformLocation(id, name.c_str()); - uniformLocations.emplace(name, location); + uniformLocations.try_emplace(name, location); return location; } return found->second; diff --git a/src/graphics/core/TextureAnimation.hpp b/src/graphics/core/TextureAnimation.hpp index ac6eb3b75..839566bd8 100644 --- a/src/graphics/core/TextureAnimation.hpp +++ b/src/graphics/core/TextureAnimation.hpp @@ -22,7 +22,7 @@ struct Frame { class TextureAnimation { public: TextureAnimation(Texture* srcTex, Texture* dstTex) : srcTexture(srcTex), dstTexture(dstTex) {}; - ~TextureAnimation() {}; + ~TextureAnimation() = default; void addFrame(const Frame& frame) { frames.emplace_back(frame); }; diff --git a/src/graphics/render/ModelBatch.cpp b/src/graphics/render/ModelBatch.cpp index c5130402c..468fcbd52 100644 --- a/src/graphics/render/ModelBatch.cpp +++ b/src/graphics/render/ModelBatch.cpp @@ -64,8 +64,7 @@ ModelBatch::ModelBatch(size_t capacity, Assets* assets, Chunks* chunks) blank = Texture::from(&image); } -ModelBatch::~ModelBatch() { -} +ModelBatch::~ModelBatch() = default; void ModelBatch::draw(const model::Mesh& mesh, const glm::mat4& matrix, const glm::mat3& rotation, glm::vec3 tint, diff --git a/src/graphics/render/Skybox.cpp b/src/graphics/render/Skybox.cpp index 493106099..029f0b8bf 100644 --- a/src/graphics/render/Skybox.cpp +++ b/src/graphics/render/Skybox.cpp @@ -55,8 +55,7 @@ Skybox::Skybox(uint size, Shader* shader) }); } -Skybox::~Skybox() { -} +Skybox::~Skybox() = default; void Skybox::drawBackground(Camera* camera, Assets* assets, int width, int height) { auto backShader = assets->get("background"); diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 73a10047c..64d392d26 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -75,8 +75,7 @@ WorldRenderer::WorldRenderer(Engine* engine, LevelFrontend* frontend, Player* pl ); } -WorldRenderer::~WorldRenderer() { -} +WorldRenderer::~WorldRenderer() = default; bool WorldRenderer::drawChunk( size_t index, diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 13f32a38c..40ae9bf57 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -44,8 +44,7 @@ GUI::GUI() { container->add(tooltip); } -GUI::~GUI() { -} +GUI::~GUI() = default; std::shared_ptr GUI::getMenu() { return menu; diff --git a/src/items/Inventories.cpp b/src/items/Inventories.cpp index 65e935359..d14dcb0aa 100644 --- a/src/items/Inventories.cpp +++ b/src/items/Inventories.cpp @@ -8,8 +8,7 @@ Inventories::Inventories(Level& level) : level(level) { } -Inventories::~Inventories() { -} +Inventories::~Inventories() = default; std::shared_ptr Inventories::create(size_t size) { int64_t id = level.getWorld()->getNextInventoryId(); diff --git a/src/lighting/Lighting.cpp b/src/lighting/Lighting.cpp index 6d2d5cc41..1236d7dd9 100644 --- a/src/lighting/Lighting.cpp +++ b/src/lighting/Lighting.cpp @@ -20,8 +20,7 @@ Lighting::Lighting(const Content* content, Chunks* chunks) solverS = std::make_unique(indices, chunks, 3); } -Lighting::~Lighting(){ -} +Lighting::~Lighting() = default; void Lighting::clear(){ for (size_t index = 0; index < chunks->volume; index++){ diff --git a/src/logic/ChunksController.cpp b/src/logic/ChunksController.cpp index f4c9aea79..02041d95c 100644 --- a/src/logic/ChunksController.cpp +++ b/src/logic/ChunksController.cpp @@ -30,8 +30,7 @@ ChunksController::ChunksController(Level* level, uint padding) generator(WorldGenerators::createGenerator(level->getWorld()->getGenerator(), level->content)) { } -ChunksController::~ChunksController(){ -} +ChunksController::~ChunksController() = default; void ChunksController::update(int64_t maxDuration) { int64_t mcstotal = 0; diff --git a/src/logic/CommandsInterpreter.hpp b/src/logic/CommandsInterpreter.hpp index 7d7d85080..f9295978f 100644 --- a/src/logic/CommandsInterpreter.hpp +++ b/src/logic/CommandsInterpreter.hpp @@ -55,7 +55,7 @@ namespace cmd { std::string description; executor_func executor; public: - Command() {} + Command() = default; Command( std::string name, diff --git a/src/maths/FrustumCulling.hpp b/src/maths/FrustumCulling.hpp index f8372c14e..1f3f3e670 100644 --- a/src/maths/FrustumCulling.hpp +++ b/src/maths/FrustumCulling.hpp @@ -5,7 +5,7 @@ class Frustum { public: - Frustum() {}; + Frustum() = default; void update(glm::mat4 projview); bool isBoxVisible(const glm::vec3& minp, const glm::vec3& maxp) const; diff --git a/src/maths/rays.hpp b/src/maths/rays.hpp index d781881e9..339c109b6 100644 --- a/src/maths/rays.hpp +++ b/src/maths/rays.hpp @@ -21,7 +21,7 @@ class AABBFaces { public: std::array, AABBFACES_COUNT> faces; // every face is min-point and opposite corner point - AABBFaces(){}; + AABBFaces() = default; AABBFaces(const rayvec3& parentBoxPos, const AABB& parentBox); }; diff --git a/src/util/ThreadPool.hpp b/src/util/ThreadPool.hpp index 6b098b091..594885f2f 100644 --- a/src/util/ThreadPool.hpp +++ b/src/util/ThreadPool.hpp @@ -28,8 +28,8 @@ struct ThreadPoolResult { template class Worker { public: - Worker() {} - virtual ~Worker() {} + Worker() = default; + virtual ~Worker() = default; virtual R operator()(const std::shared_ptr&) = 0; }; diff --git a/src/window/input.hpp b/src/window/input.hpp index 7c9660874..fe991e4b7 100644 --- a/src/window/input.hpp +++ b/src/window/input.hpp @@ -142,7 +142,7 @@ struct Binding { bool state = false; bool justChange = false; - Binding(){} + Binding() = default; Binding(inputtype type, int code) : type(type), code(code) {} bool active() const { From 818fd716cc407a882d0b2fd30ea806d9674d646c Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Thu, 1 Aug 2024 23:53:14 +0300 Subject: [PATCH 03/17] fix: optimization: PVS-Studio warning V825 The 'current.reset(lang.release())' expression is equivalent to 'current = std::move(lang)'. Changed 'current.reset(lang.release())' to 'current = std::move(lang)' to improve code clarity and performance. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/frontend/locale.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/locale.cpp b/src/frontend/locale.cpp index e20b3059e..f4f08a265 100644 --- a/src/frontend/locale.cpp +++ b/src/frontend/locale.cpp @@ -146,7 +146,7 @@ void langs::load(const fs::path& resdir, if (locale != fallback) { load(resdir, locale, packs, *lang.get()); } - current.reset(lang.release()); + current = std::move(lang); } void langs::setup(const fs::path& resdir, From 7fbd32b8df58864a0a3063b320ee33bcc374e636 Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Fri, 2 Aug 2024 00:14:36 +0300 Subject: [PATCH 04/17] fix: optimization: PVS-Studio warning V823 Replaced 'push_back' with 'emplace_back' for better performance in containers. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/content/ContentLoader.cpp | 14 +++++++------- src/files/engine_paths.cpp | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index a156d6abc..10c60df8f 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -251,11 +251,11 @@ void ContentLoader::loadCustomBlockModel(Block& def, dynamic::Map* primitives) { if (boxarr->size() == 7) for (uint j = 6; j < 12; j++) { - def.modelTextures.push_back(boxarr->str(6)); + def.modelTextures.emplace_back(boxarr->str(6)); } else if (boxarr->size() == 12) for (uint j = 6; j < 12; j++) { - def.modelTextures.push_back(boxarr->str(j)); + def.modelTextures.emplace_back(boxarr->str(j)); } else for (uint j = 6; j < 12; j++) { @@ -276,7 +276,7 @@ void ContentLoader::loadCustomBlockModel(Block& def, dynamic::Map* primitives) { def.modelExtraPoints.push_back(p1+xw+yh); def.modelExtraPoints.push_back(p1+yh); - def.modelTextures.push_back(tgonobj->str(9)); + def.modelTextures.emplace_back(tgonobj->str(9)); } } } @@ -313,7 +313,7 @@ void ContentLoader::loadEntity(EntityDef& def, const std::string& name, const fs auto root = files::read_json(file); if (auto componentsarr = root->list("components")) { for (size_t i = 0; i < componentsarr->size(); i++) { - def.components.push_back(componentsarr->str(i)); + def.components.emplace_back(componentsarr->str(i)); } } if (auto boxarr = root->list("hitbox")) { @@ -324,12 +324,12 @@ void ContentLoader::loadEntity(EntityDef& def, const std::string& name, const fs if (auto sensorarr = sensorsarr->list(i)) { auto sensorType = sensorarr->str(0); if (sensorType == "aabb") { - def.boxSensors.push_back({i, { + def.boxSensors.emplace_back(i, AABB{ {sensorarr->num(1), sensorarr->num(2), sensorarr->num(3)}, {sensorarr->num(4), sensorarr->num(5), sensorarr->num(6)} - }}); + }); } else if (sensorType == "radius") { - def.radialSensors.push_back({i, sensorarr->num(1)}); + def.radialSensors.emplace_back(i, sensorarr->num(1)); } else { logger.error() << name << ": sensor #" << i << " - unknown type " << util::quote(sensorType); diff --git a/src/files/engine_paths.cpp b/src/files/engine_paths.cpp index c08d6bd23..00bc7670f 100644 --- a/src/files/engine_paths.cpp +++ b/src/files/engine_paths.cpp @@ -214,7 +214,7 @@ std::vector ResPaths::listdirRaw(const std::string& folderName) con continue; for (const auto& entry : fs::directory_iterator(folder)) { auto name = entry.path().filename().u8string(); - entries.push_back(root.name+":"+folderName+"/"+name); + entries.emplace_back(root.name+":"+folderName+"/"+name); } } { @@ -223,7 +223,7 @@ std::vector ResPaths::listdirRaw(const std::string& folderName) con return entries; for (const auto& entry : fs::directory_iterator(folder)) { auto name = entry.path().filename().u8string(); - entries.push_back("core:"+folderName+"/"+name); + entries.emplace_back("core:"+folderName+"/"+name); } } return entries; From 307ffc3c8f58fce774d998a40654102813cc9392 Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Fri, 2 Aug 2024 01:39:17 +0300 Subject: [PATCH 05/17] fix: optimization: PVS-Studio warning V837 Replaced 'emplace' with 'try_emplace' to avoid unnecessary copies or moves when insertion fails. The 'emplace' function does not guarantee that arguments will not be copied or moved if insertion is not successful. Using 'try_emplace' ensures that arguments are only copied or moved if the insertion actually takes place, thus improving performance. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/window/Events.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window/Events.cpp b/src/window/Events.cpp index cd94946c1..6c237a288 100644 --- a/src/window/Events.cpp +++ b/src/window/Events.cpp @@ -115,7 +115,7 @@ void Events::bind(const std::string& name, inputtype type, mousecode code) { } void Events::bind(const std::string& name, inputtype type, int code) { - bindings.emplace(name, Binding(type, code)); + bindings.try_emplace(name, Binding(type, code)); } void Events::rebind(const std::string& name, inputtype type, int code) { From 1bdc9cf759f78ef3e20c7d72bcc811d57c7eb75b Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Fri, 2 Aug 2024 02:09:15 +0300 Subject: [PATCH 06/17] fix: optimization: PVS-Studio warning V835 Passing cheap-to-copy arguments by reference can sometimes lead to decreased performance. This change ensures that the argument is passed by value, which is more efficient in cases where the argument is inexpensive to copy. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/logic/PlayerController.cpp | 4 ++-- src/logic/PlayerController.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index ba1f10698..5bab584d5 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -105,7 +105,7 @@ glm::vec3 CameraControl::updateCameraShaking(const Hitbox& hitbox, float delta) } void CameraControl::updateFovEffects(const Hitbox& hitbox, - const PlayerInput& input, float delta) { + PlayerInput input, float delta) { bool crouch = input.shift && hitbox.grounded && !input.sprint; float dt = fmin(1.0f, delta * ZOOM_SPEED); @@ -146,7 +146,7 @@ void CameraControl::switchCamera() { } } -void CameraControl::update(const PlayerInput& input, float delta, Chunks* chunks) { +void CameraControl::update(PlayerInput input, float delta, Chunks* chunks) { offset = glm::vec3(0.0f, 0.0f, 0.0f); if (auto hitbox = player->getHitbox()) { diff --git a/src/logic/PlayerController.hpp b/src/logic/PlayerController.hpp index 79363f610..c90d14080 100644 --- a/src/logic/PlayerController.hpp +++ b/src/logic/PlayerController.hpp @@ -32,7 +32,7 @@ class CameraControl { /// @brief Update field-of-view effects /// @param input player inputs /// @param delta delta time - void updateFovEffects(const Hitbox& hitbox, const PlayerInput& input, + void updateFovEffects(const Hitbox& hitbox, PlayerInput input, float delta); /// @brief Switch active player camera @@ -41,7 +41,7 @@ public: CameraControl(const std::shared_ptr& player, const CameraSettings& settings); void updateMouse(PlayerInput& input); - void update(const PlayerInput& input, float delta, Chunks* chunks); + void update(PlayerInput input, float delta, Chunks* chunks); void refresh(); }; From f3f872c7a3e751d3d9374366e83719c42486bd83 Mon Sep 17 00:00:00 2001 From: Vyacheslav Ivanov Date: Fri, 2 Aug 2024 02:13:40 +0300 Subject: [PATCH 07/17] fix: optimization: PVS-Studio warning V831 Replaced 'at()' method with 'operator[]' to improve performance. The 'at()' method performs bounds checking, which can introduce overhead. Using 'operator[]' bypasses this check and can improve performance when you are certain that the index is within bounds. Reported by: PVS-Studio Signed-off-by: Vyacheslav Ivanov --- src/audio/audio.cpp | 2 +- src/graphics/ui/elements/Label.cpp | 4 ++-- src/graphics/ui/gui_xml.cpp | 2 +- src/logic/scripting/lua/libconsole.cpp | 2 +- src/logic/scripting/lua/libpack.cpp | 4 ++-- src/util/listutil.cpp | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 56887994a..384a54a90 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -253,7 +253,7 @@ speakerid_t audio::play( if (!sound->variants.empty()) { size_t index = rand() % (sound->variants.size() + 1); if (index < sound->variants.size()) { - sound = sound->variants.at(index).get(); + sound = sound->variants[index].get(); } } auto speaker_ptr = sound->newInstance(priority, channel); diff --git a/src/graphics/ui/elements/Label.cpp b/src/graphics/ui/elements/Label.cpp index ac31e2a96..e2fd44dbe 100644 --- a/src/graphics/ui/elements/Label.cpp +++ b/src/graphics/ui/elements/Label.cpp @@ -145,7 +145,7 @@ uint Label::getLineByYOffset(int offset) const { uint Label::getLineByTextIndex(size_t index) const { for (size_t i = 0; i < cache.lines.size(); i++) { - if (cache.lines.at(i).offset > index) { + if (cache.lines[i].offset > index) { return i-1; } } @@ -195,7 +195,7 @@ void Label::draw(const DrawContext* pctx, Assets* assets) { if (multiline) { for (size_t i = 0; i < cache.lines.size(); i++) { - auto& line = cache.lines.at(i); + auto& line = cache.lines[i]; size_t offset = line.offset; std::wstring_view view(text.c_str()+offset, text.length()-offset); if (i < cache.lines.size()-1) { diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 637b2220c..7b0bd0d5c 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -286,7 +286,7 @@ static std::shared_ptr readButton(UiXmlReader& reader, const xml::xmlele std::shared_ptr