From 14d9ecb8a3aa76c40d2f428476915f3fadb6d4f1 Mon Sep 17 00:00:00 2001 From: AlexALX Date: Thu, 30 Jul 2026 15:00:06 +0300 Subject: [PATCH 1/4] Add wire_digitalscreen_rate convar This convar multiply all digital screen limits in sync, so wire_digitalscreen_rate 10 make it work exactly 10x faster. --- lua/entities/gmod_wire_digitalscreen/cl_init.lua | 6 +++--- lua/entities/gmod_wire_digitalscreen/init.lua | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lua/entities/gmod_wire_digitalscreen/cl_init.lua b/lua/entities/gmod_wire_digitalscreen/cl_init.lua index ae6aedef67..0e6ae1fbc8 100644 --- a/lua/entities/gmod_wire_digitalscreen/cl_init.lua +++ b/lua/entities/gmod_wire_digitalscreen/cl_init.lua @@ -1,6 +1,6 @@ include("shared.lua") - +local dsRate = GetConVar("wire_digitalscreen_rate") function ENT:SendData() net.Start("wire_interactiveprop_action") @@ -143,7 +143,7 @@ end function ENT:Think() if self.buffer[1] ~= nil then - local maxtime = SysTime() + RealFrameTime() * 0.05 -- do more depending on client FPS. Higher fps = more work + local maxtime = SysTime() + RealFrameTime() * (0.05*dsRate:GetFloat()) -- do more depending on client FPS. Higher fps = more work while SysTime() < maxtime and self.buffer[1] do if not self.co or coroutine.status(self.co) == "dead" then @@ -320,7 +320,7 @@ function ENT:Draw(flags) if self.NeedRefresh then self.NeedRefresh = false - local maxtime = SysTime() + RealFrameTime() * 0.01 + local maxtime = SysTime() + RealFrameTime() * (0.01*dsRate:GetFloat()) self.GPU:RenderToGPU(function() local idx = 0 diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index 3be26fc1ee..17d8b452dd 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -5,6 +5,7 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" +local dsRate = CreateConVar("wire_digitalscreen_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) function ENT:InitInteractive() local model = self:GetModel() @@ -170,9 +171,20 @@ end ---------------------------------------------------- -- Processing limiters and global bandwidth limiters local maxProcessingTime = engine.TickInterval() * 0.9 -local defaultMaxBandwidth = 10000 -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. -local defaultMaxGlobalBandwidth = 20000 -- 20k is a good global limit in my testing. higher than that seems to cause issues + +local dsRateValue = dsRate:GetFloat() +local defaultMaxBandwidth = 100000 * dsRateValue -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. +local defaultMaxGlobalBandwidth = 200000 * dsRateValue -- 20k is a good global limit in my testing. higher than that seems to cause issues local maxBandwidth = defaultMaxBandwidth + +local function updateBW() + local dsRateValue = dsRate:GetFloat() + + defaultMaxBandwidth = 100000 * dsRateValue + defaultMaxGlobalBandwidth = 200000 * dsRateValue +end +cvars.AddChangeCallback("wire_digitalscreen_rate", updateBW) + local globalBandwidthLookup = {} local function calcGlobalBW() maxBandwidth = defaultMaxGlobalBandwidth From eb95d91faf81a0512ec07330770e9b2c15f5bfac Mon Sep 17 00:00:00 2001 From: AlexALX Date: Thu, 30 Jul 2026 15:14:07 +0300 Subject: [PATCH 2/4] add a way to read digital screen rate --- lua/entities/gmod_wire_digitalscreen/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index 17d8b452dd..3a6c6d0655 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -6,6 +6,7 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" local dsRate = CreateConVar("wire_digitalscreen_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) +local dsRateValue = dsRate:GetFloat() function ENT:InitInteractive() local model = self:GetModel() @@ -129,6 +130,7 @@ function ENT:ReadCell(Address) Address = math.floor(Address) if Address < 0 then return nil end if Address >= 1048577 then return nil end + if (Address==1048576) then return dsRateValue end -- report its rate return self.Memory[Address] or 0 end @@ -172,13 +174,12 @@ end -- Processing limiters and global bandwidth limiters local maxProcessingTime = engine.TickInterval() * 0.9 -local dsRateValue = dsRate:GetFloat() local defaultMaxBandwidth = 100000 * dsRateValue -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. local defaultMaxGlobalBandwidth = 200000 * dsRateValue -- 20k is a good global limit in my testing. higher than that seems to cause issues local maxBandwidth = defaultMaxBandwidth local function updateBW() - local dsRateValue = dsRate:GetFloat() + dsRateValue = dsRate:GetFloat() defaultMaxBandwidth = 100000 * dsRateValue defaultMaxGlobalBandwidth = 200000 * dsRateValue From 8427929ba8aa8031402ded7918720f499f3eb32a Mon Sep 17 00:00:00 2001 From: AlexALX Date: Mon, 3 Aug 2026 19:01:03 +0300 Subject: [PATCH 3/4] DS rate split one convar to two: wire_digitalscreen_draw_rate - purelly for draw rate speed wire_digitalscreen_net_bandwidth - set global bandwidth limit, individual devices always have 50% of global rate --- .../gmod_wire_digitalscreen/cl_init.lua | 6 ++--- lua/entities/gmod_wire_digitalscreen/init.lua | 22 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lua/entities/gmod_wire_digitalscreen/cl_init.lua b/lua/entities/gmod_wire_digitalscreen/cl_init.lua index 0e6ae1fbc8..bf90327edd 100644 --- a/lua/entities/gmod_wire_digitalscreen/cl_init.lua +++ b/lua/entities/gmod_wire_digitalscreen/cl_init.lua @@ -1,6 +1,6 @@ include("shared.lua") -local dsRate = GetConVar("wire_digitalscreen_rate") +local dsDrawRate = GetConVar("wire_digitalscreen_draw_rate") function ENT:SendData() net.Start("wire_interactiveprop_action") @@ -143,7 +143,7 @@ end function ENT:Think() if self.buffer[1] ~= nil then - local maxtime = SysTime() + RealFrameTime() * (0.05*dsRate:GetFloat()) -- do more depending on client FPS. Higher fps = more work + local maxtime = SysTime() + RealFrameTime() * (0.05*dsDrawRate:GetFloat()) -- do more depending on client FPS. Higher fps = more work while SysTime() < maxtime and self.buffer[1] do if not self.co or coroutine.status(self.co) == "dead" then @@ -320,7 +320,7 @@ function ENT:Draw(flags) if self.NeedRefresh then self.NeedRefresh = false - local maxtime = SysTime() + RealFrameTime() * (0.01*dsRate:GetFloat()) + local maxtime = SysTime() + RealFrameTime() * (0.01*dsDrawRate:GetFloat()) self.GPU:RenderToGPU(function() local idx = 0 diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index 3a6c6d0655..cb1aeb1165 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -5,8 +5,9 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" -local dsRate = CreateConVar("wire_digitalscreen_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) -local dsRateValue = dsRate:GetFloat() +local dsDrawRate = CreateConVar("wire_digitalscreen_draw_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) +local dsNetBandwidth = CreateConVar("wire_digitalscreen_net_bandwidth", 200000, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) +local dsNetBandwidthValue = dsNetBandwidth:GetInt() function ENT:InitInteractive() local model = self:GetModel() @@ -129,8 +130,9 @@ end function ENT:ReadCell(Address) Address = math.floor(Address) if Address < 0 then return nil end - if Address >= 1048577 then return nil end - if (Address==1048576) then return dsRateValue end -- report its rate + if Address >= 1048578 then return nil end + if (Address==1048577) then return math.Round(dsNetBandwidthValue/2) end -- report its netbandwidth + if (Address==1048576) then return dsDrawRate:GetFloat() end -- report its draw rate return self.Memory[Address] or 0 end @@ -174,17 +176,17 @@ end -- Processing limiters and global bandwidth limiters local maxProcessingTime = engine.TickInterval() * 0.9 -local defaultMaxBandwidth = 100000 * dsRateValue -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. -local defaultMaxGlobalBandwidth = 200000 * dsRateValue -- 20k is a good global limit in my testing. higher than that seems to cause issues +local defaultMaxBandwidth = math.Round(dsNetBandwidthValue/2) -- 10k per screen max limit - is arbitrary. needs to be smaller than the global limit. +local defaultMaxGlobalBandwidth = dsNetBandwidthValue -- 20k is a good global limit in my testing. higher than that seems to cause issues local maxBandwidth = defaultMaxBandwidth local function updateBW() - dsRateValue = dsRate:GetFloat() + dsNetBandwidthValue = dsNetBandwidth:GetInt() - defaultMaxBandwidth = 100000 * dsRateValue - defaultMaxGlobalBandwidth = 200000 * dsRateValue + defaultMaxBandwidth = math.Round(dsNetBandwidthValue/2) + defaultMaxGlobalBandwidth = dsNetBandwidthValue end -cvars.AddChangeCallback("wire_digitalscreen_rate", updateBW) +cvars.AddChangeCallback("wire_digitalscreen_net_bandwidth", updateBW) local globalBandwidthLookup = {} local function calcGlobalBW() From b4a12bbcefe32aed9b3d4e1e31cd949f79feda1e Mon Sep 17 00:00:00 2001 From: AlexALX Date: Mon, 3 Aug 2026 19:02:30 +0300 Subject: [PATCH 4/4] wire_digitalscreen_net_bandwidth don't need to be replicated --- lua/entities/gmod_wire_digitalscreen/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/entities/gmod_wire_digitalscreen/init.lua b/lua/entities/gmod_wire_digitalscreen/init.lua index cb1aeb1165..c1dfba5099 100644 --- a/lua/entities/gmod_wire_digitalscreen/init.lua +++ b/lua/entities/gmod_wire_digitalscreen/init.lua @@ -6,7 +6,7 @@ DEFINE_BASECLASS( "base_wire_entity" ) ENT.WireDebugName = "DigitalScreen" local dsDrawRate = CreateConVar("wire_digitalscreen_draw_rate", 1, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) -local dsNetBandwidth = CreateConVar("wire_digitalscreen_net_bandwidth", 200000, { FCVAR_REPLICATED, FCVAR_ARCHIVE }) +local dsNetBandwidth = CreateConVar("wire_digitalscreen_net_bandwidth", 200000, { FCVAR_ARCHIVE }) local dsNetBandwidthValue = dsNetBandwidth:GetInt() function ENT:InitInteractive()