
Group Butler [beta]
03.11.2017
06:29:01
Добро пожаловать в чат pro.lua, Nick! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Nick
03.11.2017
06:30:13
подскажите, если у меня nginx+lua и очень хочется lua 5.3, то проще переписать все например на тарантул и нгинх оставить только фронтендом, или есть еще варианты?

Snusmumriken
03.11.2017
06:30:36
Так просто не выйдет и скорость потеряешь.
Ну, или биндить lua5.3 к nginx, мда.

Nick
03.11.2017
06:31:03
оно там не очень совместимо

Google

Snusmumriken
03.11.2017
06:34:04
Тарантул с openresty - отлично совместимы, там один и тот же luajit (5.1).

Nick
03.11.2017
06:39:23
а как соотносятся luajit и lua по версиям?
5.3 я хочу из-за поддержки юникода

Snusmumriken
03.11.2017
06:39:58
Ммм. Ставишь либу на luajit с юникодом, ту же самую что и в 5.3.

Saphire
03.11.2017
06:42:00
Чего там у тебя на С++ такого на 20к строк?

Snusmumriken
03.11.2017
06:45:59

Vadim
03.11.2017
07:02:43
;)
если юникодные переменные, то они есть и в luajit
если string.utf8, то да, есть либа. Подключаешь её к JIT и не знаешь проблем.

Saphire
03.11.2017
07:04:16
https://github.com/dibyendumajumdar/ravi o..o

Vadim
03.11.2017
07:04:37
ravi - не то

Snusmumriken
03.11.2017
07:07:35
Вот эта - идентична 5.3
https://github.com/starwing/luautf8

Google

Elias
03.11.2017
07:51:06
Чего там у тебя на С++ такого на 20к строк?
По большей части низкоуровневые вещи, либо те, которые легко обобщаются вне зависимости от игры. Рендеринг, ввод, коллизия, ECS, GUI, тайл мэпы и пр.
Я использую SFML, который по идее уже должен сократить количество строк кода для многих вещей, но все равно как-то накопилось.
А вся игровая логика на Lua. Пока что контента маловато, так что 5к строк пока что. :)

Saphire
03.11.2017
07:51:40
ECS \o/
...а насколько большой мир поддерживается? Какие тыйлы и взаимодействия между ними?

Columbus
03.11.2017
07:52:38
По большей части низкоуровневые вещи, либо те, которые легко обобщаются вне зависимости от игры. Рендеринг, ввод, коллизия, ECS, GUI, тайл мэпы и пр.
Я использую SFML, который по идее уже должен сократить количество строк кода для многих вещей, но все равно как-то накопилось.
А вся игровая логика на Lua. Пока что контента маловато, так что 5к строк пока что. :)
а ты юзаешь наследование\виртуальные методы?

Saphire
03.11.2017
07:55:23

Elias
03.11.2017
07:56:03
Я не тестировал пока что очень большие карты, но по идее поддерживаются. Карты состоят из чанков тайлов 8x8, хранятся в разреженной матрице, поэтому место не тратится впустую и в итоге можно эффективно хранить не только прямоугольные карты.
С тайлами пока мало взаимодействий, коллизия, а также можно коллбеки писать в зависимости от типа тайла (например сделать тайл, который будет тайлом пропасти, в результате столкновения с которым игровые объекты будут "падать")

Columbus
03.11.2017
07:56:16

Saphire
03.11.2017
07:57:21

Elias
03.11.2017
07:57:36

Saphire
03.11.2017
07:57:50

Columbus
03.11.2017
07:57:50
оу...

Saphire
03.11.2017
07:58:11

Columbus
03.11.2017
07:58:24
Чем же?
тем что каждый компонент должен соответствовать родителю
а у меня там сооовсем все разное

Saphire
03.11.2017
07:58:50
...эм
ECS это когда у тебя куча мелких компонентов, которые практически не связаны друг с другом
И ты можешь легко навесить требуемые на любой объект игровой

Columbus
03.11.2017
07:59:52
например, класс C_Mesh, в котором находятся несколько методов по управлению буфферами, несколько буфферов и еще материал с текстурой, а в классе C_ParticleEmitter куча совсем других вещей
и наследовать все от компонентов как-то не хочется
ибо тогда в родителе придется объявлять все это

Google

Elias
03.11.2017
08:00:26

Columbus
03.11.2017
08:01:08
а, например, в классе для работы с частицами нахер не нужны буфферы нормалей и tangent\bitangent, а так же методы их обработки

Saphire
03.11.2017
08:01:22

Columbus
03.11.2017
08:01:32
и в C_Mesh нахер не нужны поля и методы для обработки частиц

Saphire
03.11.2017
08:02:12
...ты вообще про что-то другое говоришь, ибо это не ECS

Columbus
03.11.2017
08:02:37
ну да, я не реализовывала ECS за ненадобностью

Elias
03.11.2017
08:02:59
Почему json, а не луа?
Долго использовал Lua, но потом захотелось явно отделить данные от логики. JSON для данных как-то больше нравится. Особенно тем, что не требует состояния Lua, легко парсится и сериализуется. Это нужно для визуального редактора Entity

Columbus
03.11.2017
08:03:25
я видела исходники движков с использованием ECS, но имхо, сложно понять что к чему относится
и что где используется

Saphire
03.11.2017
08:04:41
Фигово написали видимо..

