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

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

11

08.11.2012, 20:09

jop, es gibt zwar system.gc(); aber auch das ruft ihn nur zum Schein auf und nicht wirklich.
Eine nette Zusammenfassung mit ein paar Links zum Thema gibt es hier: http://frickelblog.wordpress.com/2010/08…-meist-unnotig/

12

08.11.2012, 20:14

@Wirago: Es geht hier um C# und nicht um Java.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

13

08.11.2012, 21:53

@dot: Blinklichter mit gewissen Einstellungen (Frequenz, Aktivzeit beim Blinken...)
Ich hab das jetzt eh mit einem zur Objektliste indexsynchronem Array gelöst.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

14

08.11.2012, 22:17

@Wirago: Es geht hier um C# und nicht um Java.


Crap... verpeilt xD
Sorry

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

15

08.11.2012, 23:55

@dot: Blinklichter mit gewissen Einstellungen (Frequenz, Aktivzeit beim Blinken...)

da nicht nur ihn der Hintergrund interessiert:
ich kann daraus nicht herauslesen, wofür das mehrmalige _Erzeugen_ und Zerstören/Löschen eines Timers erforderlich wäre
zumal ich auch nicht unbedingt nachvollziehen kann, wofür unbedingt Timer benötigt werden - sollte es sich um ein Spiel und nicht um eine normale Anwendung handeln (der Bildschirminhalt wird bei einem spiel ohnehin mehrmals die Sekunde aktualisiert, wo nebenbei auch die Werte der Blinklichter neu berechnet werden können)

aber wie schon geschrieben:
es ist so gut wie _immer_ eine dumme Idee, den GC manuell aufrufen zu wollen, um die Performance zu verbessern
(und ggf. liegt der Wunsch nach einem Aufruf an einer weniger guten Implementierung)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

16

09.11.2012, 14:15

Also: Ich hab bei der Tick-Callback funktion keinen Delta-Wert, den kriegen nur Entitys zur Verfügung, da die Engine das fps automatisch auf 30 hält.
Allerdings fand ich zu der Zeit keine andere Möglichkeit, jedoch habe ich jetzt ein float-Array, dessen Zugehörigkeitspaare(float - Light) über den Index geregelt werden:

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
 private void TickBlueLights()
        {
            if (blueLightsActivated)
            {
                foreach (MapObjectAttachedObject obj in AttachedObjects)
                {
                    if (obj is MapObjectAttachedLight)
                    {
                        MapObjectAttachedLight bLight = obj as MapObjectAttachedLight;
                        if (lightDict.ContainsKey(bLight))
                        {
                            BlueLightInfo info;
                            if (!lightDict.TryGetValue(bLight, out info))
                            {
                                Log.Info("!WARNING! BLUELIGHTINFO OF LIGHT: {0} NOT FOUND !", bLight.Alias);
                                continue;
                            }

                            if (firstBLTick)
                            {
                                timers[blueLights.IndexOf(bLight)] = info.offsetFromBegin;
                                info.timerType = TimerType.StartOffset;
                                info.set = true;
                                lightDict[bLight] = info;
                            }

                            if (timers[blueLights.IndexOf(bLight)] <= 0.0f && info.set)
                            {
                                switch (lightDict[bLight].timerType)
                                {
                                    case TimerType.StartOffset:
                                        bLight.Visible = true;
                                        timers[blueLights.IndexOf(bLight)] = lightDict[bLight].blinkDuration;
                                        info.timerType = TimerType.BlinkDuration;
                                        lightDict[bLight] = info;
                                        break;
                                    case TimerType.BlinkDuration:
                                        bLight.Visible = false;
                                        timers[blueLights.IndexOf(bLight)] = lightDict[bLight].frequency;
                                        info.timerType = TimerType.Freq;
                                        lightDict[bLight] = info;
                                        break;
                                    case TimerType.Freq:
                                        bLight.Visible = true;
                                        timers[blueLights.IndexOf(bLight)] = lightDict[bLight].blinkDuration;
                                        info.timerType = TimerType.BlinkDuration;
                                        lightDict[bLight] = info;
                                        break;
                                }
                            }


                        }

                    }
                }

                firstBLTick = false;
            }

            for (int i = 0; i < timers.GetLength(0); i++)
            {
                timers[i] -= TickDelta;
            }
        }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

09.11.2012, 14:29

Die Methode würde ich komplett wegwerfen und ohne einzelne Timer neu schreiben.
Ein "ContainsKey" würde ich übrigens an der Stelle ebenfalls nicht verwenden, indexOf() schon gleich gar nicht. Das Konzept mit den vielen Timern ist sehr unschön, die Implementierung sehr umständlich und unperformant.

Auch den Namen "MapObjectAttachedLight" solltest Du eventuell noch einmal überdenken. Er beschreibt ein Verhalten, bzw. eine Relation zu seinem Aggregations/Kompositions-Eigentümer, keinen Typ.

Und zu guter Letzt: Die Methode ist zu lang und zu tief verschachtelt. ;) Ein return hier, ein continue da und vor allem eine Aufteilung auf mehr Methoden wäre sicherlich hilfreich.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (09.11.2012, 14:34)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

18

09.11.2012, 16:44

Also MapObjectAttachedLight ist von der Engine, find ich auch blöd, vorallem dass ich es nicht in ein Light casten kann.
Das mit den Timern funktioniert jetzt sehr schön, die fps sinkt wenn alle Lichter auf einmal an sind auf 90, aber sonst bleibt sie sehr gut.

Werbeanzeige