Еще одна попытка написать рогалик на Python/Libtcod

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Ответить
Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 05 ноя 2014, 11:55

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

http://pix.tftpd.net/downloads/alchemyst.zip

Используется Python 2.7, libtcod (должен был в архиве)
Правоверных любителей PEP8 предупреждаю сразу: внутри черви, ад и погибель.

Тем кто решил, э.. поиграть:
- выиграть нельзя,
- инвентаря/предметов (пока?) нет,
- управление с numpad или vi-keys, o - "автопилот", ctrl+q - выход
- ваша консоль будет зафлужена дебагом

Что интересует:
1) А запускается ли вообще? ;)
2) Какая скорость работы (знаю что низкая, но насколько?), использование процессора и памяти. Ну и конфиг, на котором запускалось, если можно

Зачем это было?
1) Чтобы понять, можно ли в принципе написать что-то вменяемое на питоне
2) Попробовать перо в написании AI для мобов

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Cfyz » 05 ноя 2014, 13:20

Код: Выделить всё

<...>
File "env/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd", line 155, in init DijkstraMap (DijkstraMap.c:8857)
ValueError: numpy.dtype has the wrong size, try recompiling
Как я понял, DijkstraMap.so гвоздями приколочена к конкретной версии numpy (а другой в этой Ubuntu 12.04 нету). Я в python не силен, поэтому от безысходности поковырял саму либу. Она экспортирует только один метод "initDijkstraMap", нужно ли ее было вообще делать бинарником?
Пытается раскуклиться

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 05 ноя 2014, 13:32

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

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 05 ноя 2014, 14:54

Поправил (вроде) бинарник, обновил архив. Ссылка прежняя:
http://pix.tftpd.net/downloads/alchemyst.zip

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Uvadzucumi » 06 ноя 2014, 11:09

thefish писал(а):1) А запускается ли вообще?
запускается
thefish писал(а):2) Какая скорость работы (знаю что низкая, но насколько?), использование процессора и памяти. Ну и конфиг, на котором запускалось, если можно
медленно :), но играть можно. Причина, видимо, в куче действий "невидимых" НПЦ на каждом шаге передвижения, после получения нажатия клавиши.
Процессор: 18% в режиме простоя. 60-70+% при перемещении
Памяти пользует 302 мегабайта.

система:
Скрытый текст: ПОКАЗАТЬ
-Computer-
Processor : 4x Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz
Memory : 7737MB (1714MB used)
Operating System : Linux Mint 17 Qiana
Date/Time : Thu 06 Nov 2014 03:06:09 PM GST
-Display-
Resolution : 1366x768 pixels
OpenGL Renderer : GeForce GT 740M/PCIe/SSE2
X11 Vendor : The X.Org Foundation
-Multimedia-
Audio Adapter : HDA-Intel - HDA Intel PCH
Audio Adapter : ThinkPad EC - ThinkPad Console Audio Control
-Input Devices-
Power Button
Lid Switch
Power Button
AT Translated Set 2 keyboard
SynPS/2 Synaptics TouchPad
Video Bus
Video Bus
ThinkPad Extra Buttons
HDA Intel PCH HDMI/DP,pcm : 7=
HDA Intel PCH HDMI/DP,pcm : 3=
HDA Intel PCH Headphone
HDA Intel PCH Mic
Integrated Camera
TPPS/2 IBM TrackPoint
Logitech USB Optical Mouse
-Printers (CUPS)-
HP-LaserJet-P2015 : <i>Default</i>
-SCSI Disks-
ATA Crucial_CT240M50
ATA WDC WD10JPVX-08J
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Cfyz » 06 ноя 2014, 12:27

К сожалению, что на рабочей Ubuntu 12.04, что на домашне-виртуальной 14.10, одинаково ругается на numpy.
А еще libSDL.so лишняя, так как мало что 32-битная, так еще и не будет загрузчик смотреть либы в локальной директории все равно.
Про то, нужно ли делать библиотеку бинарником -- меня смутило, что в ней только одна функция инициализации, выглядит как будто она ничего полезного не делает.

P. S. Дьявол предлагает расчесать манту.
Пытается раскуклиться

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Uvadzucumi » 06 ноя 2014, 13:33

