Frage

ich einfach machen 2D-Spiele vor kurzem damit begonnen, und kam in einem Dilemma - zu verwenden oder nicht zu verwenden Getter und Setter-Methoden für die x- und y-Positionen eines Objekts. Es würde aussehen klarer, wenn ich diese Methoden nicht verwenden würde, zuzugreifen, aber die Variablen direkt statt, und auch, würden viele Methodenaufrufe auf dem Objekt verletzt Leistung. Auch bekommen und die Position ziemlich viel bleibt einfach einstellen, so gibt es wirklich keine Notwendigkeit für die Verkapselung hier? Oder sollen wir immer an die Konvention von Getter und Setter-Methoden zu allen Zeiten?

War es hilfreich?

Lösung

Es ist immer besser, die Konvention zu halten. Darüber hinaus wird die JIT-Operationen, um den Zugriff zu vereinfachen direkt auf das Spielfeld statt durch alle Methoden Stapel gehen.

Es heißt Methode inlining.


Die Java 2-Version der Java VM inlines automatisch einfache Methoden zur Laufzeit. In einem nicht optimierten Java VM wird jedes Mal, wenn eine neue Methode namens, wird ein neuer Stapelrahmen erstellt. Die Schaffung eines neuen Stapelrahmen zusätzliche Mittel erfordert sowie eine erneute Abbildung des Stapels, das Endergebnis ist, dass die neuen Stapelrahmen der Schaffung ein kleines Overhead entstehen.

Methode inlining erhöht Leistung durch die Anzahl der Verfahren reduziert ruft das Programm macht. Die Java VM inlining Code inlines Methoden, die zurück Konstanten oder nur Zugang interne Felder .


Ressourcen:

Auf dem gleichen Thema:

Andere Tipps

Sie sollten nicht Getter und Setter haben noch sollten Sie die Attribute öffentlich machen.

Stattdessen haben Sie Methoden wie .updatePosition (), .draw (), .moveTo (), .collideWith (), etc, so dass Sie nicht immer Sollwerte benötigt, zu erhalten oder direkt von außen.

Es gibt einige seltene Fälle, in denen Sie wirklich lernen wollen / Sollwerte direkt von außen, aber diese Fälle sind selten und häufiger als nicht deuten auf eine schlechte Design (obwohl es sind gültige Verwendungen) .

I would use getters/setters. Why ?

  1. Encapsulation is key. Perhaps you'll change how you store locations later on (e.g. Cartesian to polar?). Getters/setters will allow you to perform appropriate conversions.
  2. Setters will allow your object to enforce conditions (e.g. is x > 0 and < 10 ?)

A further reason (though perhaps not appropriate for your needs currently) is that numerous Java frameworks make use of reflection and introspect classes for setters/getters in the conventional setX/getX format. By implementing such methods, your classes are immediately available for reuse in a wide variety of frameworks.

Don't worry about performance until it's a known concern. Premature optimisation will cause you too many headaches.

In Stendhal we do use getters/setters. We have about 60,000 movable object that are processed each turn. From my experience in Stendhal simple methods do not have any measurable performance impact at all. We did quiet a bit of profiling to find various issues, and hugely improved performance in the last couple of month.

The main bottle neck we have is path finding (especially collision detection with other movable objects). There had been issue like creating a new Pair object on every possible collision check, or creating a new Rectangle object whenever a Entity was asked for its position and size.

Those things are very easily spotted in a Profiler (See Profiling server side game loop in java on gamedev).

Other common causes for lag outside the logic part of game loop is client/server communication and database access.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top