From 8f892096993e88896c03c34a2b3085a0c31ef020 Mon Sep 17 00:00:00 2001 From: qloak Date: Sat, 1 Aug 2026 10:13:42 -0700 Subject: [PATCH] perf: WPO/LTCG, fix potential memory leaks, reduce busy-waits, loop opts; general optimizations --- .../Common/Leaderboards/base64.cpp | 6 +- Minecraft.Client/Common/Leaderboards/base64.h | 2 +- .../Common/Network/GameNetworkManager.cpp | 22 +++---- Minecraft.Client/EnderDragonRenderer.cpp | 9 +-- Minecraft.Client/EntityRenderDispatcher.cpp | 11 ++++ Minecraft.Client/EntityRenderDispatcher.h | 3 +- Minecraft.Client/GameRenderer.cpp | 60 ++++++++++--------- Minecraft.Client/GameRenderer.h | 2 - Minecraft.Client/HorseRenderer.cpp | 8 +-- Minecraft.Client/HorseRenderer.h | 2 +- Minecraft.Client/Minecraft.Client.vcxproj | 11 +++- Minecraft.Client/MinecraftServer.cpp | 6 +- .../Orbis/Leaderboards/base64.cpp | 6 +- Minecraft.Client/Orbis/Leaderboards/base64.h | 2 +- Minecraft.Client/PS3/Leaderboards/base64.cpp | 6 +- Minecraft.Client/PS3/Leaderboards/base64.h | 2 +- Minecraft.World/Connection.cpp | 6 +- Minecraft.World/Minecraft.World.vcxproj | 6 +- 18 files changed, 98 insertions(+), 72 deletions(-) diff --git a/Minecraft.Client/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Leaderboards/base64.cpp index 01aa4cf0..f03ae118 100644 --- a/Minecraft.Client/Common/Leaderboards/base64.cpp +++ b/Minecraft.Client/Common/Leaderboards/base64.cpp @@ -1,7 +1,7 @@ /* base64.cpp and base64.h - Copyright (C) 2004-2008 René Nyffenegger + Copyright (C) 2004-2008 Ren� Nyffenegger This source code is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages @@ -21,7 +21,7 @@ 3. This notice may not be removed or altered from any source distribution. - René Nyffenegger rene.nyffenegger@adp-gmbh.ch + Ren� Nyffenegger rene.nyffenegger@adp-gmbh.ch */ @@ -41,7 +41,7 @@ static inline bool is_base64(unsigned char c) { } // 4J ADDED, -std::string base64_encode(std::string str) +std::string base64_encode(const std::string& str) { return base64_encode( reinterpret_cast(str.c_str()), str.length() ); } diff --git a/Minecraft.Client/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Leaderboards/base64.h index bdd8a9c1..5892a406 100644 --- a/Minecraft.Client/Common/Leaderboards/base64.h +++ b/Minecraft.Client/Common/Leaderboards/base64.h @@ -2,6 +2,6 @@ #include -std::string base64_encode(std::string str); +std::string base64_encode(const std::string& str); std::string base64_encode(unsigned char const* , unsigned int len); std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp index 4f0e5ab7..7fc90077 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -314,13 +314,13 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame Minecraft *pMinecraft = Minecraft::GetInstance(); // Make sure that we have transitioned through any joining/creating stages and are actually playing the game, so that we know the players should be valid bool changedMessage = false; - while(!IsReadyToPlayOrIdle()) - { - changedMessage = true; - pMinecraft->progressRenderer->progressStage( g_NetworkManager.CorrectErrorIDS(IDS_PROGRESS_SAVING_TO_DISC) ); // "Finalizing..." vaguest message I could find - pMinecraft->progressRenderer->progressStagePercentage( g_NetworkManager.GetJoiningReadyPercentage() ); - Sleep(10); - } + while(!IsReadyToPlayOrIdle()) + { + changedMessage = true; + pMinecraft->progressRenderer->progressStage( g_NetworkManager.CorrectErrorIDS(IDS_PROGRESS_SAVING_TO_DISC) ); // "Finalizing..." vaguest message I could find + pMinecraft->progressRenderer->progressStagePercentage( g_NetworkManager.GetJoiningReadyPercentage() ); + Sleep(0); + } if( changedMessage ) { pMinecraft->progressRenderer->progressStagePercentage( 100 ); @@ -898,7 +898,7 @@ int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); while ( tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ) { - Sleep(1); + Sleep(0); } ui.CleanUpSkinReload(); if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) @@ -935,7 +935,7 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) { while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin())) { - Sleep(1); + Sleep(0); } param->levelGen->loadBaseSaveData(); } @@ -977,7 +977,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) while( g_NetworkManager.IsInSession() ) { - Sleep(1); + Sleep(0); } // Xbox should always be online when receiving invites - on PS3 we need to check & ask the user to sign in @@ -1237,7 +1237,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) // wait for the current session to end while( g_NetworkManager.IsInSession() ) { - Sleep(1); + Sleep(0); } // Reset this flag as the we don't need to know that we only lost the room only from this point onwards, the behaviour is exactly the same diff --git a/Minecraft.Client/EnderDragonRenderer.cpp b/Minecraft.Client/EnderDragonRenderer.cpp index 1d9a3ff0..41ba91b6 100644 --- a/Minecraft.Client/EnderDragonRenderer.cpp +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -145,10 +145,11 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do int steps = 8; for (int i = 0; i <= steps; i++) { - double d=i % steps * PI * 2 / steps; - float s = sin(i % steps * PI * 2 / steps) * 0.75f; - float c = cos(i % steps * PI * 2 / steps) * 0.75f; - float u = i % steps * 1.0f / steps; + int idx = i % steps; + double d = idx * PI * 2 / steps; + float s = sin(d) * 0.75f; + float c = cos(d) * 0.75f; + float u = idx * 1.0f / steps; //t->color(0x000000); t->vertexUV(s * 0.2f, c * 0.2f, 0, u, v1); //t->color(0xffffff); diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index dd3231a6..b1934199 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -94,6 +94,17 @@ void EntityRenderDispatcher::staticCtor() instance = new EntityRenderDispatcher(); } +EntityRenderDispatcher::~EntityRenderDispatcher() +{ + AUTO_VAR(itEnd, renderers.end()); + for( classToRendererMap::iterator it = renderers.begin(); it != itEnd; it++ ) + { + delete it->second; + it->second = NULL; + } + renderers.clear(); +} + EntityRenderDispatcher::EntityRenderDispatcher() { glEnable(GL_LIGHTING); diff --git a/Minecraft.Client/EntityRenderDispatcher.h b/Minecraft.Client/EntityRenderDispatcher.h index 86132178..029f44b3 100644 --- a/Minecraft.Client/EntityRenderDispatcher.h +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -1,7 +1,7 @@ #pragma once #include "EntityRenderer.h" -#include "..\Minecraft.World\Entity.h" #include "..\Minecraft.World\JavaIntHash.h" +class Entity; class font; using namespace std; @@ -37,6 +37,7 @@ public: private: EntityRenderDispatcher(); + ~EntityRenderDispatcher(); public: EntityRenderer *getRenderer(eINSTANCEOF e); diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index a43f83f0..fc404da4 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -105,8 +105,6 @@ GameRenderer::GameRenderer(Minecraft *mc) zoom = 1; zoom_x = 0; zoom_y = 0; - rainXa = NULL; - rainZa = NULL; lastActiveTime = Minecraft::currentTimeMillis(); lastNsTime = 0; random = new Random(); @@ -181,8 +179,9 @@ GameRenderer::GameRenderer(Minecraft *mc) // 4J Stu Added to go with 1.8.2 change GameRenderer::~GameRenderer() { - if(rainXa != NULL) delete [] rainXa; - if(rainZa != NULL) delete [] rainZa; + delete random; + delete cameraPos; + delete lb; } void GameRenderer::tick(bool first) // 4J - add bFirst @@ -838,19 +837,21 @@ void GameRenderer::updateLightTexture(float a) Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture float skyDarken1 = level->getSkyDarken((float) 1); + float darken = skyDarken1 * 0.95f + 0.05f; + float rsGsMul = skyDarken1 * 0.65f + 0.35f; + float blockMul = blr * 0.1f + 1.5f; for (int i = 0; i < 256; i++) { - float darken = skyDarken1 * 0.95f + 0.05f; float sky = level->dimension->brightnessRamp[i / 16] * darken; - float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); + float block = level->dimension->brightnessRamp[i % 16] * blockMul; if (level->skyFlashTime > 0) { sky = level->dimension->brightnessRamp[i / 16]; } - float rs = sky * (skyDarken1 * 0.65f + 0.35f); - float gs = sky * (skyDarken1 * 0.65f + 0.35f); + float rs = sky * rsGsMul; + float gs = sky * rsGsMul; float bs = sky; float rb = block; @@ -1526,27 +1527,30 @@ void GameRenderer::tickRain() int x = x0 + random->nextInt(r) - random->nextInt(r); int z = z0 + random->nextInt(r) - random->nextInt(r); int y = level->getTopRainBlock(x, z); - int t = level->getTile(x, y - 1, z); - Biome *biome = level->getBiome(x,z); - if (y <= y0 + r && y >= y0 - r && biome->hasRain() && biome->getTemperature() >= 0.2f) + if (y <= y0 + r && y >= y0 - r) { - float xa = random->nextFloat(); - float za = random->nextFloat(); - if (t > 0) + int t = level->getTile(x, y - 1, z); + Biome *biome = level->getBiome(x,z); + if (biome->hasRain() && biome->getTemperature() >= 0.2f) { - if (Tile::tiles[t]->material == Material::lava) + float xa = random->nextFloat(); + float za = random->nextFloat(); + if (t > 0) { - mc->particleEngine->add( shared_ptr( new SmokeParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za, 0, 0, 0) ) ); - } - else - { - if (random->nextInt(++rainPosSamples) == 0) + if (Tile::tiles[t]->material == Material::lava) { - rainPosX = x + xa; - rainPosY = y + 0.1f - Tile::tiles[t]->getShapeY0(); - rainPosZ = z + za; + mc->particleEngine->add( shared_ptr( new SmokeParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za, 0, 0, 0) ) ); + } + else + { + if (random->nextInt(++rainPosSamples) == 0) + { + rainPosX = x + xa; + rainPosY = y + 0.1f - Tile::tiles[t]->getShapeY0(); + rainPosZ = z + za; + } + mc->particleEngine->add( shared_ptr( new WaterDropParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za) ) ); } - mc->particleEngine->add( shared_ptr( new WaterDropParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za) ) ); } } } @@ -1581,10 +1585,12 @@ void GameRenderer::renderSnowAndRain(float a) turnOnLightLayer(a); - if (rainXa == NULL) + static float rainXa[32 * 32]; + static float rainZa[32 * 32]; + static bool rainArraysInitialized = false; + if (!rainArraysInitialized) { - rainXa = new float[32 * 32]; - rainZa = new float[32 * 32]; + rainArraysInitialized = true; for (int z = 0; z < 32; z++) { diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h index 7c5632d2..04d52ccb 100644 --- a/Minecraft.Client/GameRenderer.h +++ b/Minecraft.Client/GameRenderer.h @@ -128,8 +128,6 @@ private: void tickRain(); private: // 4J - brought forward from 1.8.2 - float *rainXa; - float *rainZa; protected: void renderSnowAndRain(float a); volatile int xMod; diff --git a/Minecraft.Client/HorseRenderer.cpp b/Minecraft.Client/HorseRenderer.cpp index 97f75df1..6a0c5120 100644 --- a/Minecraft.Client/HorseRenderer.cpp +++ b/Minecraft.Client/HorseRenderer.cpp @@ -10,7 +10,7 @@ ResourceLocation HorseRenderer::HORSE_DONKEY_LOCATION = ResourceLocation(TN_MOB_ ResourceLocation HorseRenderer::HORSE_ZOMBIE_LOCATION = ResourceLocation(TN_MOB_HORSE_ZOMBIE); ResourceLocation HorseRenderer::HORSE_SKELETON_LOCATION = ResourceLocation(TN_MOB_HORSE_SKELETON); -std::map HorseRenderer::LAYERED_LOCATION_CACHE; +std::map HorseRenderer::LAYERED_LOCATION_CACHE; HorseRenderer::HorseRenderer(Model *model, float f) : MobRenderer(model, f) { @@ -114,14 +114,14 @@ ResourceLocation *HorseRenderer::getOrCreateLayeredTextureLocation(shared_ptrsecond; + location = &(it->second); } else { - LAYERED_LOCATION_CACHE[textureName] = new ResourceLocation(horse->getLayeredTextureLayers()); + LAYERED_LOCATION_CACHE[textureName] = ResourceLocation(horse->getLayeredTextureLayers()); it = LAYERED_LOCATION_CACHE.find(textureName); - location = it->second; + location = &(it->second); } return location; diff --git a/Minecraft.Client/HorseRenderer.h b/Minecraft.Client/HorseRenderer.h index 71ebde15..9f85f471 100644 --- a/Minecraft.Client/HorseRenderer.h +++ b/Minecraft.Client/HorseRenderer.h @@ -8,7 +8,7 @@ class PathfinderMob; class HorseRenderer : public MobRenderer { private: - static std::map LAYERED_LOCATION_CACHE; + static std::map LAYERED_LOCATION_CACHE; static ResourceLocation HORSE_LOCATION; static ResourceLocation HORSE_MULE_LOCATION; diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 0c9d6e90..3169a99e 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -277,6 +277,7 @@ Application MultiByte v110 + true Application @@ -1445,10 +1446,11 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" true $(OutDir)$(ProjectName).pdb - d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;wsock32.lib + d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) NotSet false - + UseLinkTimeCodeGeneration + $(ProjectDir)xbox\xex-dev.xml @@ -1568,7 +1570,7 @@ xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CUfalse $(OutDir)$(ProjectName).pch MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;NDEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) Disabled Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) true @@ -1576,6 +1578,9 @@ xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CUDefault false Speed + true + true + true true diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index 026c3fa4..4df5141c 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -165,7 +165,7 @@ bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DW //localIp = settings->getString(L"server-ip", L""); //onlineMode = settings->getBoolean(L"online-mode", true); //motd = settings->getString(L"motd", L"A Minecraft Server"); - //motd.replace('§', '$'); + //motd.replace('�', '$'); setAnimals(settings->getBoolean(L"spawn-animals", true)); setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); @@ -210,7 +210,7 @@ bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DW // 4J-JEV: Need to wait for levelGenerationOptions to load. while ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->hasLoadedData() ) - Sleep(1); + Sleep(0); if ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->ready() ) { @@ -319,7 +319,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) { LeaveCriticalSection(&server->m_postProcessCS); } - Sleep(1); + Sleep(0); } while (!server->m_postUpdateTerminate && ShutdownManager::ShouldRun(ShutdownManager::ePostProcessThread)); //#ifndef __PS3__ // One final pass through updates to make sure we're done diff --git a/Minecraft.Client/Orbis/Leaderboards/base64.cpp b/Minecraft.Client/Orbis/Leaderboards/base64.cpp index 01aa4cf0..f03ae118 100644 --- a/Minecraft.Client/Orbis/Leaderboards/base64.cpp +++ b/Minecraft.Client/Orbis/Leaderboards/base64.cpp @@ -1,7 +1,7 @@ /* base64.cpp and base64.h - Copyright (C) 2004-2008 René Nyffenegger + Copyright (C) 2004-2008 Ren� Nyffenegger This source code is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages @@ -21,7 +21,7 @@ 3. This notice may not be removed or altered from any source distribution. - René Nyffenegger rene.nyffenegger@adp-gmbh.ch + Ren� Nyffenegger rene.nyffenegger@adp-gmbh.ch */ @@ -41,7 +41,7 @@ static inline bool is_base64(unsigned char c) { } // 4J ADDED, -std::string base64_encode(std::string str) +std::string base64_encode(const std::string& str) { return base64_encode( reinterpret_cast(str.c_str()), str.length() ); } diff --git a/Minecraft.Client/Orbis/Leaderboards/base64.h b/Minecraft.Client/Orbis/Leaderboards/base64.h index bdd8a9c1..5892a406 100644 --- a/Minecraft.Client/Orbis/Leaderboards/base64.h +++ b/Minecraft.Client/Orbis/Leaderboards/base64.h @@ -2,6 +2,6 @@ #include -std::string base64_encode(std::string str); +std::string base64_encode(const std::string& str); std::string base64_encode(unsigned char const* , unsigned int len); std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/PS3/Leaderboards/base64.cpp b/Minecraft.Client/PS3/Leaderboards/base64.cpp index 01aa4cf0..f03ae118 100644 --- a/Minecraft.Client/PS3/Leaderboards/base64.cpp +++ b/Minecraft.Client/PS3/Leaderboards/base64.cpp @@ -1,7 +1,7 @@ /* base64.cpp and base64.h - Copyright (C) 2004-2008 René Nyffenegger + Copyright (C) 2004-2008 Ren� Nyffenegger This source code is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages @@ -21,7 +21,7 @@ 3. This notice may not be removed or altered from any source distribution. - René Nyffenegger rene.nyffenegger@adp-gmbh.ch + Ren� Nyffenegger rene.nyffenegger@adp-gmbh.ch */ @@ -41,7 +41,7 @@ static inline bool is_base64(unsigned char c) { } // 4J ADDED, -std::string base64_encode(std::string str) +std::string base64_encode(const std::string& str) { return base64_encode( reinterpret_cast(str.c_str()), str.length() ); } diff --git a/Minecraft.Client/PS3/Leaderboards/base64.h b/Minecraft.Client/PS3/Leaderboards/base64.h index bdd8a9c1..5892a406 100644 --- a/Minecraft.Client/PS3/Leaderboards/base64.h +++ b/Minecraft.Client/PS3/Leaderboards/base64.h @@ -2,6 +2,6 @@ #include -std::string base64_encode(std::string str); +std::string base64_encode(const std::string& str); std::string base64_encode(unsigned char const* , unsigned int len); std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.World/Connection.cpp b/Minecraft.World/Connection.cpp index 32c706ed..15b4a734 100644 --- a/Minecraft.World/Connection.cpp +++ b/Minecraft.World/Connection.cpp @@ -341,7 +341,7 @@ bool Connection::readTick() // printf("Con:0x%x readTick close EOS\n",this); // 4J Stu - Remove this line - // Fix for #10410 - UI: If the player is removed from a splitscreened host’s game, the next game that player joins will produce a message stating that the host has left. + // Fix for #10410 - UI: If the player is removed from a splitscreened host�s game, the next game that player joins will produce a message stating that the host has left. //close(DisconnectPacket::eDisconnect_EndOfStream); } @@ -666,7 +666,7 @@ int Connection::runClose(void* lpParam) //try { - Sleep(2000); + Sleep(500); if (con->running) { // 4J TODO writeThread.interrupt(); @@ -690,7 +690,7 @@ int Connection::runSendAndQuit(void* lpParam) //try { - Sleep(2000); + Sleep(500); if (con->running) { // 4J TODO writeThread.interrupt(); diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index a599401f..1ba92543 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -274,6 +274,7 @@ StaticLibrary MultiByte v110 + true StaticLibrary @@ -1195,7 +1196,7 @@ false $(OutDir)$(ProjectName).pch MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;NDEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) Disabled true false @@ -1203,6 +1204,9 @@ true Default Speed + true + true + true true