Cfyz писал(а):К сожалению, что на рабочей Ubuntu 12.04, что на домашне-виртуальной 14.10, одинаково ругается на numpy.
хм...

Код: Выделить всё

objdump -x ./DijkstraMap.so | grep NEEDED
  NEEDED               libpthread.so.0
  NEEDED               libc.so.6

Код: Выделить всё

objdump -x ./libtcod.so | grep NEEDED
  NEEDED               libz.so.1
  NEEDED               libSDL-1.2.so.0
  NEEDED               libGL.so.1
  NEEDED               libc.so.6
не вижу numpy... хотя у меня стоит python-numpy 1:1.8.2-0ubuntu0.1
думаю, тут скорее всего в версии питона проблема:

Код: Выделить всё

python --version
Python 2.7.6
дело в том, что в 3-м питоне, совсем другой синтаксис - не такой как во втором. Может питон 3-й стоит?

зы (оффтоп): в убунте 14-й пофиксили, наконец, переключение раскладок клавиатуры (или у тебя KDE?)
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Cfyz » 06 ноя 2014, 14:04

Uvadzucumi писал(а):не вижу numpy... хотя у меня стоит python-numpy 1:1.8.2-0ubuntu0.1
Тут проблема не в прямой зависимости. Приведу вывод еще раз, чтобы вверх не листать:

Код: Выделить всё

File "env/local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd", line 155, in init DijkstraMap (DijkstraMap.c:8857)
ValueError: numpy.dtype has the wrong size, try recompiling
Т. е. то ли numpy лезет в native библиотеку, то ли библиотека пытается через рантайм подцепиться к numpy, но увы. Беглый поиск дает следующее:
StackOverflow писал(а):If a package is compiled against a specific numpy version, say 1.7, then there is no guarantee that the binaries of that package will work with older numpy versions, say 1.6, and very often or most of the time they will not.
И вот в Ubuntu 12.04 версия python-numpy 1.6.1 (а у вас -- 1.8.2). Странно только что в 14.04 версия уже 1.8.1, а вот ошибку выдает точно такую же. Python и там, и там использовал 2.7, так это было отмечено топикстартером.

У Python, насколько я видел, весьма неплохой PInvoke. Если вся задача это что-то посчитать на native массиве, то не окажется, что проще без numpy?
Uvadzucumi писал(а):в убунте 14-й пофиксили, наконец, переключение раскладок клавиатуры (или у тебя KDE?)
Я как-то умудрился это переждать: в предыдущем LTS еще работало, в последнем релизе уже работает =)
Пытается раскуклиться

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 06 ноя 2014, 15:27

Ясно, огромное спасибо вам за затраченные усилия!
Если вся задача это что-то посчитать на native массиве, то не окажется, что проще без numpy
Возможно и проще. Numpy вообще-то и есть самые близкие к нативным массивы. Структура данных там правда вовсе не массив в классическом понимании, но вроде ничего быстрее чем numpy.array для Питона нет. Хотя, получив ваш фидбек и потратив вечер на поиск способа нормальной упаковки приложения, я что-то сильно разочаровался в Питоне. Варианты - либо делать pathfinding статической либой на С и писать биндинги, либо заменять целиком язык программирования на более, гм, "близкий к железу". Пока склоняюсь ко второму варианту.
P. S. Дьявол предлагает расчесать манту.
Симпатично. Жаль что не знал про эту библиотеку, когда начинал писать.
Причина, видимо, в куче действий "невидимых" НПЦ на каждом шаге передвижения
Да, все НПЦ честно обрабатываются, более того, некоторые (у которых большая скорость) ходят по нескольку раз между передачей управления игроку. У каждого свой инстанс Дийкстра-карты. Чуть позже были б и свои предпочтения (кого бить, что подбирать итп). Игрок, собственно от НПЦ отличается только тем что у него вместо AI - обработка нажатых кнопок :)

