Подтвердить что ты не робот

Роль скриптовых языков в игре Программирование

Итак, я столкнулся с дебатами о том, какая правильная роль скриптового языка в разработке игр. Насколько я могу судить, в этом есть две мысли:

1) Язык сценариев является мощным и полнофункциональным. Большие части игрового кода написаны на языке, а код перемещается только на С++, когда производительность требует, чтобы это было необходимо. Обычно это что-то вроде Lua или Unrealscript.

2) Этот язык сценариев чрезвычайно ограничен. Почти весь игровой код находится на С++, и язык доступен только для того, чтобы раскрывать базовую функциональность дизайнерам.

Мое разочарование возникает из-за того, что часто наблюдается злоупотребление вторым номером, с большими системами, реализованными на языке, который не имеет функций, которые делают этот код пригодным для обслуживания.

Итак, я начал поддерживать подход номер один, но после разговора с некоторыми дизайнерами я понял, что многие из них, похоже, предпочитают номер два, и его главным образом программисты, которые предпочитают один.

Итак, мне все еще остается интересно, какой подход лучше. Я просто вижу плохой код и обвиняю инструмент вместо программиста, или нам нужен действительно нужен более сложный инструмент?

4b9b3361

Ответ 1

Я думаю, что дизайнеры должны видеть подходящий для них язык. Это не подлежит обсуждению: им приходится тратить свое время на разработку, а не на программирование.

Если скриптинг позволяет быстро развивать достойный продукт игровой код, то программисты тоже должны это делать. Но это должно быть достойным продукта: делать все дважды не экономит время. Поэтому вы должны держать скрипты на своем месте. Если разработчик может script система инвентаризации за неделю или записать ее на С++ в месяц, то вам нужен полнофункциональный сценарий, если только дать вам больше времени на ручную оптимизацию частей, которые могли бы, вероятно, повлиять на пределы производительности, Таким образом, не инвентарь, таблица с высокими баллами или система сопоставления клавиш, или логика высокого уровня, как то, что должны делать персонажи. Все это может быть написано сценарием, если это позволит вам в любое время потратить на ускорение графики и физики: программисты должны уметь точно определить, что такое узкие места, а старшие программисты могут сделать разумное предсказание, t.

Дизайнеры, вероятно, не должны знать или заботиться о том, используют ли программисты язык сценариев для реализации игрового кода. У них не должно быть мнения, является ли (1) хорошим или плохим. Поэтому, даже если программисты правы, хотят (1), почему это неудобно для дизайнеров? Как они даже заметили, что язык сценариев полнофункциональный, если все, что им когда-либо понадобится, - это довольно небольшое количество стандартных рецептов? Что-то пошло не так, но я не думаю, что Lua слишком хороший язык.

Одна из возможностей заключается в том, что использование одного и того же языка сценариев для обоих становится препятствием для рисования четкой линии между интерфейсами, используемыми дизайнерами, и интерфейсами, внутренними к игровому коду. Это, как я сказал наверху, не подлежит обсуждению. Даже если они используют один и тот же язык сценариев, программисты должны предоставить разработчикам функциональность, необходимую им для выполнения своей работы. Просто потому, что дизайнеры используют Lua для кодирования стратегий AI и деревьев бесед, а Lua - полнофункциональный язык, способный писать физический движок, не означает, что ваши дизайнеры должны написать свой собственный физический движок. Или используйте более 10% возможностей Lua.

Вы, вероятно, можете делать как (1), так и (2), ум. Нет причин, по которым вы не можете дать программистам Lua, а дизайнерам - миниатюрный недоказуемый DSL, который "скомпилирован" в Lua с Lua script.

Ответ 2

Цикл compile-link-run-test для скомпилированного кода на С++, когда вы имеете дело с чем-то сложным, как видеоигра, очень и очень медленный. Использование механизма сценариев позволяет сделать большие функциональные изменения в игре без необходимости компиляции программы. Это огромная экономия времени. Как вы говорите, вещи, которые нуждаются в оптимизации, могут быть перемещены в С++ по мере необходимости.

Двигатели ААА высоко управляются сценариями. Крутящий момент, используемый для Tribes II (и многих других игр!), Написан по сценарию, Unreal имеет Unrealscript и так далее. Скрипты предназначены не только для модов, но и для эффективного развития.

Ответ 3

Я думаю, что баланс, который вы хотите, является чем-то таким: вам нужна игровая логика в script, но функциональность игры в коде.

Одним большим преимуществом script является то, что вы можете легко настроить ожидания. Например:

enemy = GetObjectFromScene ( "enemy01" );  через 5 секунд {enemy.ThrowGrenadeAt(игрок); }

