(01-15-2017, 02:24 PM)tomaszkax86 Wrote: Poza tym, obecna implementacja CBota wymaga przepisania. Raczej nie chciałbyś używać tego, co jest w Colobocie.I to w zasadzie podsumowuje całą tą dyskusję
Niemniej, wbrew pozorom sam interpreter CBota nie jest już zintegrowany aż tak mocno z silnikiem samej gry, nawet część biblioteki standardowej która nie operuje bezpośrednio na obiektach w grze jest przeniesiona do katalogu interpretera właśnie po to żeby można jej było bez problemu użyć w zewnętrznych projektach.
Szybkość wykonywania programów w grze tak jak już kilka osób wspomniało jest ograniczona sztucznie nałożonym limitem instrukcji wykonywanych w jednej klatce animacji, który jest konieczny po to aby programy w CBocie nie mogły obniżać nam FPSów. W przyszłości można pomyśleć o wyciągnięciu programów w CBocie na oddzielny wątek, co pozwoliłoby programom wykonywać ewentualne bardziej skomplikowane obliczenia niezwiązane bezpośrednio ze światem gry równocześnie z renderowaniem.
Jeśli ktoś chciałby zobaczyć jak zachowuje się CBot bez tego ograniczenia, to przy włączonej kompilacji testów oprócz głównej gry dostajemy także program CBot_console który jest po prostu konsolowym interpreterem CBota, uruchamiającym program wczytany z stdin. Dostępne są praktycznie wszystkie instrukcje które nie są powiązane z grą (mamy np. operacje matematyczne i operacje na stringach, ale brakuje radar, move itd.). Źródła można znaleźć tutaj: https://github.com/colobot/colobot/blob/...onsole.cpp Jest to też wzorcowy przykład jak zaimplementować CBota do innego programu.
Jeśli chodzi o samą wygodę użycia CBota w innych zastosowaniach, to jedyną rzeczą która jest moim zdaniem dość uciążliwa na dłuższą metę jest konieczność pisania oddzielnej funkcji kompilacji do każdej instrukcji wbudowanej w język, dużo wygodniej byłoby zastąpić zwykłą deklaracją przyjmowanych argumentów i zwracanego typu. Przykład dodawania własnych funkcji do języka można znaleźć w źródłach CBot_console i w src/script/scriptfunc.cpp w źródłach głównej gry.
EDIT: Jeśli kogoś interesują konkretne wartości:
Program testowy:
Code:
extern void PrimeTest()
{
for(int i = 0; i < 250; i++) {
bool prime = true;
for(int j = 2; j < i; j++) {
if (i%j == 0) {
prime = false;
break;
}
}
if(prime) {
message("Prime: "+i);
}
}
}
- w grze, bez zmiany ipf (przy stabilnych 60 FPS, mierzone funkcją abstime()) - 15.14 s
- w grze, ipf=10000 (maksymalna dozwolona wartość jeśli mnie pamięć nie myli) - 0.16 s
- w konsoli, ipf=∞ (mierzone przez time) - 0.05 s
- ten sam program napisany w C++ - 0.003 s (ale powiedziałbym że faktycznie jest to <0.001s i to jest tylko niedokładność odliczania czasu, bo zwiększenie 250 do 1000 ani zmniejszenie do 50 nie daje zauważalnego efektu)