Можно ли написать трехмерную игру размером с World of Warcraft на чистом Python? - PullRequest
11 голосов
/ 27 мая 2009

Можно ли написать трехмерную игру размером с World of Warcraft на чистом Python? Предполагая использование привязок DirectX / D3D или OpenGL.

Если нет, что будет самым большим препятствием для реализации такого проекта в Python? Я знаю, что игры обычно попадают в сферу C и C ++, но иногда люди делают что-то по привычке!

Любая информация поможет удовлетворить мое любопытство.

Edit:

Будет ли GIL сообщать о проблемах производительности 3d-клиентов? И каково общее снижение производительности при использовании, скажем, привязок OpenGL или DirectX по сравнению с исходным использованием библиотек?

Ответы [ 13 ]

15 голосов
/ 27 мая 2009

Да. Как это будет работать - другой вопрос.

Хорошим шаблоном разработки было бы разработать его на чистом Python, а затем профилировать его и переписать критичные для производительности узкие места, либо на C / C ++ / Cython, либо даже на самом Python, но с более эффективным кодом.

14 голосов
/ 27 мая 2009

Хотя я не знаю всех технических деталей World of Warcraft, я бы сказал, что MMO такого размера может быть встроен в Stackless Python .

EVE Online использует его, и у них есть один сервер на 200 000 пользователей.

8 голосов
/ 27 мая 2009

Технически все возможно на любом языке программирования Turing Complete.

Практически, вы столкнетесь с проблемами при создании сетевого стека из языка высокого уровня, потому что сервер должен быть ОЧЕНЬ быстрым, чтобы справиться с таким большим количеством игроков.

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

Проблемы будут в том, что вычислительно интенсивно на сервере. Все, что происходит в человеческое время, например, вход в систему, вероятно, будет вполне приемлемым, но если что-то должно быть мгновенным для более чем десяти тысяч пользователей, вы можете обратиться к внешней библиотеке, созданной на языке C.

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

7 голосов
/ 27 мая 2009

Игра Minions of Mirth представляет собой полноценную MMO более или менее в масштабе WoW, и была сделана в основном на Python . На стороне клиента использовался игровой движок Torque, написанный на C ++, но весь код и поведение сервера были на языке Python.

6 голосов
/ 17 июня 2009

В дополнение к Eve Online есть несколько примеров из реальной индустрии. Серверная часть сервера в проекте Ultima Online 2 в Origin в конце 90-х была в основном Python поверх серверной инфраструктуры C ++, а последняя игра Tablua Rasa от NCSoft (с большинством из той же команды разработчиков) имела ту же архитектуру.

Фреймворк Twisted Matrix был создан изначально именно для этих целей - на самом деле от разработчика проекта UO2 в то время, и была компания под названием Ninjaneering, которая пыталась коммерциализировать эту базу кода через MMO проекты.

Произошел переход к lua ​​в качестве механизма сценариев (например, EQ2), так как его проще встраивать и копировать.

Проблемы с python в этой среде, как правило, связаны с интерфейсом между языками. Когда вы выполняете неизбежную оптимизацию перевода какой-либо высокопроизводительной системы с Python на C / C ++, тогда возникает проблема перемещения данных назад и вперед через границы языка и вызова функций через границы языка. Стоимость сериализации может быть высокой, если она выполняется плохо. Например, использование ранних версий SWIG будет сериализовать указатели в их строковое представление, а затем проанализировать строку обратно в указатель на другой стороне !!

Проверьте эту бумагу середины 90-х годов:

Но в долгосрочной перспективе я думаю, что это возможно.

6 голосов
/ 27 мая 2009

Поскольку на ваш главный вопрос уже дан хороший ответ, я отвечу на ваши последние вопросы:

Будет ли GIL сообщать о проблеме производительности 3d-клиента?

В Python 2.6 была представлена ​​библиотека многопроцессорная , так что вы можете использовать преимущества нескольких процессорных ядер, не беспокоясь о GIL. Stackless Python также имеет довольно интересные вещи.

Какое общее снижение производительности при использовании, скажем, привязок OpenGL или DirectX по сравнению с использованием библиотек в исходном формате?

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

6 голосов
/ 27 мая 2009

Да, вы можете написать это на ассемблере, или Java, или Python, или brainfuck. Просто сколько времени вы готовы вложить в это. Производительность языка больше не является главной проблемой, речь идет о том, какие алгоритмы вы используете, а не о том, какой язык вы используете.

5 голосов
/ 01 сентября 2009

Ответ на мой конкретный вопрос: «... на чистом Python ...» - НЕТ.

Python недостаточно быстр, чтобы достаточно эффективно вызывать OpenGL или DirectX для воссоздания World Of Warcraft с исключительной частотой кадров.

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

4 голосов
/ 01 ноября 2009

Я пробовал свои силы в написании 3D-игр на Python, и, учитывая хорошую инфраструктуру рендеринга (мой любимый OGRE) и приличные привязки, это удивительно, что вы можете сойти с рук. Однако, особенно в играх, вы всегда пытаетесь выжать как можно больше из аппаратного обеспечения. Недостаток производительности Python в конечном итоге даст о себе знать.

Основная проблема, с которой я столкнулся при использовании python, - это огромные накладные расходы на вызовы. Вызов функций Python, даже из других функций Python, очень дорогой. В некотором смысле, это цена, которую вы платите за динамическую природу Python. Когда вы используете оператор вызова функции «()» для символа, он должен определить, является ли это функцией или классом, просмотреть порядок разрешения методов, обработать аргументы ключевого слова и т. Д. И т. Д. Все это делается заранее. время на менее динамичных (скомпилированных) языках.

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

2 голосов
/ 01 ноября 2009

Как технолог я знаю:

Если это может быть написано на C \ C ++, оно может быть написано на ассемблере (хотя это займет больше времени). Если он может быть написан на C \ C ++ и не является кодом низкого уровня - он может быть написан в любой управляемой среде. WoW - программа высокого уровня, написанная на C \ C ++ Python - это управляемая среда

Там для: WoW может быть написан на python и любой другой MMORPG в 3D ...


Самым сложным будет трехмерный движок, поскольку он является «самой тяжелой» частью кода - вам нужно будет использовать внешний движок (написанный на C \ C ++ \ Assebly) или написать его и оптимизировать (не рекомендуется)

...