Or you could cache the player list in a table on resource start and every time someone joins/leaves, you modify the table, so you wouldn't have to getElementsByType("player") every frame.
local players = {} -- make it local to the file, not necessary, but I like
function cachePlayers()
for k, v in ipairs(getElementsByType("player")) do
players[k] = v
end
end
function addPlayer()
table.insert(players,source)
end
function removePlayer()
for k,v in ipairs(players) do
if v == source then
table.remove(players,k)
return
end
end
end
function drawList()
for num,this_player in ipairs(players) do
local plname = getPlayerName(this_player)
dxDrawText(plname,100,100+num*16) --num increases with each cycle, so every name is drawn under previous name
end
end
addEventHandler("onClientRender",root,drawList)
addEventHandler("onClientResourceStart",resourceRoot,cachePlayers)
addEventHandler("onClientPlayerJoin",root,addPlayer) -- add a player into the table when someone joins
addEventHandler("onClientPlayerQuit",root,removePlayer) -- remove a player from table if he quits
It's slightly more complicated but should be faster. Not much, but if you have lot's of stuff going on onClientRender, things should be optimized.