W moim obecnym projekcie skrypty Lua są wywoływane przez funkcje C ++ po stronie serwera. Następnie skrypty ponownie wywołują funkcje C ++ nadal w tym rozwiązaniu. Dlaczego powinniśmy robić takie rzeczy, a nie wywoływać bezpośrednio funkcji C ++? W jakich sytuacjach potrzebne są skrypty?
Skrypty są zwykle kompilowane w czasie wykonywania , podczas gdy język hosta będzie kompilowany w czasie kompilacji. Oznacza to, że nie musimy rekompilować, jeśli skrypt się zmieni. Ponowna kompilacja pełnej gry może zająć od kilku minut do godzin, co oznacza duży spadek wydajności.
Zwykle kod krytyczny lub kod zaplecza nie będą skryptowane. Ten kod powinien działać szybko i często zarządzanie pamięcią ma kluczowe znaczenie.
W grach logika i konfiguracja gry są zwykle zawarte w plikach skryptów. Te skrypty mogą być łatwo aktualizowane przez nie-programistów (takich jak projektant), aby ulepszyć rozgrywkę. Języki skryptowe są łatwe i działają w tym celu wybaczająco.
Często język skryptowy jest również używany do wykonywania skryptów w czasie rzeczywistym . Jest to przydatne do poprawiania niektórych elementów gry, a nawet do debugowania. Wiele gier zapewnia konsolę do tego (głównie wewnętrznego) celu.
Bardzo możliwe jest, że stworzysz grę przy użyciu istniejącego silnika gry, po prostu za pomocą skryptów. Warstwa silnika gry jest zatem całkowicie oddzielona od warstwy logiki gry . Nowoczesne silniki można zazwyczaj wykorzystać do łatwego tworzenia gier FPS lub RTS, ale nie jest to możliwe w żadnym gatunku. MMO prawdopodobnie wymagałby innego rodzaju silnika.
Więc sedno jest oddzielenie. Wymienione powyżej korzyści często przewyższają dodatkową pracę związaną z tworzeniem lub integracją języka skryptowego.
+1 za stwierdzenie, że skrypty są zwykle łatwiejsze do zaktualizowania przez osoby niebędące programistami. Projektanci nie zawsze są programistami i nie muszą tak być.
Oak
19
Wydaje mi się, że powtarzam się w każdym pytaniu dotyczącym skryptów - jeśli Twój przepływ pracy wymaga nieprogramiści do programowania (w tym skryptów), ugryzie cię później w tyłek. Projektanci nie zawsze są programistami, ale gdy tylko piszą nietrywialne skrypty (np. Gdy tylko spróbują zdefiniować funkcję lub użyć pętli), udają, że nią są. Jeśli nie mają szkolenia w programowaniu, skończy się to łzami i stratą czasu dla wszystkich.
5
Joe - to nie unieważnia argumentu, to po prostu oznacza, że musisz zdecydować, gdzie oddzielić „rzeczy programistyczne” od „rzeczy projektowych”, a linia podziału będzie inna w zależności od wiedzy technicznej twoich projektantów (lub brak tego).
Ian Schreiber
3
Jestem prawie pewien, że każdy szanujący się projektant jest dobrze nauczony w co najmniej jednym języku. Aby trochę wyjaśnić, chciałbym doprecyzować termin „nieprogramiści”, ponieważ ktoś, kto nie wykonuje zawodu inżyniera oprogramowania. Żałuję używania tego terminu, dzięki Joe widzę, że jest niejednoznaczny. Wierzę, że istnieje szeroka gama programistów, od tych, którzy piszą prosty XML, asembler, a także matematyczne przetwarzanie sygnałów. Mam nadzieję, że to rozwiązuje problem dualności „nieprogramistycznej”.
Nef
8
Nie słyszałem, żeby ktokolwiek sugerował, że projektanci powinni pisać złożone, krytyczne dla misji scenariusze do produkcji. Jednak projektanci ze skromnym zrozumieniem programowania mogą nadal eksperymentalnie poprawiać niektóre skrypty (a następnie przekazywać je prawdziwym programistom). Z pewnością mogliby pisać proste skrypty ad hoc z konsoli w czasie wykonywania, aby ułatwić sobie testowanie. Wyobrażam sobie, że projektanci mogą chcieć wykorzystać podstawowe skrypty do prototypowania nowych projektów ekranów (nawet jeśli są to tylko półfunkcyjne, interaktywne makiety). Dużo kodu nieprodukcyjnego wymaga napisania.
Mike Strobel,
38
Zadałeś złe pytanie. Myślę, że prawdziwe pytanie brzmi: dlaczego znosimy języki „nieskrypty”, takie jak C, C ++, Java i tak dalej? Odpowiedź jest jedna z przyczyn: wydajność. (I może bezwładność, ale ta bezwładność występuje ze względu na wydajność, a każdy, kto potrafi pisać dobrze w C / C ++ / Java, może napisać przynajmniej znośny Ruby / Python / Lua / JavaScript.)
Używamy języków „skryptowych” (co tak naprawdę oznacza bardzo wysoki poziom, wyrzucanie elementów bezużytecznych i zwykle jakąś formę luźniejszego pisania i dynamicznej kompilacji), ponieważ są one ogólnie łatwiejszymi językami dla każdego - łącznie z programistami - do pisania kodu. Jest mniej głupie rzeczy, takie jak pamiętanie o uwolnieniu po malloc lub upewnienie się, że Twój kod jest bezpieczny w wyjątkach, lub pamiętanie o tym, aby wszystkie Twoje destruktory były wirtualne. Gdyby nasze komputery były nieskończenie szybkie, do wszystkiego używalibyśmy języków „skryptowych”.
Podoba mi się ten argument o wiele bardziej niż „aby projektanci mogli programować”. To bardzo zły pomysł, aby odrzucić wartość szybkiego rozwoju i móc eksperymentować ze zmianami bez ponownej kompilacji.
ojrac
10
Języki skryptowe dla logiki gry są bardzo dobrym przykładem wzorca architektury oprogramowania Alternate Hard and Soft Layers . Na tej stronie (i innych jestem pewien) jest dobra dyskusja na temat korzyści płynących z tego.
Zmiany w skrypcie są łatwe do wdrożenia. Na przykład, możesz przechowywać skrypty w bazie danych, co oznacza, że zamiast pełnego binarnego ponownego wdrożenia i ewentualnego ponownego uruchomienia usługi, po prostu wydajesz pojedynczą instrukcję SQL UPDATE, po której ewentualnie może zostać wysłany sygnał do uruchomionej usługi, aby ponownie załadował skrypt.
Również języki skryptowe są często łatwe do zrozumienia i łatwe do zaprogramowania, więc nie potrzebujesz „hardkorowych” programistów (tych zajmujących się zarządzaniem pamięcią / wskaźnikami i optymalizacjami na poziomie procesora) dla większości kodu (jeśli duże RPG, skrypty dla AI, czarów, efektów przedmiotów i samego świata są często większe niż kod silnika). Języki skryptów pozwalają znacznie bardziej skupić się na „co” niż na „jak” ze względu na Garbage Collection (w przypadku Lua) i wyższy poziom abstrakcji.
Jednym ze scenariuszy, w których skrypty są przydatne, jest to, że chcemy, aby nasz silnik był rozszerzalny przez wtyczki / dodatki. Rozszerzenia te są tworzone w wielu przypadkach przez osoby nieprofesjonalne (takie jak zaawansowani gracze i entuzjaści). Skrypty są w tym celu bezpieczniejsze i łatwiejsze. Używając skryptów, nie muszą używać kompilatorów i nie muszą być świadomi wskaźników ...
Doskonałym tego przykładem jest gra World of Warcraft. Ma tysiące dodatków stworzonych przez społeczność. Te dodatki są napisane przy użyciu LUA + XML.
Zadałeś złe pytanie. Myślę, że prawdziwe pytanie brzmi: dlaczego znosimy języki „nieskrypty”, takie jak C, C ++, Java i tak dalej? Odpowiedź jest jedna z przyczyn: wydajność. (I może bezwładność, ale ta bezwładność występuje ze względu na wydajność, a każdy, kto potrafi pisać dobrze w C / C ++ / Java, może napisać przynajmniej znośny Ruby / Python / Lua / JavaScript.)
Używamy języków „skryptowych” (co tak naprawdę oznacza bardzo wysoki poziom, wyrzucanie elementów bezużytecznych i zwykle jakąś formę luźniejszego pisania i dynamicznej kompilacji), ponieważ są one ogólnie łatwiejszymi językami dla każdego - łącznie z programistami - do pisania kodu. Jest mniej głupie rzeczy, takie jak pamiętanie o uwolnieniu po malloc lub upewnienie się, że Twój kod jest bezpieczny w wyjątkach, lub pamiętanie o tym, aby wszystkie Twoje destruktory były wirtualne. Gdyby nasze komputery były nieskończenie szybkie, do wszystkiego używalibyśmy języków „skryptowych”.
źródło
Języki skryptowe dla logiki gry są bardzo dobrym przykładem wzorca architektury oprogramowania Alternate Hard and Soft Layers . Na tej stronie (i innych jestem pewien) jest dobra dyskusja na temat korzyści płynących z tego.
źródło
źródło
Zmiany w skrypcie są łatwe do wdrożenia. Na przykład, możesz przechowywać skrypty w bazie danych, co oznacza, że zamiast pełnego binarnego ponownego wdrożenia i ewentualnego ponownego uruchomienia usługi, po prostu wydajesz pojedynczą instrukcję SQL UPDATE, po której ewentualnie może zostać wysłany sygnał do uruchomionej usługi, aby ponownie załadował skrypt.
Również języki skryptowe są często łatwe do zrozumienia i łatwe do zaprogramowania, więc nie potrzebujesz „hardkorowych” programistów (tych zajmujących się zarządzaniem pamięcią / wskaźnikami i optymalizacjami na poziomie procesora) dla większości kodu (jeśli duże RPG, skrypty dla AI, czarów, efektów przedmiotów i samego świata są często większe niż kod silnika). Języki skryptów pozwalają znacznie bardziej skupić się na „co” niż na „jak” ze względu na Garbage Collection (w przypadku Lua) i wyższy poziom abstrakcji.
źródło
Jednym ze scenariuszy, w których skrypty są przydatne, jest to, że chcemy, aby nasz silnik był rozszerzalny przez wtyczki / dodatki. Rozszerzenia te są tworzone w wielu przypadkach przez osoby nieprofesjonalne (takie jak zaawansowani gracze i entuzjaści). Skrypty są w tym celu bezpieczniejsze i łatwiejsze. Używając skryptów, nie muszą używać kompilatorów i nie muszą być świadomi wskaźników ...
Doskonałym tego przykładem jest gra World of Warcraft. Ma tysiące dodatków stworzonych przez społeczność. Te dodatki są napisane przy użyciu LUA + XML.
źródło