Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
|
Forum - Polski Portal COLOBOTa |
|
|
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. |
_________________
|
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|