Core/Time: Remove artificially high minimal update intervals
(cherry picked from commit 3a67e376811743be208da4aab8a9e452e1ae637e)
This commit is contained in:
1 parent
7f62463f36
commit
267cd04e57
5 files changed
+56
-15
No files matched your search
@@ -42,7 +42,7 @@ class AreaTrigger;
|
||||
#define CENTER_GRID_OFFSET (SIZE_OF_GRIDS/2)
|
||||
|
||||
#define MIN_GRID_DELAY (MINUTE*IN_MILLISECONDS)
|
||||
#define MIN_MAP_UPDATE_DELAY 50
|
||||
#define MIN_MAP_UPDATE_DELAY 1
|
||||
|
||||
#define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS)
|
||||
|
||||
|
||||
@@ -751,7 +751,7 @@ void World::LoadConfigSettings(bool reload)
|
||||
if (reload)
|
||||
sMapMgr->SetGridCleanUpDelay(m_int_configs[CONFIG_INTERVAL_GRIDCLEAN]);
|
||||
|
||||
m_int_configs[CONFIG_INTERVAL_MAPUPDATE] = sConfigMgr->GetIntDefault("MapUpdateInterval", 100);
|
||||
m_int_configs[CONFIG_INTERVAL_MAPUPDATE] = sConfigMgr->GetIntDefault("MapUpdateInterval", 10);
|
||||
if (m_int_configs[CONFIG_INTERVAL_MAPUPDATE] < MIN_MAP_UPDATE_DELAY)
|
||||
{
|
||||
TC_LOG_ERROR("server.loading", "MapUpdateInterval (%i) must be greater %u. Use this minimal value.", m_int_configs[CONFIG_INTERVAL_MAPUPDATE], MIN_MAP_UPDATE_DELAY);
|
||||
|
||||
@@ -122,8 +122,8 @@ protected:
|
||||
{
|
||||
TC_LOG_DEBUG("misc", "Network Thread Starting");
|
||||
|
||||
_updateTimer.expires_from_now(boost::posix_time::milliseconds(10));
|
||||
_updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this));
|
||||
_updateTimer.expires_from_now(boost::posix_time::milliseconds(1));
|
||||
_updateTimer.async_wait([this](boost::system::error_code const&) { Update(); });
|
||||
_ioContext.run();
|
||||
|
||||
TC_LOG_DEBUG("misc", "Network Thread exits");
|
||||
@@ -136,8 +136,8 @@ protected:
|
||||
if (_stopped)
|
||||
return;
|
||||
|
||||
_updateTimer.expires_from_now(boost::posix_time::milliseconds(10));
|
||||
_updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this));
|
||||
_updateTimer.expires_from_now(boost::posix_time::milliseconds(1));
|
||||
_updateTimer.async_wait([this](boost::system::error_code const&) { Update(); });
|
||||
|
||||
AddNewSockets();
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace fs = boost::filesystem;
|
||||
#define _TRINITY_CORE_CONFIG "worldserver.conf"
|
||||
#endif
|
||||
|
||||
#define WORLD_SLEEP_CONST 50
|
||||
#define WORLD_SLEEP_CONST 1
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "ServiceWin32.h"
|
||||
@@ -84,6 +84,9 @@ char serviceDescription[] = "TrinityCore World of Warcraft emulator world servic
|
||||
* 2 - paused
|
||||
*/
|
||||
int m_ServiceStatus = -1;
|
||||
|
||||
#include <boost/dll/shared_library.hpp>
|
||||
#include <timeapi.h>
|
||||
#endif
|
||||
|
||||
class FreezeDetector
|
||||
@@ -138,6 +141,44 @@ extern int main(int argc, char** argv)
|
||||
return WinServiceUninstall() == true ? 0 : 1;
|
||||
else if (configService.compare("run") == 0)
|
||||
WinServiceRun();
|
||||
|
||||
Optional<UINT> newTimerResolution;
|
||||
boost::system::error_code dllError;
|
||||
std::shared_ptr<boost::dll::shared_library> winmm(new boost::dll::shared_library("winmm.dll", dllError, boost::dll::load_mode::search_system_folders), [&](boost::dll::shared_library* lib)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (newTimerResolution)
|
||||
lib->get<decltype(timeEndPeriod)>("timeEndPeriod")(*newTimerResolution);
|
||||
}
|
||||
catch (std::exception const&)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
delete lib;
|
||||
});
|
||||
|
||||
if (winmm->is_loaded())
|
||||
{
|
||||
try
|
||||
{
|
||||
auto timeGetDevCapsPtr = winmm->get<decltype(timeGetDevCaps)>("timeGetDevCaps");
|
||||
// setup timer resolution
|
||||
TIMECAPS timeResolutionLimits;
|
||||
if (timeGetDevCapsPtr(&timeResolutionLimits, sizeof(TIMECAPS)) == TIMERR_NOERROR)
|
||||
{
|
||||
auto timeBeginPeriodPtr = winmm->get<decltype(timeBeginPeriod)>("timeBeginPeriod");
|
||||
newTimerResolution = std::min(std::max(timeResolutionLimits.wPeriodMin, 1u), timeResolutionLimits.wPeriodMax);
|
||||
timeBeginPeriodPtr(*newTimerResolution);
|
||||
}
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
printf("Failed to initialize timer resolution: %s\n", e.what());
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
std::string configError;
|
||||
@@ -443,16 +484,16 @@ void WorldUpdateLoop()
|
||||
realCurrTime = getMSTime();
|
||||
|
||||
uint32 diff = getMSTimeDiff(realPrevTime, realCurrTime);
|
||||
if (!diff)
|
||||
{
|
||||
// sleep until enough time passes that we can update all timers
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
continue;
|
||||
}
|
||||
|
||||
sWorld->Update(diff);
|
||||
realPrevTime = realCurrTime;
|
||||
|
||||
uint32 executionTimeDiff = getMSTimeDiff(realCurrTime, getMSTime());
|
||||
|
||||
// we know exactly how long it took to update the world, if the update took less than WORLD_SLEEP_CONST, sleep for WORLD_SLEEP_CONST - world update time
|
||||
if (executionTimeDiff < WORLD_SLEEP_CONST)
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(WORLD_SLEEP_CONST - executionTimeDiff));
|
||||
|
||||
#ifdef _WIN32
|
||||
if (m_ServiceStatus == 0)
|
||||
World::StopNow(SHUTDOWN_EXIT_CODE);
|
||||
|
||||
@@ -339,9 +339,9 @@ GridCleanUpDelay = 300000
|
||||
#
|
||||
# MapUpdateInterval
|
||||
# Description: Time (milliseconds) for map update interval.
|
||||
# Default: 100 - (0.1 second)
|
||||
# Default: 10 - (0.01 second)
|
||||
|
||||
MapUpdateInterval = 100
|
||||
MapUpdateInterval = 10
|
||||
|
||||
#
|
||||
# ChangeWeatherInterval
|
||||
|
||||
Reference in new issue
Block a user