2010-07-09 8 views
5

Ich entwickle derzeit eine C# .net XNA-Spiel-Engine.C# Delegierte Leistung in XNA-Spiel

Ich habe versucht, einen Weg zu einem Update Manager/Scheduler/Event-System zu finden. Derzeit verwende ich Delegaten, um eine Möglichkeit zum Erstellen dynamischer geplanter Aufgaben und Ereignisse bereitzustellen.

Ich habe kürzlich gelesen, dass Delegaten langsam sein können. Die Delegierten in meinem Spiel werden in jedem Frame aufgerufen und ich frage mich, ob es einen Leistungseinbruch geben kann?

Update:

ich gerade fand auch diese http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

Dies ist, was ich machte mir Sorgen, und ich denke, es kann um es ein Weg sein. Danke für all die anderen Informationen.

+0

Schreiben Sie ein kleines Mikrobenzeichen und finden Sie es selbst heraus? – Brian

+0

Was Ihr Update betrifft - erstellen Sie die Delegierten nicht alle 1/60 Sek. Neu. Aber selbst wenn Sie das täten, wären die Instanzen alle in Gen0 auf dem Heap und der GC ist sehr effizient beim Sammeln von Gen0. – codekaizen

+0

@codekaizen Außer der GC auf der Xbox ist nicht generationsübergreifend! –

Antwort

8

Machen Sie sich keine Sorgen - Delegierte sind etwas langsamer als ein normaler Funktionsaufruf, aber wenn Sie sie nicht mehrere Millionen Mal pro Sekunde aufrufen, bezweifle ich sehr, dass Sie es bemerken würden.

Ich würde vorschlagen, mit Delegierten zu bleiben, es sei denn, es erweist sich als ein Engpass.

+0

ja, sie sollten nur höchstens 60 Mal pro Sekunde aufgerufen werden –

+0

Es wird Mikrosekunden Unterschied sein, wenn es nur 60 mal/Sekunde ist. Ich bezweifle, dass Sie viel Unterschied zwischen Delegierten und Funktionen bemerken würden, wenn es 6000 mal/s wäre. –

+0

@Chris Ja, wenn es 60 Mal pro Sekunde ist, dann wird der Leistungseinfluss völlig vernachlässigbar sein. Wenn die Delegierten arbeiten und den Code einfach und wartbar halten, dann gehen Sie darauf zu. – mikera

1

Unabhängig davon, ob es kann eine Leistung getroffen wird, ist die bessere Frage, ob es ist eine Performance-Einbußen. Sie sollten die Leistung der Anwendung mit und ohne die Delegierten messen, um festzustellen, ob ein Performance-Treffer akzeptabel ist.

+0

Ich werde es tun und Sie wissen lassen –

1

Es gibt offensichtlich einen Perf-Hit mit einem Delegat vs. einem direkten Methodenaufruf, aber mit modernen (lesen: nach Version 1.1) Versionen der CLR ist es etwa so schnell wie ein Methodenaufruf über eine Schnittstelle.

Hier ist eine Tabelle von groben perf Maßnahmen: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

Wie immer sollten Sie messen, um zu sehen, ob die Leistung für Sie akzeptabel ist. Da ich Delegierte in performancekritischem Code (Animation) und nicht erfahrenen Problemen eingesetzt habe, würde ich erwarten, dass es für Sie in Ordnung ist.

+0

Ya, dass die Tabelle hilft, danke! –

1

Ihre Schätzungen (und unsere Vermutungen) sind nicht korrekt und entsprechen nicht unbedingt der tatsächlichen Leistung Ihres Spiels. Die einzige Möglichkeit, den tatsächlichen Leistungseinbruch zu erkennen, wäre mindestens eine Art von Profiling. Why measure when you can guess?

Neben einer tatsächlichen Messung Ihrer Leistung, überlegen Sie: Ist es wichtig? Wenn dein Spiel mit 60 fps läuft (ich genieße sogar 30 fps bei schnellen Spielen, und ich kann mit 20 fps so langsam umgehen, wenn es langsamer ist, wie ein rundenbasiertes Spiel) und du bist in der Lage, 300 fps in variabler Zeit zu treffen -Step-Modus, und die Delegierten kostet Sie eine ganze 20 Frames (sie werden wahrscheinlich nicht, nebenbei bemerkt) ... Ihr Spiel kann noch 60fps im festen Zeitschritt-Modus beibehalten.

1

Ich werde die Antworten aller anderen hier wiederholen, in dem Delegaten kein Problem sind, es sei denn, sie sind ein Problem - Profiler sind dein Freund.

Eine Sache, aufpassen für die könnte ein Problem sein, wenn Sie die Delegierten in jedem Frame neu erstellt werden - in diesem Fall könnten Sie überschüssigen Müll werden zu erzeugen, die Ihre Leistung reduzieren. Verwenden Sie jedoch Tools wie den CLR-Profiler, um zuerst festzustellen, ob dies für Sie ein Problem darstellt.