Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
Optymalizacja
Autor Wiadomość
krzys_h 


Twoja ulubiona misja: Wszystkie :)
Pomógł: 3 razy
Wiek: 20
Dołączył: 12 Gru 2010
Posty: 255
Skąd: Łódź
Wysłany: 30-04-2011, 12:00   Optymalizacja

Chciałem zrobić program zarządzający zasobami bazy, jednak mam problem z funkcjami liczącymi obiekty (wykonują się bardzo długo). Obecnie program tylko sprawdza czy jest dość dużo zasobów. Jedno sprawdzwniw zajmuje mu około 9 sekund! Proszę, pomóżcie mi zoptymalizować funkcje Policz i PoliczOkolice.

Kod:
extern void object::ISZB()
{
    //---------------------
    //Ustawienia:
    int bazasize = 50; //Rozmiar bazy
    int valsurowce = 5; //Ilosc surowcow, ktora powinna byc w bazie
    int warnsurowce = 2; //Ostrzegaj, gdy tylko tyle surowcow
    //---------------------
   
    bool warnTitanium = false;
    bool warnCell = false;
   
   
    message("Inteligentny System Zarządzania Bazą v1.0", DisplayMessage);
   
    point baza = GdzieJestBaza();
    message("Baza na "+baza.x+";"+baza.y, DisplayInfo);
   
    while(true) {
        if(PoliczOkolice(Titanium, baza, bazasize) <= warnsurowce) {
            if(!warnTitanium) message("Konczy sie tytan!", DisplayWarning);
            warnTitanium=true;
        } else warnTitanium=false;
        if((PoliczOkolice(PowerCell, baza, bazasize)+PoliczOkolice(NuclearCell, baza, bazasize)) <= warnsurowce) {
            if(!warnCell) message("Koncza sie ogniwa!", DisplayWarning);
            warnCell=true;
        } else warnCell=false;
    }
   
}

point object::GdzieJestBaza()
{
    object item;
    item=radar(SpaceShip);
    if(item!=null) return item.position;
    item=radar(BlueFlag);
    if(item!=null) return item.position;
    return this.position;
}

int object::Policz(int cat)
{
    int count = 0;
    for(int i=1;i<300;i++) {
        object item = retobject(i);
        if(item==null) continue;
        if(item.category==cat) count++;
    }
    return count;
}

int object::PoliczOkolice(int cat, point pos, int dist)
{
    int count = 0;
    for(int i=1;i<300;i++) {
        object item = retobject(i);
        if(item==null) continue;
        if(item.category==cat && distance(pos, item.position) < dist) count++;
    }
    return count;
}


Oczywiście za pomoc będą punkty Pomógł.
_________________
Gość, cieszysz się, że skontaktowaliśmy się z EPSITEC?
 
 
     
Simbax 
Mod


Twoja ulubiona misja: Wszystkie na Krystalii
Pomógł: 6 razy
Wiek: 22
Dołączył: 07 Sie 2009
Posty: 473
Skąd: z Leszna
Wysłany: 30-04-2011, 12:42   

U mnie liczy 2 sekundy. Może dodaj ipf, bo jeśli dobrze rozumiem pozwala zmieniać ilość instrukcji na klatkę ;P
_________________
http://projektsimbax.blogspot.com/ <- Taki sobie blog
 
     
Berserker 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 30-04-2011, 20:25   

retobject() jest malo wydajne. Pamietaj, ze najpierw musi przeleciec przez kazdy grzyb i drzewko, wszystkie rudy etc.

Ja zawsze uzywam funkcji radar(). Jako dystans minimalny ustawiasz odleglosc poprzedniego czegos od ciebie + 0.1, jako max dajesz granice.
_________________
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012