Hello guys, please look at my hud code:
[CODE]local hide = {
CHudHealth = true,
CHudBattery = true,
CHudAmmo = true,
CHudSecondaryAmmo = true,
}
hook.Add( "HUDShouldDraw", "HideHUD", function( name )
if ( hide[ name ] ) then return false end
end )
hook.Add( "HUDPaint", "DrawMyHud", function( )
net.Receive( "Round_Status", function(len)
RoundStatus=net.ReadInt(4)
end)
net.Receive( "Send_Countdown", function(len)
Countdown=net.ReadInt(8)
end)
local BgHudC = 40
local BgHudT = 220
local HudC = 60
local HudT = 200
local health = LocalPlayer():Health()
local armor = LocalPlayer():Armor()
local weapon = LocalPlayer():GetActiveWeapon()
local maxhealth = 200
local maxarmor = 100
local AvatarSize = 64
local AvatarBgSize = 0
//Stats
local HpBarW = 200
local HpBarH = 36
local HpBarBgW = 0
local HpBarBgH = 0
local ArBarW = 100
local ArBarH = 22
local ArBarBgW = 0
local ArBarBgH = 0
//Weapon
local AmBarW = 200
local AmBarH = 36
local AmBarBgW = 0
local AmBarBgH = 0
local ReBarW = 100
local ReBarH = 22
local ReBarBgW = 0
local ReBarBgH = 0
local Border = 2
HpBarBgW=HpBarW+(2*Border)
HpBarBgH=HpBarH+(2*Border)
ArBarBgW=ArBarW+(2*Border)
ArBarBgH=ArBarH+(2*Border)
AmBarBgW=AmBarW+(2*Border)
AmBarBgH=AmBarH+(2*Border)
ReBarBgW=ReBarW+(2*Border)
ReBarBgH=ReBarH+(2*Border)
AvatarBgSize=AvatarSize+(2*Border)
local versionL = 220
local versionH = 29
local status = " "
draw.SimpleText( team.GetName( LocalPlayer():Team() ), "Tahoma 25",ScrW()/2, ScrH() * 0.92,Color(255,255,255),1,1 )
local AvatarSize = 64
draw.RoundedBox(4,(ScrW()/2)-((AvatarBgSize)/2), ScrH()-(AvatarBgSize+Border), AvatarBgSize, AvatarBgSize, Color(BgHudC,BgHudC,BgHudC,BgHudT))
local Avatar = vgui.Create( "AvatarImage", Panel )
Avatar:SetSize( AvatarSize, AvatarSize )
Avatar:SetPos( (ScrW()/2)-(AvatarSize/2), ScrH()-(AvatarSize+(2*Border)) )
Avatar:SetPlayer( LocalPlayer(), AvatarSize )
if(RoundStatus == 0)then
if(team.NumPlayers( 3 )==1)then
status = "Waiting for " .. 2-team.NumPlayers( 3 ) .. " more players!"
elseif(team.NumPlayers( 3 )==0)then
status = "Waiting for " .. 2-team.NumPlayers( 3 ) .. " more players!"
end
end
if(RoundStatus == 1)then
status = Countdown .. " sec until Starts"
end
if(RoundStatus == 2)then
if(ClientDead == 1)then
status = team.TotalDeaths( 1 ) .. " dead."
timer.Create( "ClientStatusTimer", 4, 1, function()
ClientDead = 0
end)
end
end
draw.SimpleText( status, "Tahoma 40",ScrW() *0.5, ScrH() *0.1,Color(255,255,255),1,1 )
if(LocalPlayer():Team()==1)then
if health > 0 then
draw.RoundedBox(4,(ScrW()/2)-(HpBarBgW+(AvatarBgSize/2)+Border)-4, ScrH()-(HpBarBgH+Border), HpBarBgW+4, HpBarBgH,Color(BgHudC,BgHudC,BgHudC,BgHudT))
draw.RoundedBox(4,(ScrW()/2)-(HpBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(HpBarH+(2*Border)), HpBarW+4, HpBarH,Color(HudC,HudC,HudC,HudT))
draw.RoundedBox(4,(ScrW()/2)-(HpBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(HpBarH+(2*Border)), health*(HpBarW/maxhealth)+4, HpBarH, Color( (health-maxhealth)*-(255/maxhealth), health*(255/maxhealth), 0 ))
draw.SimpleText(health.. "/" .. maxhealth .. " Health","Tahoma 25",(ScrW()/2)-((HpBarW/2)+(AvatarBgSize/2)+(2*Border)), ScrH()-((HpBarH/2)+(2*Border)), Color( 255,255,255 ), 1, 1)
draw.RoundedBox(4,(ScrW()/2)-(ArBarBgW+(AvatarBgSize/2)+Border)-4, ScrH()-(ArBarBgH+HpBarBgH+(2*Border)), ArBarBgW+4, ArBarBgH, Color(BgHudC,BgHudC,BgHudC,BgHudT))
draw.RoundedBox(4,(ScrW()/2)-(ArBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(ArBarBgH+HpBarBgH+(1*Border)), ArBarW+4, ArBarH,Color(HudC,HudC,HudC,HudT))
draw.RoundedBox(4,(ScrW()/2)-(ArBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(ArBarBgH+HpBarBgH+(1*Border)), armor*(ArBarW/maxarmor)+4, ArBarH, Color((armor-100)*-(255/maxarmor),(armor-100)*-(255/maxarmor),255))
draw.SimpleText(armor .. "/100 Armor","Tahoma 16",(ScrW()/2)-((ArBarW/2)+(AvatarBgSize/2)+(2*Border)), ScrH()-((ArBarBgH/2)+HpBarBgH+(2*Border)),Color(255,255,255),1,1)
end
end
//Spectator View
if(LocalPlayer():Team()==2)then
draw.RoundedBox( 0, 0, 0, ScrW(), 60, Color(0,0,0,240) )
draw.RoundedBox( 0, 0, ScrH()-60, ScrW(), 60, Color(0,0,0,240) )
draw.SimpleText("Spectating","Tahoma 25", ScrW()*0.5, 44,Color(255,255,255),1,1)
end
end)[/CODE]
console says
cl_hud.lua:97: attempt to concatenate global 'Countdown' (a nil value)
ingame:
240fps at start
after 10 sec
60fps
after 30sec
30fps
goes down to 20 fps
net.Receive shouldn't be in the HUDPaint hook (hence fps drop) and the variables 'Countdown' and 'RoundStatus' are only in the scope of their net receive functions which is why Countdown is undefined
[code]
local hide = {
CHudHealth = true,
CHudBattery = true,
CHudAmmo = true,
CHudSecondaryAmmo = true,
}
hook.Add( "HUDShouldDraw", "HideHUD", function( name )
if ( hide[ name ] ) then return false end
end )
local Countdown = 0
local RoundStatus = 0
net.Receive( "Round_Status", function(len)
RoundStatus=net.ReadInt(4)
end)
net.Receive( "Send_Countdown", function(len)
Countdown=net.ReadInt(8)
end)
hook.Add( "HUDPaint", "DrawMyHud", function( )
local BgHudC = 40
local BgHudT = 220
local HudC = 60
local HudT = 200
local health = LocalPlayer():Health()
local armor = LocalPlayer():Armor()
local weapon = LocalPlayer():GetActiveWeapon()
local maxhealth = 200
local maxarmor = 100
local AvatarSize = 64
local AvatarBgSize = 0
//Stats
local HpBarW = 200
local HpBarH = 36
local HpBarBgW = 0
local HpBarBgH = 0
local ArBarW = 100
local ArBarH = 22
local ArBarBgW = 0
local ArBarBgH = 0
//Weapon
local AmBarW = 200
local AmBarH = 36
local AmBarBgW = 0
local AmBarBgH = 0
local ReBarW = 100
local ReBarH = 22
local ReBarBgW = 0
local ReBarBgH = 0
local Border = 2
HpBarBgW=HpBarW+(2*Border)
HpBarBgH=HpBarH+(2*Border)
ArBarBgW=ArBarW+(2*Border)
ArBarBgH=ArBarH+(2*Border)
AmBarBgW=AmBarW+(2*Border)
AmBarBgH=AmBarH+(2*Border)
ReBarBgW=ReBarW+(2*Border)
ReBarBgH=ReBarH+(2*Border)
AvatarBgSize=AvatarSize+(2*Border)
local versionL = 220
local versionH = 29
local status = " "
draw.SimpleText( team.GetName( LocalPlayer():Team() ), "Tahoma 25",ScrW()/2, ScrH() * 0.92,Color(255,255,255),1,1 )
local AvatarSize = 64
draw.RoundedBox(4,(ScrW()/2)-((AvatarBgSize)/2), ScrH()-(AvatarBgSize+Border), AvatarBgSize, AvatarBgSize, Color(BgHudC,BgHudC,BgHudC,BgHudT))
local Avatar = vgui.Create( "AvatarImage", Panel )
Avatar:SetSize( AvatarSize, AvatarSize )
Avatar:SetPos( (ScrW()/2)-(AvatarSize/2), ScrH()-(AvatarSize+(2*Border)) )
Avatar:SetPlayer( LocalPlayer(), AvatarSize )
if(RoundStatus == 0)then
if(team.NumPlayers( 3 )==1)then
status = "Waiting for " .. 2-team.NumPlayers( 3 ) .. " more players!"
elseif(team.NumPlayers( 3 )==0)then
status = "Waiting for " .. 2-team.NumPlayers( 3 ) .. " more players!"
end
end
if(RoundStatus == 1)then
status = Countdown .. " sec until Starts"
end
if(RoundStatus == 2)then
if(ClientDead == 1)then
status = team.TotalDeaths( 1 ) .. " dead."
timer.Create( "ClientStatusTimer", 4, 1, function()
ClientDead = 0
end)
end
end
draw.SimpleText( status, "Tahoma 40",ScrW() *0.5, ScrH() *0.1,Color(255,255,255),1,1 )
if(LocalPlayer():Team()==1)then
if health > 0 then
draw.RoundedBox(4,(ScrW()/2)-(HpBarBgW+(AvatarBgSize/2)+Border)-4, ScrH()-(HpBarBgH+Border), HpBarBgW+4, HpBarBgH,Color(BgHudC,BgHudC,BgHudC,BgHudT))
draw.RoundedBox(4,(ScrW()/2)-(HpBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(HpBarH+(2*Border)), HpBarW+4, HpBarH,Color(HudC,HudC,HudC,HudT))
draw.RoundedBox(4,(ScrW()/2)-(HpBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(HpBarH+(2*Border)), health*(HpBarW/maxhealth)+4, HpBarH, Color( (health-maxhealth)*-(255/maxhealth), health*(255/maxhealth), 0 ))
draw.SimpleText(health.. "/" .. maxhealth .. " Health","Tahoma 25",(ScrW()/2)-((HpBarW/2)+(AvatarBgSize/2)+(2*Border)), ScrH()-((HpBarH/2)+(2*Border)), Color( 255,255,255 ), 1, 1)
draw.RoundedBox(4,(ScrW()/2)-(ArBarBgW+(AvatarBgSize/2)+Border)-4, ScrH()-(ArBarBgH+HpBarBgH+(2*Border)), ArBarBgW+4, ArBarBgH, Color(BgHudC,BgHudC,BgHudC,BgHudT))
draw.RoundedBox(4,(ScrW()/2)-(ArBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(ArBarBgH+HpBarBgH+(1*Border)), ArBarW+4, ArBarH,Color(HudC,HudC,HudC,HudT))
draw.RoundedBox(4,(ScrW()/2)-(ArBarW+(AvatarBgSize/2)+(2*Border))-4, ScrH()-(ArBarBgH+HpBarBgH+(1*Border)), armor*(ArBarW/maxarmor)+4, ArBarH, Color((armor-100)*-(255/maxarmor),(armor-100)*-(255/maxarmor),255))
draw.SimpleText(armor .. "/100 Armor","Tahoma 16",(ScrW()/2)-((ArBarW/2)+(AvatarBgSize/2)+(2*Border)), ScrH()-((ArBarBgH/2)+HpBarBgH+(2*Border)),Color(255,255,255),1,1)
end
end
//Spectator View
if(LocalPlayer():Team()==2)then
draw.RoundedBox( 0, 0, 0, ScrW(), 60, Color(0,0,0,240) )
draw.RoundedBox( 0, 0, ScrH()-60, ScrW(), 60, Color(0,0,0,240) )
draw.SimpleText("Spectating","Tahoma 25", ScrW()*0.5, 44,Color(255,255,255),1,1)
end
end)
[/code]
Thanks for the fast REPLY! :)
[editline]31st December 2015[/editline]
ok i changed it but i get 35fps at the end
i have gtx780 and quadcore normally i have 120fps in gmod in other gamemodes
what is wrong now?
when i put the cl_hud.lua away i have 120fps on the server but with it 35fps
[editline]31st December 2015[/editline]
[CODE]local Countdown = 0
local RoundStatus = 0
net.Receive( "Round_Status", function(len)
RoundStatus=net.ReadInt(4)
end)
net.Receive( "Send_Countdown", function(len)
Countdown=net.ReadInt(8)
end)[/CODE]
this was added right?
and net.receives both are away from painthud
[editline]31st December 2015[/editline]
This is the code that make the fps goes down i comment out and this is the result:
[CODE] --draw.SimpleText( team.GetName( LocalPlayer():Team() ), "Tahoma 25",ScrW()/2, ScrH() * 0.92,Color(255,255,255),1,1 )
--local Avatar = vgui.Create( "AvatarImage", Panel )
--Avatar:SetSize( AvatarSize, AvatarSize )
--Avatar:SetPos( (ScrW()/2)-(AvatarSize/2), ScrH()-(AvatarSize+(2*Border)) )
--Avatar:SetPlayer( LocalPlayer(), AvatarSize )
--if(RoundStatus == 0)then
-- if(team.NumPlayers( 3 )==1)then
-- status = "Waiting for " .. 2-team.NumPlayers( 3 )
-- elseif(team.NumPlayers( 3 )==0)then
-- status = "Waiting for " .. 2-team.NumPlayers( 3 )
-- end
--end
--if(RoundStatus == 1)then
-- status = Countdown .. " sec until Starts"
--end
--if(RoundStatus == 2)then
-- if(ClientDead == 1)then
-- status = team.TotalDeaths( 1 ) .. " dead. " .. team.NumPlayers( 1 ) .. " alive."
-- timer.Create( "ClientStatusTimer", 4, 1, function()
-- ClientDead = 0
-- end)
-- end
--end
[/CODE]
take the avatar out the HUD.Paint() hook, you're drawing every frame!
is there a way to remove it? after it draw it once
[editline]31st December 2015[/editline]
i mean when it was outside of hud.paint()
Just draw it out of HUD Paint? I don't quite understand what you're saying
A vgui is an element and don't something you call in HUDPaint.
You are creating a new AvatarImage every frame when its inside HUDPaint.
1 seccond = 30 AvatarImages on the screen to draw
30 seconds = 900 AvatarImages on the screen to draw
1 min = 1800 AvatarImages to draw.
..ect
It is a comment problem for beginners and there are many examples and solutions, if you google it:
[url]https://facepunch.com/showthread.php?t=1272284[/url]
Draw the avatar outside of the hook, and if needed use PaintManual, and if you do such with other VGUI elements, like the PlyModel, make an function to update it with the model on spawn.
Not that it really affects FPS too much, but you're recreating tons of variables every time the hud is drawn. Things like "maxhealth" only need to be stated once, and you can do so outside of and above the HUDPaint hook.
no i mean when i spawn the avatarimage, i cant get it away after it it is there atleast i quit the server
Sorry, you need to Log In to post a reply to this thread.