Просто надуманный пример. Такая логика будет раздражать настройку на С++. script может облегчить выражение такой логики, но вы хотите, чтобы фактическая функциональность (функции, которые она вызывает) была на С++.

И script не должен быть медленным. В играх с тяжелым сценарием работает со скоростью 60 кадров в секунду на консолях, но для этого требуется хороший дизайн и поиск правильного баланса между вашими вариантами 1 и 2 выше.

Ответ 4

Я не могу видеть аргумент о том, что большое количество скриптового кода будет превосходить большие количества С++. Можно было бы аргументировать счетчик. Я видел ужасные крупные проекты, написанные на языках сценариев, которые начинались с менталитета сценариев - все быстро и грязно. К сожалению, это не очень хорошо. Невозможно создать аргумент качества кода, основанный исключительно на языке программирования. Люди могут писать gobs поддерживаемого кода на любом языке, скомпилированном или сценаристом.

В любом случае, на самом деле невозможно понять линию между вашим "подходом 1" и "подходом 2", не зная, где узкие места производительности и какие пользователи предпочитают "script".

Я бы предложил "подход 3", который должен сделать все это или частично на С++ и выставить чистый SDK на С++. Это будет иметь преимущество заставлять вас писать свой код, как если бы это был пользовательский интерфейс, который кто-то вне вашей организации должен использовать. Он надеется, что он будет более удобен в обслуживании и будет иметь дополнительный побочный эффект для реализации вашего скриптового интерфейса для вас. Теперь все ваши скриптовые интерфейсы должны быть отправлены на ваш SDK. Viola!

При таком подходе вы избегаете рисовать линию между сферой "скриптового" и тем, что находится на С++. Вы и ваши пользователи сохраняете возможность добавлять функциональность на С++ с помощью SDK или использовать язык сценариев.

Ответ 5

Как обычно, я думаю, что ответ "зависит".

Там NO WAY Halo 3 или Call of Duty 4 могли быть основаны главным образом на сценариях. Лучшие названия AAA должны, определенно, нажимать конверт любой платформы, на которую они касаются. Это просто невозможно сделать с помощью скриптов.

Повседневные игры - это совсем другая история. Основная игра, в которую входят Unity, встроено множество сценариев.

Существует также рынок мод. Твердый игровой движок с хорошей средой сценариев может стать платформой для настроек, дериваций, а в некоторых случаях и новых игр. Counter Strike - мой личный любимый пример. Я думаю, что вы ограничены в этом случае играми типа FPS run-and-gun.

Итак, есть место для сценариев в играх, но оно, вероятно, останется в малой/казуальной игре и пространстве для моддеров.

Ответ 6

Одним из лучших примеров сценариев в действии является Civilization IV. Он использует Boost Python. В результате это ужасно медленно. Ясная контрапункт к утверждению, что "код перемещается на С++, когда производительность требует, чтобы он был необходим".

Правильный способ состоит в том, чтобы спроектировать архитектуру вверх и решить, какие проблемы сложны с вычислительной точки зрения и которые сложны, чтобы указать фронт. Графика, физика, поиск путей, мгновенная обратная связь на входе, текст в речь - все это явно сложно вычислительно. "Дружественная или враждебная позиция", "защищать или атаковать", "тратить или спасать" типы AI-решений сложны, чтобы указать фронт.

Вывод состоит в том, что вы хотите выставить на свой скриптовый код способных, но бездушных участников. Код сценария описывает, что должны делать актеры, но код С++ заботится о том, как.

Что касается цикла компиляции, важно иметь правильную модульную архитектуру. Когда вы работаете над логикой поиска пути, вам никогда не придется составлять графический код. Кроме того, такие инструменты, как Incredibuild, могут ускорить время компиляции. У крупных игровых фирм, вероятно, уже есть ферма рендеринга, которая может хорошо сочетаться с компиляционной фермой.

Ответ 7

Говорить, что игры должны выполняться только с С++ (или утверждать, что заголовки AAA сделаны так) просто невежественны. Большинство игр в настоящее время написаны так или иначе, будь то проприетарный язык сценариев (UnrealScript), общий язык (Lua, python, С#, Java и т.д.) Или управляемый данными (xml, собственный двоичный формат и т.д.). Просто сделайте некоторые исследования, и вы обнаружите, что большинство двигателей используют скрипты в той или иной форме.

Я думаю, что вопрос о том, должен ли иметь 1) мощный и полнофункциональный язык сценариев против 2) крайне ограниченный язык сценариев, подходит к проблеме с неправильного конца. Сценарий (язык или данные) должен быть сконструирован таким образом, чтобы он наилучшим образом поддерживал процесс создания игры. Здесь важна экспрессивность системы: дизайнеры и сценаристы должны иметь возможность легко решать проблемы, которые у них есть, без слишком больших головных болей, в то время как они не должны подвергаться слишком сложной системе, что у них возникают трудности с пониманием и обучением. Часто программисты (включая меня) склонны проектировать системы, делая предположения о том, как они будут использоваться, и пытаясь обеспечить, чтобы все функции между землей и небесами могли быть реализованы, что привело к сложным системам. Будучи перегруженным этой сложностью, дизайнеры в конечном итоге используют минимум, чтобы выполнить работу.

