суббота, 25 января 2014 г.

Мысли о движке

Давно не писал, все как-то времени не было. Сегодня я решил написать про то, как именно разрабатывается Amethyst Engine (ранее Sapphire Engine).

Почему пишу движок, а не игру?

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

Ну так вот, я начал свой движок, и знаете что обнаружил? Интерес к движку не угас ни через неделю, ни через месяц, ни даже через год!!!. Я уже второй год пишу движок, и буквально недавно под новый год, я решил сделать огромный апдейт движка - и целых две недели по 16 часов работал над кодом - реально, садился утром (часов в 9) за код, в три ночи шел спать. С перерывами конечно, но при этом то чувство энтузиазма не заканчивалось даже при полном физическом истощении.

Так что движки - это то, чем я мечтаю заниматься в жизни. Жаль что сейчас из-за всяких unity сложно найти такую работу (хотя я и такую-то еще не нашел:( )

Так я и начал писать свой Сапфир. 

Позже мне пришлось на практике изучить unity 3d. И познакомившись с ним на практике я тоже оценил этот движок. Но в отличие от других игроделов, мне не пришла мысль "я не смогу написать такой движок, больше не буду его писать, а буду теперь на юнити". Эта мысль, к моему сожалению приходит ко многим значимым людям (например Аврелий бросил свой движок по этой причине). Но мне же пришла другая мысль - "я смогу сделать такое же, и даже лучше"... Нет, я должен сделать такое же или лучше:) Возможно причиной было то что я также ковырял юнити и с технической стороны (например сразу же просмотрел его PIX), и то что я увидел - меня не впечатлило.

Поэтому, после новой огромной порции энтузиазма я переименовал Сапфир в Аметист... На самом деле Аметист должен был быть учебным движком, как фреймворк из вики по DX11 - но в конце он перерос и полностью перенял все из Сапфира. Так что теперь мой движок зовется Аметистом.

Почему бы не писать чужой движок?

Тут я что хочу сказать - я не любитель велосипедов. У меня не жжет в одном месте если я юзаю Boost там, или STL или еще что-то чужое. То есть у меня нет болезни писать свое.
Но тогда почему я пишу свой движок? Движок я пишу потому что мне нравится возиться с технической частью, а это нигде больше нельзя реализовать - в играх движки уже готовые, там надо другими вещами заниматься, над реальными движками я не работаю, по причине того что такой работы в России - единицы и туда надо еще переехать (что я не могу). Работать над опенсурсными... Кроме огра и ирлиха, нигде нет большого сообщества (в основном все пишут в одиночку). И при том - это надо ковырять чужие костыли (а в огре и ирлихе их полно). Да даже если бы я нашел (предлагали уже), ведь это надо потратить очень много времени на то чтобы освоиться с этим движком, а я хочу писать сейчас, а не потом.
Да и еще - я хотел интегрировать несколько своих идей (модульная система, система зависимостей, разделение на библиотеки, событийная система, некое подобие компонентой системы, скрипты на С++), что вряд ли понравилось бы авторам движка (а впихнуть эти идеи даже костылем сбоку нереально - надо полностью переписывать всю архитектуру)


Два года, а не много ли?

Да, идея писать свой движок пришла мне где-то два года назад (может и раньше). Так почему так долго?
  • У меня нет профессионального опыта.... никакого (я не зарабатываю на играх и их разработке). Многое приходилось изучать сразу же по мере надобности, о многом я просто до сих пор не знаю
  • Переписывание движка. На самом деле я не писал один движок. Я писал много движков. Из-за отсутствия опыта, я бросал старые наброски и начинал с нуля, потом снова бросал и снова с нуля.... и снова, и снова.
  • Методика которую я выбрал. О ней ниже.
  • Нерегулярно занимался движком. Несмотря на весь энтузиазм, я не работаю над движком каждый день. Иногда простои были месяцами (другие проекты, учеба, другие занятия и т.д.). Это самая главная причина, по которой я так долго пишу.
Так что на самом деле, если бы я взялся со всей серьезностью и имея опыт, я бы написал движок текущего уровня за пару месяцев (перевод сапфира в аметист, это доказал)

Как я пишу свой движок?

Один момент - я не пишу все с нуля. Наоборот, из текущего движка в 200 тысяч строк мною лично написано с нуля где-то процентов 10. Плюс еще процентов 20 - отрефакторенный до неузнаваемости (от первичного варианта) код, который я вообщем тоже могу приписывать себе, хотя первоначально это был чужой.

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

Так вот, после нескольких неудачных попыток я нашел один опенсурсный движок, который и лег в текущую версию движка (с этого момента я перестал переписывать движок с нуля). Так появился скелет. В этот скелет я встроил все свои ранние наработки. Плюс переписал кое-какие архитектурные моменты.

Но это не форк  того движка... От него там все меньше и меньше - в идеале я собираюсь вообще выкинуть весь код. Он был нужен для быстрого старта, не более.

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

Так вот, дело в том что я как раз противоречу тому мнению и беру многие вещи из разных движков, после чего довожу код до рабочего состояния. А после этого добавляю еще одну вещь, и снова довожу до рабочего. При этом все рефакторится, изменяется на мои крутые идеи и т.д. В результате я получаю движок уровня ААА (да, текущая версия спокойно пригодна для создания крутых игр)

Что интересно, я сейчас читаю книгу Фаулера "Рефакторинг". Так вот, я умудрился опробовать все что он там пишет на практике. То есть пока другие читают книгу и пытаются запомнить, я все это пробую на реальном и довольно таки сложном проекте (200 тысяч строк это не приветмир)

Возможно вы сейчас скажите "фууу"... Но я направил себя на готовый конечный продукт, а не на писание очередного лога для будущего движка. Даже если вы будете писать с нуля, то поверьте моему богатому опыту ковыряния чужих движков - вы ничего не напишите такого, чего до вас уже не писали в сто других движках. Иногда доходит до того что в разных движках есть один и тот же код (не потому что копипастили, а потому что по другому не написать)

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

Так что я получил при этом?

Благодаря такой методике я получил:
  • офигенный опыт работы с чужим кодом. Позже я участвовал в нескольких игровых проектах в которых уже была огромная кодовая база (в последний раз я работал уже над законченной игрой - писал для нее патчи), где и убедился - чужой код для меня не проблема - он почти такой же, как свой.
  • плавающий кодестайл. Я научился воспринимать разный кодестайл. Конечно у меня есть свой личный, но и чужой меня не пугает (даже если это кодестайл от Microsoft), что опять же будет большим плюсом на работе
  • увидел реальный коммерческий продукт. Выше я писал - у меня есть в том числе и всем известные ААА движки в виде кода. Где еще я бы смог с этими движками поработать? Где еще я мог увидеть код реального продукта?

Будущее движка

Собственно движок более менее рабочий (на нем я пишу битвы fantasy). В нем есть OGL и DX 11.
Так что 2014 я решил посвятить разработке визуального редактора (я же хочу писать убийцу юнити), и созданию демонстрации движка.
Надеюсь к 2015 году наконец-то выложить движок для его оценивания

Движок не будет опенсурсным - нет смысла.