Путь от игрока до разработчика игр
Привет, читатель!
Этот длиннопост - результат интереса, проявленного к моему вчерашнему комментарию:
"В октябре прошлого года я решил поучиться программированию. Сейчас доделываю онлайн браузерную ММОРПГ-игру с элементами социальной сети. Так что по своему опыту могу сказать, что так получается, когда с головой погружаешься во что-то страшно для тебя интересное )" (#comment_99643287, #comment_99644807)
Благодаря этой ветке с комментами у меня появилось 11 подписчиков, посему небольшой цикл постов на тему разработки многопользовательских браузерных онлайн-игр объявляю открытым :)
Начать стоит с предыстории. Она почти целиком повторяет длинный коммент из ветки, но полностью описывает мой путь от простого игрока до линуксоида и веб-программиста.
Всё началось году в 2012-ом. Одногруппник познакомил меня с игрой Майнкрафт. Нет-нет, я не малолетний задрот, правда (мне ведь тогда уже было аж 22)! Я никогда не любил добывать ресурсы и охотиться на мертвяков, мне нравилось только строить монументальные постройки. Это ж почти как Лего, только ноги в безопасности. Одному играть стало скучно, начал играть по локалке с другом. Вдруг нам пришла идея: а не открыть ли собственный игровой сервер? Сутки ушли на то, чтобы разобраться с основными конфигами, закинуть пару плагинов, опубликовать рекламу в Контакте. И дело пошло.
Но держать игровой сервер на ноутбуке - не комильфо. Через пару недель решено было арендовать VDS (виртуальный выделенный сервер). Выбрал сервачок на немецком хостинге за ~3000 рублей в месяц. Из операционок можно было выбрать неизвестные мне тогда Debian, Ubuntu, CentOS, что-то ещё. Наугад ткнул в Debian, и пошло-поехало. Так начался мой путь линуксоида.
Через какое-то время мне надоело платить за хостинг, и я собрал свой собственный домашний сервер. Сконструировал убермашину: восемь AMD-шных ядер, 32 ГБ оперативки, SSD, охлаждение помощнее. Около 40 тысяч рублей ушло на этот электронно-вычислительный агрегат, который до сих пор верно мне служит, стоя в полуразобранном виде на холодильнике.
Я стремился сделать свой игровой сервер если не лучшим, то одним из. Сами же игры к тому моменту мне совершенно наскучили, так как стало гораздо интереснее возиться с конфигами. В ходе решения проблем, с которыми приходилось сталкиваться, я знакомился с разными полезными утилитами, учился писать скрипты, короче говоря, познавал много нового.
На волне своего саморазвития я решил податься в веб-программирование, счёл это перспективной сферой. Как сейчас помню, 1-го октября 2016-го в полдень я сел за компьютер и... и ничего. Не знал, с чего начать. Скачал какие-то учебники, самоучители, но это было ужасно скучно, невыносимо нудно, все примеры были поразительно простыми, но в то же время было неясно, когда всё это может пригодиться. Три часа втыкал в эти примеры кода в духе "дважды два", в итоге плюнул на всё и решил: "К чёрту теорию, начну сразу с практики".
Вот примерно так же я смахнул всё со стола. Ну ладно, может и не так, учебники были в электронном виде, да и компьютер для программирования мне мог пригодиться. Спокойно щёлкнул крестик в книжке и решил сделать чат.
Сам по себе, понятное дело, чат нафиг был не нужен, я лишь счёл его написание неплохим упражнением. С вёрсткой (HTML и CSS) я был знаком, синтаксис и возможности PHP и JS тоже были поверхностно известны. Крошечный опыт программирования у меня уже был благодаря написанию элементарных bash-скриптов.
За неделю сбацал чатик. Сейчас уже понимаю, насколько он был кривой, но тогда мне это казалось настоящим прорывом. Я понял тогда, что залог успеха - это постоянное гугление. Если чего-то не знаешь, то идёшь в Гугл и вбиваешь свой вопрос. Гугл хороший, Гугл всегда поможет. Как и Яндекс, кстати, кому что нравится.
После чата всё завертелось, и я решил сделать что-нибудь посложнее. Пришла идея реализовать поле боя с человечками, которое я встречал ранее в другой браузерке, ещё лет за 10 до этого. Человечки ходят по полю, разбитому на шестиугольники, бьют друг друга, ставят блоки, получают и наносят урон и либо помирают, либо получают опыт. Недели три я почти безвылазно сидел за компьютером, не спал сутками, строчил код, правил его, стирал и снова строчил. Иногда, уже ближе к рассвету, хотелось плакать. Но в итоге, когда всё заработало именно так, как я планировал, я хохотал, махал руками и кричал что-то в духе "ИТС ЭЛАЙВ!11"
Но не всё меня устраивало в результате. Проблема была в том, что при выполнении действий одним игроком нужно было рассылать эти действия всем остальным участникам сражения. Сначала я использовал для этого AJAX, то есть каждые пару секунд все игроки сами отправляли на сервер запрос: "ну что, есть какие-нибудь изменения на поле боя?", и получали ответ от сервера: "Нет, изменений нет" или "Да, изменения такие-то: ..." (под изменениями подразумевается расположение других игроков на поле, их здоровье и характеристики).
Это мне не нравилось, так как от клиентов к серверу отправлялось слишком много запросов, а серверу приходилось на них реагировать в любом случае, вне зависимости от наличия изменений. В малых масштабах это не критично, но я уже понимал, что не бывает чрезмерно оптимизированного кода.
Стал я тогда думать, как оптимизировать процесс, и наткнулся на фантастическую технологию WebSocket. С её использованием сервер мог сам решать, какому клиенту какую информацию отправлять, а самое главное - в какой момент времени. Клиент теперь не должен был ежесекундно бомбить сервер запросами, достаточно было лишь установить соединение в начале загрузки страницы и ждать весточек от сервака.
Пошло-поехало номер два. Увлёкся так, что помимо чата и поля боя добавил полтора десятка разных характеристик (сила-ловкость-крутизна и всё такое), магазин шмота, переодевалку, рынок, улучшения для шмоток, профессии, кузницу, школу магии с десятком боевых заклинаний, кланы, искусственный интеллект для ботов (ну и самих ботов, разумеется), плюс адаптивный интерфейс веб-страницы, причём без перезагрузки самой страницы... и конца-края этому не видно. Релиз ещё где-то далеко за горизонтом. Это как ремонт в хрущёвке: начать можно, а закончить нереально.
Спасибо тем, кто вчера подписывался на меня, кто заинтересовался этой темой, кто дочитал до конца этот длиннопост. Надеюсь, он сможет показать, как спонтанно принимаются определяющие жизнь решения, и вдохновить начинающих программистов на великие свершения. Если вам понравилось, я с удовольствием опубликую ещё парочку постов, где покажу саму игрушку, расскажу о некоторых сложностях процесса разработки, поведаю о нескольких интересных технологиях (те же вебсокеты, например), о которых могут не знать начинающие программисты, но которые поразительно просты и в то же время великолепны.
Драйвер AMDGPU наконец сравнительно стабилизировался для всех карт выше HD7xxx.
Может, новость уже не совсем новость, но, судя по недавнему тестированию на Phoronix новый ядреный модуль amdgpu на самом свежем ядре уже обгоняет старый radeon почти на всех картах (выше Radeon HD 7xxx)
Судя по моему личному тестированию на KDE Neon (ubuntu 16.04) со стоковым ядром 4.13 - все очень даже работоспособно, из регрессий - только криво работающее аппаратное ускорение видео.
Нафиг это надо?
Из основных нововведений - поддержка Vulkan (radv), штатный интерфейс для разгона и возможность накатить новый проприетарный драйвер AMDGPU-PRO (на данный момент особой ценности не представляет).
Как включить?
Для начала убедиться в свежести софта. Нужна mesa из padoka ppa (в т.ч. пакет mesa-vulkan-drivers), ядро >= 4.13 (пакет linux-image-generic-hwe-16.04-edge для Ubuntu 16.04).
Затем надо передать параметры ядра, скажем, создав файл
/etc/modprobe.d/local.conf со строками (для GCN 1.0):
options amdgpu si_support=1
options radeon si_support=0
или (для GCN 1.1):
options amdgpu cik_support=1
options radeon cik_support=0
и выполнив
sudo update-initramfs -u
Также настоятельно советую создать файл
/etc/X11/xorg.conf.d/20-amdgpu.conf c содержимым
Section "Device"
Identifier "AMD"
Driver "amdgpu"
Option "TearFree" "on"
Option "DRI" "3"
EndSection
Если система не грузится, можно все откатить из Recovery Mode, из рут консоли:
$mount -o remount,rw /
$rm /etc/modprobe.d/local.conf
$rm /etc/X11/xorg.conf.d/20-amdgpu.conf
$update-initramfs -u
На этом все, удачных экспериментов.
Awesomenauts стали free2play
Довольно залипательная 2D Moba 3 vs 3 доступная для windows, linux и macOS
steam: http://store.steampowered.com/app/204300/Awesomenauts/
Ключевые особенности:
Утренние мультики возвращаются — сетевой динамичный платформер-шутер с игрой 3 на 3 и ярким мультяшным стилем 80-х.
Это MOBA! — классы, модификации, крипы, турели, базы и тактическая глубина — всё это здесь есть. Awesomenauts привносит очень быстрый процесс платформера, чтобы воссоздать уникальный и доступный опыт игры в MOBA
Awesomenauts — управляйте одним из уникальных и настраиваемых Awesomenaut'ов, каждый со своим оружием и способностями.
Баталии на одном экране — играйте по сети или в автономном режиме с поддержкой до 3 игроков на одном экране!
Постоянные обновления — регулярное пополнение новыми Awesomenaut'ами, исправлениями ошибок, скачиваемым контентом и прочим.
Не расстраивайся, а настраивайся! — сотни уникальных предметов для усиления способностей и настройки вашего Awesomenaut'а в соответствии со своим личным игровым стилем!
Найдите свой предел — зубодробительные битвы среди множества экзотических планет и космических кораблей!
Linux + directX11 + unreal engine 4
Товарищи прекрасная новость! команда Wine CSMT наконец победила "защиту от запуска игр" называемую Directx11
Divinity original sin 2
https://www.youtube.com/watch?v=swxDhsQhXsc
чуть позже после записи было выяснено что если убрать тени - то игра идет на 60 FPS
но увы вовремя недогадался.
Я специально сделал целых 3 релиза на 3 разных основах чтобы каждый мог потестить систему с уже установленным wine и wineprefix
Выбраны были: Linux mint 18.1 x64 lts c Mate, ubuntu 16.04.1.lts x64 c mate, mx-linux 16 x64 c mate. Все системы debian based и на всех можно запускать игры с Steamos тоже разумеется.
https://rutracker.cr/forum/viewtopic.php?t=5343942 - Минт
https://rutracker.cr/forum/viewtopic.php?t=5345515 - Убунту
https://rutracker.cr/forum/viewtopic.php?t=5352658 - МХ
я лично протестировал Divinity o.s. 2 и если не записывать ролики то можно даже полноценно играть без единого графического бага где то на 40fps
также пользуясь случаем выкладываю скомпилированный мной unreal engine 4.14 с комплектом из marketplaсe (установить комплект это целая история не меньше чем установить и правильно настроить систему и wine + wineprefix + всё обновить и поставить ядро) . Контент обычным образом не скачать т.к. для скачки требуется microsoft windows.
тут epic games конечно выпендрилась. к движку и игре полностью идущим на линукс требовать качалку требующую виндовс...
https://rutracker.cr/forum/viewtopic.php?t=5352050
https://rutracker.cr/forum/viewtopic.php?t=5355600
Надеюсь кому то это будет полезно и пригодится.
<Обучение от малого до великого> // Игры в Терминале.
Иногда, после тяжёлого дня, просто хочется взять, сесть и поиграть в какую-нибудь игрушку. Но что делать, если у вас нет много времени скачивать игру, а ОС на данный момент- Linux. Есть лёгкий способ за пару минут скачать много разнообразных игрушек и не теряя много времени открыть терминал начав в них играть.
В данной статье я покажу различные игры для терминала Debian/Ubuntu. Начнём.
1) Bastet- старый добрый тетрис. Установка:
sudo apt-get install bastet
2) 2048.c- игровое поле имеющее форму квадрата 4x4. Целью игры является получение плитки номинала «2048». Установка:
wget https://raw.githubusercontent.com/mevdschee/2048.c/master/20...
gcc -o 2048 2048.c
3) Greed- цель данной игры- съесть как можно больше цифр, перемещаясь с помощью клавиш со стрелками, но значение, которое вы хотите съесть, будет также количеством шагов, которые необходимо сделать в его направлении. Установка:
sudo apt-get install greed
4) Moon-buggy- аналог динозаврика в Google Chrome. Установка:
sudo apt-get install moon-buggy
5) nInvaders- клон знаменитой игры Space invaders
sudo apt-get install ninvaders
6) MyMan- =PacMan. Установка:
sudo apt-get install libncurses5-dev groff
wget http://downloads.sourceforge.net/project/myman/myman-cvs/mym...
tar xvfvz myman-wip-2009-10-30.tar.gz
./configure
make
sudo make install
7) NetHack- roguelike-игра: подземелья, кишашее монстрами, множество персонажей, генерируемый случайным образом лабиринт и множество смертей. Установка:
sudo apt-get install nethack-console
sudo pacman -S nethack
8) cgames- логическая игра, где нужно передвигать ящики добираясь до цели. Установка:
sudo apt-get install ligpm-dev libncurses5-dev
./configure --with-ncurses
make
sudo make install
csokoban (или cmines, или cblocks) для запуска соответствующей игры.
9) BSD-Games- сборник различных игр. Включённые в этот список игры: http://wiki.linuxquestions.org/wiki/BSD_games. Установка:
sudo apt-get install bsdgames
10) Nudoku- =Sudoku. Установка:
sudo apt-get install nudoku
11) 2048-cli- Смысл игры в том, что вам нужно объединять одинаковые блоки увеличивая, их значение 2+2=4, 4+4=8, 8+8=16 и так далее. За каждое успешное сложение вам начисляются очки, а игра заканчивается, когда у вас не остается ходов. Установка:
sudo apt-get install 2048-cli
12) Zangband- это кроссплатформенная игра в жанре приключения на одного игрока. Создавалась на основе Rogue. Установка:
sudo apt-get install zangband
13) Frotz- текстовая игра. Установка:
sudo apt-get install frotz
Связаться со мной можно в ВК: https://vk.com/hydra571.
Отличник или двоечник? Узнайте свой уровень подготовки к Евро-2024
Для всех поклонников футбола Hisense подготовил крутой конкурс в соцсетях. Попытайте удачу, чтобы получить классный мерч и технику от глобального партнера чемпионата.
А если не любите полагаться на случай и сразу отправляетесь за техникой Hisense, не прячьте далеко чек. Загрузите на сайт и получите подписку на Wink на 3 месяца в подарок.
Реклама ООО «Горенье БТ», ИНН: 7704722037
Еще один пост, как играть в виртуальной машине.
Знаю, был пост подобной тематики. Но ставить Proxmox для того, чтобы просто попробовать, для новичка, я считаю, малость чересчур. Будем препарировать Ubuntu.
Итак, по сути, я расскажу, как поставить QEMU с пробросом видеокарты, чтобы можно было поиграть. На схеме это выглядит так (ну очень схематично):
Это позволяет запускать в виртуальной машине на отдельном мониторе приложения, требующие полноценной видеокарты. По сути это практически эквивалент второго компьютера. Дальше сами додумаете.
ДИСКЛЕЙМЕР.
Я не рассматривал типовые проблемы, которые могут возникнуть, чтобы не перегружать пост текстом, если они возникнут, вам придется копнуть чуть глубже или спросить совета. Не надо писать "ололо, у меня ошибка 43, мануал говно".
Что нужно?
- Один Linux типовой - Ubuntu, чем свежее, тем лучше.
- Камень и мать с поддержкой AMD-Vi/VT-d и IOMMU соотв. Погуглите.
- Вторая видюха, очень желательно во втором PCI-e порту.
- Второй видеокабель и очень желательно - второй комплект клавиатура/мышь.
Качаем и ставим qemu, в убунту это:
$sudo apt install qemu
Лучше со стандартным ядром и qemu из реп, если не шарите.
Накатим систему по вкусу пока без GPU. Разметим образ:
$fallocate -l 20G /Гдето/WinX.img
и запустим систему, поставив туда любимую десяточку/семерочу/что-то еще:
$qemu-system-x86_64 -m 2048 -machine q35,accel=kvm -boot d -drive file=/Гдето/WinX.img -cdrom /Тамто/Windows.iso
Как поставить виндовс - можно найти в интернете))
Далее надо запустить драйвер vfio и присобачить к нему видюшку, которую надо пробросить.
Для этого нам надо узнать адрес и идентификатор карты. Сделаем волшебное:
$lspci -nn
ищем нужные девайсы (VGA и HDMI Audio), в моем случае нас интересует это (запишите то, что жирным):
06:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] [10de:1380]
06:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbc]
Запилим такое действо:
$sudo echo "options vfio-pci ids=10de:1380,10de:0fbc" >> /etc/modprobe.d/local.conf
Теперь добавим нужные модули.
$cat /etc/modules
vfio
vfio_iommu_type1
vfio_pci
И заапдейтим:
$sudo update-initramfs -u
Перезагрузимся. Этого должно быть достаточно.
Теперь проверим, как прошло.$dmesg | grep vfio
Должно выдать что-то вроде:
[ 4.774681] vfio_pci: add [10de:1380[ffff:ffff]] class 0x000000/00000000
Наконец запустим нашу машину башскриптом типа:
#!/bin/bash
export QEMU_AUDIO_DRV=alsa
MISC="
-name win10
-machine q35,accel=kvm
-cpu Opteron_G5,kvm=off #Эквивалент AMD FX-83xx
-m 3072
-realtime mlock=off
-smp 6,sockets=1,cores=6,threads=1
-no-user-config
-nodefaults
-rtc base=localtime,clock=host
-boot menu=on,strict=on"
MONITOR="
-monitor stdio
-vga none"
STORAGE="
-drive file=/Гдето/WinX.img,format=raw"
DEVICES="
-device vfio-pci,host=06:00.0,id=hostdev0,multifunction=on,x-vga=on
-device vfio-pci,host=06:00.1,id=hostdev1
-usb
-usbdevice host:$1
-soundhw ac97"
qemu-system-x86_64 $MISC $MONITOR $DEVICES -net nic -net user $STORAGE
Можно заметить, что скрипт использует аргумент:
-usbdevice host:$1
Это идентификатор клавиатуры/мыши 2.4 ГГц. Его можно (и нужно) узнать через
$lspci
Bus 005 Device 006: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Сам скрипт запускается так:
$sudo ./win10 093a:2510
Но пока не запускаем!
Да. У многих мониторов по два входа, так что проброшенную видеокарту стоит подключить вторым кабелем и не париться. Можно и на телек кинуть, как сделал я.
По поводу звука - лучше HDMI, конечно, но в скрипте есть волшебная строчка
-soundhw ac97
которая добавит стандартную звуковуху ac97 и будет выводить звук на хост. Но на Windows10 с установкой дров придется немного помудрить (можно найти в интернете). Если звук идет по HDMI, строку надо убрать.
На этом все. Удачных опытов.