Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

07.11.2012, 21:17

[C#] Wann schaltet sich der Garbage Collector ein?

Ich wollte mal fragen wie lange es dauert bis sich der Garbage Collector einschaltet. Ich habe nämlich eine Timer-Klasse die sich beim Ablaufen selbst zerstören sollte. Ein neuer Timer könnte schon mehrmals die Sekunde erzeugt (nicht jede Sekunde) werden.

Deswegen, lohnt es sich das Objekt stehen zu lassen und es auf den GC warten zu lassen, oder sollte man bei so intensiver Verwendung nicht doch den GC manuell zum Löschen bringen (wäre dann auch mehrmals die Sekunde, aber nicht jede Sekunde)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
interface ITimerListener
    {
        public virtual void OnTimer(string name);
    }

    class TimerType : EntityType
    {
        
    }

    class Timer : Entity
    {
        TimerType _type = null; public new TimerType Type { get { return _type; } }

        public Timer(float duration, string name)
        {
            time = duration;
            this.name = name;

            Entities.Instance.Create(this.Type, Map.Instance);
        }

    

        private float time;
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        protected override void OnPostCreate(bool loaded)
        {
            base.OnPostCreate(loaded);
            AddTimer();
        }

        protected override void OnTick()
        {
            base.OnTick();

            time -= TickDelta;

            if (time <= 0.0f)
            {
                foreach (ITimerListener listener in clients)
                {
                    listener.OnTimer(name);
                    this.SetShouldDelete();
                }
            }
        }

        public static void RegisterListener(ITimerListener listener)
        {
            clients.Add(listener);
        }

        public static void RemoveListener(ITimerListener listener)
        {
            clients.Remove(listener);
        }

        public static void CreateTimer(float time, string name)
        {
            new Timer(time, name);
        }

        static List<ITimerListener> clients = new List<ITimerListener>();
        
        
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.11.2012, 21:21

Statt so eine Frage zu stellen solltest Du lieber den Code so ändern, dass die Frage gar nicht mehr notwendig ist. Wirklich.

Generell kann ich Dir aber sagen: Lass ihn einfach machen, er weiß es besser als Du.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

07.11.2012, 21:41

Und um deine Frage zu beantworten: Er setzt dann ein, wann er es für richtig hält. Und wie BlueCobold gesagt hat: Ja er weiß es besser als du ;)

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

07.11.2012, 21:43

Also kann ich es so lassen und schauen wie die Laufzeit es verträgt?

Danke für die Hilfe :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

07.11.2012, 22:03

Ja. Und falls sie es nicht verträgt, dann stell den Code auf ein sinnvolles Verhalten um. Immer einen neuen Timer zu erzeugen statt ein und denselben einfach zu resetten, das ist ein sehr unschönes Verhalten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

08.11.2012, 06:59

Trotzdem ist es ja schon interessant, wann der Garbage Collector seine Arbeit tut. Soweit wie ich das im Kopf habe, erfolgt Garbage Collection in einem separatem Thead mit niedriger Priorität. Nur, wenn alle anderen Threads gerade nichts zu tun haben, erhält der GC Zeit. Eine andere Bedingung kann Speicherknappheit sein. So ist es zumindest bei der Microsoft implementierung. Bei Mono denke ich wirds ähnlich laufen.

Wie BlueCobolt aber schon sagt: Das muss dich nicht interessieren. Und vor allen Dingen sollte dich das auch nicht interessieren. Wenn du nicht gerade im Embedded-Bereich bist oder sehr umfangreiche Client-Server Software mit C# schreibst oder gigantischen Datenmengen umgehst, wird das vermutlich nie ein Thema werden. :)

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

08.11.2012, 13:33

Andere Frage: Ist die Timerklasse wirklich so speicherfressend, dass du große Probleme bekommst?
Oder gibt es logische Probleme, wenn ein Timer stehen bleibt? In dem Fall implementiere und nutze bitte IDisposable.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

8

08.11.2012, 15:59

IDisposable brauch ich nicht, da die Entity sich nach dem Ablauf automatisch abmeldet. ein delete kann sie nicht ersetzen.

Außerdem löse ich das ganze mit einem float-Array in der benötigenden Klasse.
Ich glaub ein Array und ein Listenabruf pro Tick sind sparsamer :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

08.11.2012, 16:06

Wieso genau muss mehrmals pro Sekunde ein neuer Timer erzeugt werden?

10

08.11.2012, 19:03

Er hatt einen Inteligenten Mechanismus, aber spätestens wenn der Speicher voll ist wird er ausgeführt.
Eine derart häufige ausführung des GC wäre sehr fatal für die Performance, wobei ich eh nicht sicher bin ob du ihn so oft überhaupt zu ausführen bringen kannst, stellt der GC fest eine Bereinigung bringt zu wenig Speichergewinn kann er die Ausführung auch abbrechen, damit er nicht zu stark die Performance beeinträchtigt, bin mir aber nicht sicher ob das auch für manuelle Aufrufe gilt. Ich weis nur das auch bei einem manuellen Aufruf keine Garantie existiert das ein spezifisches Objekt tatsächlich aus dem Speicher entfernt wird, kann aber auch mit dem Generationensystem zusammenhängen.
Ein Programm macht was du schreibst, nicht was du willst!

Werbeanzeige