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