Elias
03.11.2017
08:04:51

Columbus
03.11.2017
08:04:54
ECS хорошо использовать в 2D движках, вроде как, ибо все их используют именно там. Для 3D я не видел такого
CryEngine не использует это, Banshee Engine, Serious Engine, XRay Engine

Elias
03.11.2017
08:06:15
В 3d только так используют. Тот же UE4 - ECS
И вообще философия пошла от 3d игр, которым понадобилась тонна производительности.

Columbus
03.11.2017
08:06:51
да, (а)уе4 этим страдает

Elias
03.11.2017
08:07:57
Deus Ex, Neverwinter Nights, Thief, Tony Hawk's Pro Skater...
Сейчас тот же Overwatch написан на ECS. Первое, что в голову пришло. :)

Columbus
03.11.2017
08:08:27
а у тебя есть их исходнки?
и да, thief на UE написан

Elias
03.11.2017
08:09:43
Неа. Знаю об этих вещах по блог постам и презентациям на конференциях
К сожалению пока что на коммерческие игры с открытым кодом на ECS не натыкался. Давно ничего крупного не раскрывали

Snusmumriken
03.11.2017
08:10:31
А чем ESC отличается от всего остального?
Условно, куча объектов с координатами и размерами, отнаследованные от класса сущности, и все в куче крутятся?

Google

Columbus
03.11.2017
08:12:03
хз, я пишу, конечно, лютый говнокод, но люблю, когда этот говнокод понятен

Elias
03.11.2017
08:12:20
Они ещё создаются из блоков, компонентов
Какое-нибудь дерево имеет collision, graphics, transform
А враг имеет ещё ai, health и пр.

Columbus
03.11.2017
08:12:24
имхо, ECS сложнее для чтения, чем система ВЛОБ

Saphire
03.11.2017
08:13:05

Columbus
03.11.2017
08:13:54
пишешь в лоб

Snusmumriken
03.11.2017
08:14:04
А, типа сущности с повешенными на них классификаторами, а ля "drawable/collidable/updatable".

Columbus
03.11.2017
08:14:11
просто пишешь, как хочешь, а не по шаблону

Elias
03.11.2017
08:15:18
Ещё стоит упомянуть про системы, которые потом итерируют по всем активным компонентам и что-то делают для них. Например проверяют коллизию на Collision component
Да, что-то похожее на то, как раньше делали (и делают, я думаю)
Как наследование от IDrawable, ICollidable и пр.
Только вместо наследования композиция

Snusmumriken
03.11.2017
08:16:24
Извращения : )
На самом деле, это офигенно сложная фиговина, особенно итерирование.
Как ты будешь отбирать объекты? Проходить по всей куче из ста миллиардов висящих в оперативке?

Columbus
03.11.2017
08:16:35
опять меня убеждают в том, что я все это время писала хуйню
эххх

Elias
03.11.2017
08:17:29
Отбирать, в смысле знать какие объекты обновлять, а какие - нет?

Snusmumriken
03.11.2017
08:17:42

Elias
03.11.2017
08:19:18
опять меня убеждают в том, что я все это время писала хуйню
Не, нормально и ООП юзать, если быть аккуратным. Просто для больших игр с огромным числом видом объектов и их взаимодействий, эта система быстро становится адовой
Для каких-нибудь рпг, например
Для игр, где количество типов объектов не является большим, ООП нормально работает

Snusmumriken
03.11.2017
08:19:20
Отбирать, в смысле знать какие объекты обновлять, а какие - нет?
Ну вроде того. Я показывал пример где обрезаем сущности в spartial hash коллайдера ориентируясь по камере, и это оказалось самым рациональным.
Но для этого нужно иметь этот самый spartial hash и цеплять сущности к нему, чтобы была какая-то пространственная индексация.
Очень далёкие объекты не нужно обновлять, даже если они активны. А прохождение по списку из сотен миллионов сущностей - долго.


Elias
03.11.2017
08:20:55
Ну да, я использую такой хэш. И если ты объекты распихиваешь по бакетам, то не нужно будет проходиться по всем объектам на карте, а только по объектам, которые лежат в активной части карты, например
ООП бывает разный
Самая проблематичная система, это когда у тебя есть наследование в духе Character -> Enemy -> Troll -> SuperMegaTrollWithGuns
Если много типов объектов, то такое дерево быстро разростается и его не так удобно поддерживать. Объекты часто тащат за собой много ненужных зависимостей, особенно данных.
Часто любят в класс Entity/Character напихать всего подряд, в итоге у самых простых объектов есть много объектов и членов класса, что как-то не ок.
Чуть лучше - это когда ты наследуешь от IDrawable, ITransformable и пр.
Это почти уже ECS, где различные аспекты объектов разбиваются на разные классы, а затем Entity собираются из них.
И это очень близко к ECS и можно даже так ECS написать, но проблема в том, что ты не можешь создавать без рекомпиляции новые сущности.
Т.е. если я захочу сделать новый тип объекта, я пропишу один JSON и всё. Иначе нужно было бы писать код, рекомпилировать его и пр.
В индустрии, где те же геймдизайнеры хотят писать скрипты и не заниматься C++ кодом, это особенно полезно. Можно изменить многие вещи для каждого типа объекта не прикасаясь к коду вообще. :)

Google

Columbus
03.11.2017
08:32:39
кстати, какую либу для json ты юзаешь