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

Problemy [programowanie] - Optymalizacja

krzys_h - 30-04-2011, 12:00
Temat postu: 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ł.

Simbax - 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
Berserker - 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.


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group