Например, в нашей игре (Rochard) мы разработали полностью расширяемую и управляемую сценарием систему AI с использованием данных, но дизайнеры уровня закончили используя только шаблоны искусственного запаса, потому что у них не было времени или усилий, чтобы использовать систему ИИ в полной мере. Поэтому, в конце концов, я просто создал хороший пользовательский интерфейс для простого выбора этих шаблонов AI.

Я бы сказал, что в этом вопросе нет серебряной пули.

Ответ 8

Итак, я начал поддерживать подход номер один, но после разговора с некоторыми дизайнеров я понял, что многие из них кажется, предпочитают номер два, и его в основном программисты, которые предпочитают один.

Это должно иметь очевидный смысл: если язык сценариев является "мощным и полнофункциональным", для дизайнеров должно возникнуть необходимость создавать системы, поскольку эта возможность доступна для них. С другой стороны, если язык сценариев раскрывает только мелкие детали жестко закодированной игры, тогда программистам приходится создавать эти системы, поскольку дизайнеры не могут этого сделать. Я не говорю, что каждая сторона ленива, но очевидно, что у обоих есть индивидуальные навыки, которые проект требует от них сосредоточиться (поскольку никто другой не может их эффективно использовать), что означает, что всегда есть интерес к тому, чтобы кто-то другой выполнял задание, если возможно.

И, естественно, исходя из этого, правильная роль будет зависеть от того, как выкладываются человеческие ресурсы в вашей компании, в сочетании с любыми требованиями к производительности вашей игры. Если у вас есть представление о том, сколько людей потребует каких-либо скриптов, вы узнаете, сколько из них потребует этого, и, следовательно, может решить, насколько широким или узким должен быть интерфейс. Это вносит вклад в то, что будет "доменом" языка, о чем упоминалось выше на сайте oneiveone.livejournal.com.

(За что мало стоит, я профессиональный разработчик игр, а также модератор форума Scripting Languages ​​на Gamedev.net.)

Ответ 9

Сообщество разработчиков игр уже использует сценарии как очень распространенный способ создания пользовательских интерфейсов и настройки ответов AI. Вы можете найти много информации на сайтах, таких как Gamasutra. Интересно, что стандартные языки начинают заменять пользовательские интерпретаторы.

Два из лучших примеров сценариев в играх AAA, которые приходят на ум, - World of Warcraft (использует Lua) и EvE Online (использует Python). EvE также использует скрипты на стороне сервера: у них есть значительные инвестиции в Stackless Python.

Обновление: производительность по существу не будет проблемой из-за многоядерных процессоров. Даже машины нижнего уровня будут иметь больше ядер, чем требуется для отображения и обновления модели. Вы могли бы также потратить один из этих ядер на выполнение сценариев для пользовательского интерфейса.

Ответ 10

Как уже было сказано; использовать скрипты для игровой логики и С++ для игровых функций. Примером может быть сценарий игрового режима, но с использованием С++ для рендеринга.

Ответ 11

Если мы разделим игру на две части: двигатель и фактическая игра (дизайн).

Сильный игровой движок высшего класса, скорее всего, написан на C/С++, а некоторые даже оптимизируют его с помощью ассемблерного кода. Вы можете сделать много аккуратных действительно быстрых вещей для графики и физики с конкретными инструкциями процессора. Невозможно получить производительность при рендеринге больших ландшафтов или нескольких сложных объектов только с языка сценариев.

Когда дело доходит до самой игры, где много аспектов, которые можно сделать на более медленных, но более высоких языках программирования. AI и другая игровая логика могут быть записаны в script с успехом. Он может ускорить разработку, и он открывает для моддинга и расширения сообщества простым способом.

Ответ 12

Я думаю, что плакат здесь правильный, чтобы поддержать метод # 1. Это более чистый метод и даст лучшие долгосрочные результаты, несмотря на жалобы дизайнеров. В итоге код будет определять хорошее игровое программирование от посредственного (плохого).