Raycast

Итак, вторая часть штурма – трёхмерный мир. После анализа шикарного тайлсета от Saito00 и планирования работы, начал с самой непонятной и неблагодарной работы – оптимизация рейкаста. В прошлом алгоритме это было самое слабое звено, которое требовало времени существенно больше, чем, собственно, генерация карты.

Жестоко хромает дискретная алгебра, однако, в общем, уже наклёвывается ускорение работы в десятки, а то и сотни раз.

So, the second part of the map generation is 3D world. After analysis of a cool tileset by Saito00 and some planning, I’ve started the most unrewarding work – optimization of raycast algorithm. It was the weakest spot in the previous algorithm implementation and took much more time than all other map generation routines together.

My poor knowledge of discrete algebra reveals itself here. Despite that, at this point I already anticipate acceleration of the algorithm a few dozens, maybe hundred times.

Raycast

Всё ещё менеджер карт…

Как же легко искать утечки памяти, когда обращаешь на них внимание непосредственно в процессе разработки… и как тяжело теперь отдебажить интерфейс, где я про них забыл 🙂

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

За вечер-утро доработал интерфейс генератора карт + несколько других улучшений.

It’s so easy to hunt for memory leaks when timely done during the development. And how hard now is to debug the interface, where I didn’t pay attention to leaks…

Hm… Looks like I start to understand the source of the motivation – diverse and not very complex work. Moreover, I have a “visible” result for a reasonable time. I should try to exploit this feature better 🙂

During evening-morning I’ve improved the map manager interface + a few more improvements.

Всё ещё менеджер карт…

Work must go on!

Снова безудержное веселье с отчётом на работе. По игре – сделал визуальный выбор основных параметров генерации карты. Пока всё просто…

Still wasting a lot of time for that stupid report at work… I could spend ~1 hour for programming yesterday and made visual editor of map generation parameters. It was easy so far…

2017-03-27-231423_1366x768_scrot.png

Work must go on!

Maginficat!

Обещал же себе… не лезь в оптимизацию, козлёнком станешь, сделай чтобы заработало, а потом возись сколько душе угодно. Нет, таки провозился все выходные по принципу “всё и сразу”.

Мотивация к работе не перестаёт радовать – 40% пятница, 80% суббота, 80% воскресенье. Итого, за выходные – почти 10 тысяч строк кода, судя по отчёту GitHub-а (впрочем, похоже, он “зацепил” в статистике не только файлы с программой, а и карты тайлов, так что цифра существенно завышена :))…

Новый генератор карт работает приблизительно в 100 (!) раз быстрее, чем прошлый вариант (200 миллисекунд на генерацию карты 25х25х9 вместо 20 секунд в старом алгоритме). А ранее вообще не решаемые задачи теперь решаются мгновенно (9х9х9 – старый алгоритм сдался после 400 секунд так и не “забравшись” ниже 6го этажа, новый генерирует все 9 этажей за около 50 миллисекунд). Если мне удастся таким же образом оптимизировать рейкастинг (а наклёвки есть), то, возможно, даже потоковая генерация окажется не особо актуальной…

Осталось несколько часов, чтобы всё подчистить, настроить и окончательно вставить в игру.

Ещё одним важным шагом генерации будут связанные области (для создания дверей и окон, сюжетных “узких точек”). Но это чуть позже.

Не так хорошо складывается связь карты со сценарием, как мне хотелось бы. Всё ещё слишком много непонятных моментов: что и как добавлять, чтобы получать триггеры с карты было удобно как при генерации так и при самой игре. А триггеры ведь могут цепляться не только к конкретному тайлу, но и к элементу тайла (например, переключатель) и к некоторой области карты (например, токсичная область подземелья). Некоторые тайлы, несущие триггер, могут быть определены в процессе генерации. Короче, сложностей достаточно. Но всё по порядку.

How many times I’ve promised myself not to get into optimization now… Just make it work and then optimize to heart’s content. No. I’ve still wanted to do “everything at once”.

Still enjoying miracles of motivation – 40% Friday, 80% Saturday, 80% Sunday. Those were almost 10 thousands lines of code for the weekends according to GitHub report  (However it seems that tile maps were also counted, so this number is overestimated :))…

Eventually map generator is working approximately 100 (!) times faster than the previous implementation (200 milliseconds to generate a 25х25х9 map comparing to 20 seconds of the old algorithm). And previously unsolvable tasks are solved in fractions of a second (9х9х9 map – the old algorithm gave up after 400 seconds of trying and couldn’t reach below 6th floor, a new one produced a valid 9-level map in approx. 50 milliseconds). If I’ll be capable of optimizing the raycasting to a similar extent (and it looks possible) I’ll doubt usefulness of threaded generation 🙂

However, I need several more hours to clean it up and launch in-game.

One more important generation modification is linked areas algorithm (to create doors and windows, plot-related bottle-necks). But I’ll address it a bit later.

I still have difficulties with linking the map to scenario triggers. There are several problems to add them in such a way that it would be convenient to work with triggers both during the map generation and during the gameplay. While the triggers can attach to a tile (e.g. entrance-exit triggers), to tile element (e.g. a switch) or to some map area (e.g. a toxic area of the dungeon). Some tiles carrying triggers can have undefined location at generation start. Well… there’re lots of difficulties. But let’s address them sequentially.
2017-03-26-224429_1366x768_scrot.png

Maginficat!

Продолжаем

Не смотря на полный “аут” вчера-сегодня удалось неплохо поработать по генератору карт (подготовка инициализации, управление картой).

Despite being very tired I still managed to do some progress on map manager (initialization routines, map service routines).

Продолжаем

Работа…

Идёт 33й час почти непрерывного рабочего дня 🙂

Ударные бестолковые труды над не менее бестолковой задачей на работе… увы, приятных новостей не много.

Придумал “по дороге на работу” ещё один тип случайных карт (концентрическая), но пока не уверен, насколько он оправдан: работы для него уйдёт много, а польза – не особо очевидна…

Working for 33 hours by now almost without interruptions… Stupid overload at work for a stupid and silly task… I wish I had any better news 🙂

On my way to work I’ve came up with a “concentric” random map generation algorithm… But it looks complex to implement without any obvious advantage…

Работа…

Закончил Менеджер Тайлов

Продуктивный вечер не смотря на усталость и плохое самочувствие. Завершил все актуальные задачи по Менеджеру Тайлов – всё работает как часы.

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

Есть тут ещё одна проблема – попытаться “оптимизировать” качество и скорость генерации карт. А также сделать связанные области на картах и добавление триггеров. Однако, это – второстепенные задачи, которыми можно заняться значительно позже. Главное сейчас “поднять” старый генератор карт на новый уровень.

Увы, уровень (кровяного) давления не показал почти никакой связи с работоспособностью и мотивацией. Обидно. А я так хотел найти “простое решение” 🙂

I’ve had a very productive evening on Monday despite feeling ill. I’ve finished all urgent tasks on Tile Manager – now everything is working clean and flawlessly.

The next step is Map Manager. On one hand this work is relatively complex – I need to rewrite the map generator completely, including thread-safety. On the other hand – it will solve a lot of problems I’ve had with old implementation of map generation and map parameters choice.

There are several more tasks to do here. I need to optimize quality and speed of the generation algorithm. And also I need to make linked areas at the map and support for triggers. However, these are secondary tasks, I can address them much, much later. The main goal now is to advance the map generator to a new level.

Unfortunately blood pressure level didn’t show any correlation with my work efficiency and motivation… I really hoped for a simple solution of this problem.

blood.png

Закончил Менеджер Тайлов