Hallo ihr,
ich habe mal ein paar Fragen zur Scriptperformance und wollte dazu mal die Meinung von ein paar Kennern einholen. Falls es wichtig ist, ich scripte mit Pseudo-OOP. *:)*
1. Frage: Serverseitige Timer
Ich habe ein paar serverseitige Klassen, welche Instanzen erzeugen und in denen wiederum zum aktualisieren von Funktionen Timer laufen. Was ist der performancetechnische bessere Weg? Als Beispiel Pseudocode aus einer Klasse "PlayerManagerS" sowie einer Unterklasse "PlayerS" welche in mehreren Instanzen verfügbar sein kann.
Beispiel (so nutze ich es im Moment) Jede Instanz hat einen eigenen Update-Timer.
--PlayerManagerS
function PlayerManagerS:addPlayer(player)
if (player) then
.
.
.
local playerTable = {}
playerTable.player = player
playerTable.instance = new(PlayerS, self, player)
table.insert(self.players, playerTable)
.
.
.
end
end
Alles anzeigen
--PlayerS
function PlayerS:constructor(parent, player)
self.parent = parent
self.player = player
self.updateInterval = 1000
self.m_Update = function() self:update() end
self.updateTimer = setTimer(self.m_Update, self.updateInterval, 0)
.
.
.
end
function PlayerS:update()
-- do some stuff
end
Alles anzeigen
Oder das ganze lieber mit nur einem zentralem Timer für alle betreffenden Instanzen handeln? Also so in der Art dann:
--PlayerManagerS
function PlayerManagerS:constructor(parent)
self.parent = parent
self.updateInterval = 1000
self.m_Update = function() self:update() end
self.updateTimer = setTimer(self.m_Update, self.updateInterval, 0)
.
.
.
end
function PlayerManagerS:addPlayer(player)
if (player) then
.
.
.
local playerTable = {}
playerTable.player = player
playerTable.instance = new(PlayerS, self, player)
table.insert(self.players, playerTable)
.
.
.
end
end
function PlayerManagerS:update()
for index, playerCore in ipairs(self.players) do
if (playerCore) then
playerCore.instance:update()
end
end
end
Alles anzeigen
--Player
function PlayerS:constructor(parent, player)
self.parent = parent
self.player = player
.
.
.
end
function PlayerS:update()
-- do some stuff
end
Alles anzeigen
2. Frage: Colshapes (client oder serverseitige)
Ich greife im Moment auf hunderte Colshapes zurück welche in verschiedenen Instanzen existieren und wo ich auch tunlichst darauf achte die immer schön wieder aufzuräumen. Hier habe ich nun eine Frage welche Anwendung des Eventhandlers die eventuell effektivere für hunderte von Colshapes ist.
Beispiel (so nutze ich es im Moment)
function KlasseX:constructor()
.
.
.
self.collissionShape = createColSphere(self.x, self.y, self.z, self.collissionSize)
if (self.collissionShape) then
self.m_Test = function(...) self:myTest(...) end
addEventHandler("onColShapeHit", self.collissionShape, self.m_Test)
end
.
.
.
end
function KlasseX:myTest(element)
if (isElement(element)) and (getElementType(element) == "vehicle")then
-- do some stuff
end
end
Alles anzeigen
Oder lieber nur eine zentrale Hitfunktion erstellen, den Eventhandler dafür auf Root triggern lassen und die Source vergleichen? Also so in der Art:
function KlasseMain:constructor()
.
.
.
self.collissionShape = createColSphere(self.x, self.y, self.z, self.collissionSize)
self.m_HitForAll = function(...) self:hitForAll(...) end
addEventHandler("onColShapeHit", root, self.m_HitForAll)
.
.
.
end
function KlasseMain:hitForAll(element)
if (source == self.collissionShape) then
if (isElement(element)) and (getElementType(element) == "vehicle")then
-- do some stuff
end
end
end
Alles anzeigen
Vielen Dank für das viele lesen und vielleicht habt ihr ja gute Vorschläge oder Anregungen was, wann, wie und warum besser ist. *^^*
Viele Grüße,
Sam@ke