Skocz do zawartości
  • 0

Pomoc przy pluginie


margo

Pytanie

Witam

Napisałem plugin wymianę pomiędzy graczami na  ale nie wiem jak najbardziej go zoptymalizować żeby był jak najwydajniejszy dla bardzo dużej ilości graczy na serwerze bo nie jestem tak bardzo zaawansowany w pisaniu pluginów. Proszę o pomoc i powiedzcie gdzie mam wstawić kod.

Odnośnik do komentarza
https://skript.pl/temat/53866-pomoc-przy-pluginie/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

@kerpsonpodaje po kolei części kodu:

Kod main: https://pastebin.com/DAEKjG7G

Kod Trade: https://pastebin.com/j0R42VgG

Kod TradeUtil: https://pastebin.com/cFLFqa1g

i powiedzcie mi jak zoptymalizować kod żeby był jak najwydajniejszy dla bardzo dużego serwera czyli ilości graczy a po za tym czy ten kod jest najlepiej napisany jak się da a jak jest słabo napisany proszę was o pomoc w poprawieniu kodu tak żeby właśnie był taki oraz napisanie tutaj w komentarzu poprawionego kodu pluginu.

 

Edytowane przez margo
Odnośnik do komentarza
https://skript.pl/temat/53866-pomoc-przy-pluginie/#findComment-327507
Udostępnij na innych stronach

  • 0
18 godzin temu, margo napisał:

@kerpsonpodaje po kolei części kodu:

Kod main: https://pastebin.com/DAEKjG7G

Kod Trade: https://pastebin.com/j0R42VgG

Kod TradeUtil: https://pastebin.com/cFLFqa1g

i powiedzcie mi jak zoptymalizować kod żeby był jak najwydajniejszy dla bardzo dużego serwera czyli ilości graczy a po za tym czy ten kod jest najlepiej napisany jak się da a jak jest słabo napisany proszę was o pomoc w poprawieniu kodu tak żeby właśnie był taki oraz napisanie tutaj w komentarzu poprawionego kodu pluginu.

 

Zacznę od klasy TradeUtil:

public void removeTrade(final Trade trade) {
        final ArrayList<Trade> trades = new ArrayList<Trade>();
        for (final Trade t : this.tradeList) {
            if (!t.getRequester().getName().equalsIgnoreCase(trade.getRequester().getName()) || !t.getAccepter().getName().equalsIgnoreCase(trade.getAccepter().getName())) {
                trades.add(t);
            }
        }
        this.tradeList = trades;
    }

Uważam to za bezsensowne, od javy 8 i wyżej możesz użyć dla listy funckji removeIf ewentualnie usuwać za pomocą Iteratora

 

public Trade getTradeFromRequester(final Player requester) {
        Trade trade = null;
        for (final Trade t : this.tradeList) {
            if (t.getRequester().getName().equalsIgnoreCase(requester.getName())) {
                trade = t;
            }
        }
        return trade;
    }

ta zmienna Trade jest bezcelowa, mimo, że znajdujesz danego trade to i tak sprawdza ci całą listę od początku do końca, po co?

//Przykład
for (Trade trade : tradeList) {
	if (//tutaj warunek jaki chcesz mieć aby zwrócic trade) {
		return trade;
	}
}

return null;

 

Lecimy do klasy Trade:

Main plugin;
Player tradeRequester;
Player tradeAccepter;
Inventory requesterInventory;
Inventory accepterInventory;

Pamiętaj, żeby po zakończeniu wymiany te objekty ustawić jako null, bo takie bezcelowe przetrzymywanie ich jest niepoprawne.

 

	public void startTimeOutCounter() {
		new BukkitRunnable() {
			int seconds = 0;
 
			public void run() {
				if (!Trade.this.isCancelled()) {
					if (this.seconds < 15) {
						if (!Trade.this.tradeRequester.isOnline() || !Trade.this.tradeAccepter.isOnline()
								|| !Trade.this.tradeRequester.getWorld().getName()
										.equalsIgnoreCase(Trade.this.tradeAccepter.getWorld().getName())
								|| (Trade.this.tradeRequester.getLocation().distance(Trade.this.tradeAccepter
										.getLocation()) > Trade.this.plugin.getConfig().getDouble("Distance")
										&& Trade.this.plugin.getConfig().getDouble("Distance") >= 0.0)) {
							Trade.this.cancelTrade(true);
							this.cancel();
						}
						if (Trade.this.isTradeAccepted()) {
							this.cancel();
						}
					} else {
						Trade.this.cancelTrade(true);
						this.cancel();
					}
					++this.seconds;
				} else {
					this.cancel();
				}
			}
		}.runTaskTimer((Plugin) this.plugin, 20L, 20L);

Nwm czy to ma w ogóle jakiś sens, po wyjściu graczy podczas wymiany można po prostu ją anulować chyba, że bardzo zależy ci na tym dystansie

 

Ciągle pobierasz żywcem z configu zmienne, czy nie lepiej zrobić klasę typu TradeConfiguration i tak trzymać wszystkie już wczytane zmienne a potem ich tylko używać?

 

Klasa Main:

this.getServer().getPluginManager().registerEvents((Listener)this, (Plugin)this);

Ten cast jest niepotrzebny

 

                            Trade trade = this.tradeUtil.getTradeFromAccepter(p);
                            trade.setTradeAccepted(true);
                            this.tradeUtil.addTrade(trade);
                            trade = null;

Nie musisz ustawiać trade na null, GC go zbierze jeżeli będzie uznany za niepotrzebny.

 

Nie oceniałem już samego kodu, tylko wstępną wydajność, wydaje mi się, że to co napisałem wystarczy ale niech jeszcze inne osoby się wypowiedzą.

Ale generalnie tak na marginesie kod straszny, musisz nad tym popracować bo on w ogóle jest słabo czytelny

Edytowane przez kerpson
Odnośnik do komentarza
https://skript.pl/temat/53866-pomoc-przy-pluginie/#findComment-327514
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Odpowiedz na pytanie...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...