Вобщем, как я убедился - стоит сделать лишь один шаг в сторону от туториала и Питон моментально превращается в склад грабель. Он очень классный для описания логики/предметов/создания классов, но как дело доходит до перекладывания байтов - он стремительно сдувается. Отдельную радость доставляет, гм, "изобретательно" работающий weakref - поиск оставшихся живых ссылок на объект превращается в увлекательное приключение. А если лишнее старательно не убивать - то широко разрекламированный pickle (кстати я использовал dill, он лучше) начинает сохранять по копии игры на каждый уровень подземелья :)
Да, и не получается даже собрать нормальный пакет для других версий той же ОС, если есть модули, использующие Cython + numpy. Я уж не говорю про другие ОС. А без Cython и статической типизации перебор даже относительно небольшого массива 120Х80 начинает занимать нестерпимо долгие десятые доли секунды реального времени.

PS Кстати, я когда-то в меру своих поверхностных знаний переписал эти алгоритмы на C, они работали примерно в 100 раз быстрее и жрали в несколько раз меньше памяти. Жаль, что я не умею писать на C :(

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Tookser » 27 дек 2014, 14:43

thefish писал(а): Вобщем, как я убедился - стоит сделать лишь один шаг в сторону от туториала и Питон моментально превращается в склад грабель.
Это ещё обиднее тем, что он используется и как язык для научных вычислений, а там иногда бывают очень долгие. Интересно, Perl будет быстрее?

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 05 мар 2015, 17:06

Tookser писал(а): Это ещё обиднее тем, что он используется и как язык для научных вычислений, а там иногда бывают очень долгие. Интересно, Perl будет быстрее?
Сейчас знакомые физики используют R, хвалят неимоверно.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Tookser » 05 мар 2015, 19:16

thefish писал(а):
Tookser писал(а): Это ещё обиднее тем, что он используется и как язык для научных вычислений, а там иногда бывают очень долгие. Интересно, Perl будет быстрее?
Сейчас знакомые физики используют R, хвалят неимоверно.
Ясно. Видел только какие-то туториалы по этому языку.
А кстати, о NumPy: есть ли в нём возможность создать статический массив (массив с неизменным размером))? Вернее, интересует, насколько большими будут накладные расходы на то, что массив является динамическим, и как их уменьшить. И чем структура массива NumPy отличается от обычного динамического массива? Поверхностный поиск мало что дал.

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение thefish » 10 мар 2015, 10:56

Tookser писал(а): А кстати, о NumPy: есть ли в нём возможность создать статический массив (массив с неизменным размером))? Вернее, интересует, насколько большими будут накладные расходы на то, что массив является динамическим, и как их уменьшить. И чем структура массива NumPy отличается от обычного динамического массива? Поверхностный поиск мало что дал.
Насколько я помню, все numpy-массивы статические. Ресайз массива - это отдельный метод, довольно дорогой по памяти и времени. Структура numpy массивов - вопрос интересный, если вкратце (и если я чудовищно не ошибаюсь), то в отличие от питоновских массивов numpy хранит не ссылки на NxM (произвольных) питоновских объектов, а NxM unboxed значений c типом данных из фиксированного списка - bool, int, uint, float, complex разной битности. Плюс кучу индексов и немножко метаинформации, которые сильно облегчают поиск/сортировку/траснпонирование массива. Вообще мануал по numpy толковый, рекомендую.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Еще одна попытка написать рогалик на Python/Libtcod

Сообщение Tookser » 11 мар 2015, 12:35

thefish писал(а):
Tookser писал(а): А кстати, о NumPy: есть ли в нём возможность создать статический массив (массив с неизменным размером))? Вернее, интересует, насколько большими будут накладные расходы на то, что массив является динамическим, и как их уменьшить. И чем структура массива NumPy отличается от обычного динамического массива? Поверхностный поиск мало что дал.
Насколько я помню, все numpy-массивы статические. Ресайз массива - это отдельный метод, довольно дорогой по памяти и времени. Структура numpy массивов - вопрос интересный, если вкратце (и если я чудовищно не ошибаюсь), то в отличие от питоновских массивов numpy хранит не ссылки на NxM (произвольных) питоновских объектов, а NxM unboxed значений c типом данных из фиксированного списка - bool, int, uint, float, complex разной битности. Плюс кучу индексов и немножко метаинформации, которые сильно облегчают поиск/сортировку/траснпонирование массива. Вообще мануал по numpy толковый, рекомендую.
Спасибо! Почитаю.
UPD: проверил тут http://wiki.scipy.org/Tentative_NumPy_Tutorial — вроде всё примерно так.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 44 гостя