?

Log in

No account? Create an account
полет в лабиринте (компьютерное) - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

полет в лабиринте (компьютерное) [дек. 3, 2012|02:45 pm]
Anatoly Vorobey
Эта запись может быть интересна программистам и сочувствующим.

Notch, создатель игры Minecraft, выложил ссылку на очень впечатляющее демо, в джаваскрипте (технология canvas), полета в трехмерном лабиринте. Для программистов с опытом работы в графике и играх тут не будет ничего нового, но даже им понравится краткость кода. Все исходники можно видеть прямо на той же странице слева от окна демо (и даже менять самому и перезапускать - так устроен сайт jsfiddle), и видно, что всего в 200 строчек простого и нисколько не сжатого кода Нотч уместил:

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

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

Если вы хотите лучше понять создание текстур, и самих исходников не хватает, то оно подробно разбирается в этом скринкасте (англ.). См. также обсуждение на HN.
СсылкаОтветить

Comments:
From: rustler2000
2012-12-03 01:06 pm
Неужеле грядет browser only minecraft?
(Ответить) (Thread)
[User Picture]From: guamoka
2012-12-03 01:32 pm
Парочка экранов спагетти кода, обильно посыпанные magic numbers. Что оно скажет вам об афинных преобразованиях, камере, матричном умножении, структурном программировании?
(Ответить) (Thread)
[User Picture]From: shadow_ru
2012-12-03 01:55 pm
It just works.
(Ответить) (Parent) (Thread)
[User Picture]From: meshko
2012-12-03 03:15 pm
Ну так это же жанр такой. Без magic numbers далеко на яваскрипте не нарендеришь.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2012-12-03 05:23 pm
Что-то вы преувеличиваете. Спагетти там нигде нет, код вполне разумно структурирован, а большинсво магических чисел - попросту шестнадцатеричные цвета. Конечно, если бы это была полноценная библиотека, было бы больше абстрагировано, но в целом - лаконичный, да, но понятный и разумный код.
(Ответить) (Parent) (Thread)
[User Picture]From: guamoka
2012-12-03 08:45 pm
Вы вообще по ссылкам, которые привели, пробежались глазами?


Notch has made a couple of comments on reddit :
http://www.reddit.com/r/programming/comments/146v69/how_notc...
Please do NOT write code like this. It was originally written for the Java4k
competition, which focuses on executable code size, and is as a result almost
intentionally poorly written. It got even worse when I ported it to JS.
It was mainly meant as a test for me to see what HTML5/JS can do, and an
exercise in porting code over.


Код ужасен даже при беглом взгляде на него. Как человек и написал, это был чисто пруф-оф-концепт-дёрти-тест. Похоже, допиливался в ручном режиме, чтобы "тупо работало"
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2012-12-03 10:18 pm
Ссылку на эту цитату уже приводили ниже, и я там ответил.

Попробую объяснить еще раз:

1. В этом коде нет ничего ужасного.
2. В этом коде нет ничего от спагетти-кода. В качестве ликбеза: уясните себе, что такое спагетти-код.
3. В нем также, вопреки вашим утверждениям, почти нет магических чисел.
4. Он написан не так, как должна быть написана нормальная библиотека для 3D-движка, но он для этого и не предназначен.
5. Код читается легко, и для человека в теме в нем нет НИЧЕГО непонятного.
6. Поскольку он очень краток и его структура прозрачна, для человека не в теме, который хочет научиться делать такие вещи, он может служить отличным учебным пособием и мотиватором.
(Ответить) (Parent) (Thread)
[User Picture]From: guamoka
2012-12-03 10:29 pm
1. Этот код ужасен. Это признал даже сам автор.
2. Для начала сами прочтите внимательнее определение "спагетии-кода". И хорошенько осмыслите. Если вы уловили только про форматирование или наличие оператора гото- то нет. Это не единственные и даже не главные определяющие спагетти кода.
3. К тому же вы не знаете, что такое меджик намберз.
4. Речь идет конкретно про этот код. Он не обязательно должен быть библиотекой, чтобы быть грамотно написан.
5. Похоже, вы еще более не в теме.
6. В нём множество хвостов и откровенных хаков. Для человека не в теме он вообще противопоказан. Отличным учебным пособием для человека послужат книжки по CG. А так же книги по написанию аккуратного кода.
(Ответить) (Parent) (Thread)
[User Picture]From: t_gra
2012-12-05 03:41 pm
Что конкретно плохо в коде:
- Long Methods (С помощью Extract Method я бы раздербанил это на мелкие методы, дав каждому осмысленное имя - замена комментариев)
- Magic Numbers (их совсем не немного, а кое-где по три штуки в одной строке, шестнадцатиричные коды - это как раз нормально, так как повторений нет. Все эти 64, 96, 16*3, 9 и т.п. - что это всё такое? Имеет смысл вынести константы и дать им осмысленные имена, тогда код станет гораздо понятнее.)
- Не очень осмысленные имена переменных
- Битовая арифметика. Оно, может, и эффективно, но нечитабельно.

Что хорошо:
- Код показывает, что вот такое можно написать на JS и это в принципе не так уж сложно. То есть свою задачу решает.
- То что оно выложено в этом jsfiddle, что позволяет желающим с минимумом телодвижений поредактировать и позапускать код.

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

В общем-то, вполне терпимо по сравнению со многими другими образчиками кода и при желании вполне можно разобраться, затратив определённое, не такое уж значительное, время. Но не фонтан. Хотя и я так могу написать - но тоже в такой же ситуации: когда нужно что-то быстро накропать, чтобы проверить идею, что-то попробовать (то есть код, который будет выброшен).
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2012-12-06 03:48 pm
Понимаю вашу точку зрения, но не согласен с ней почти по всем пунктам.

Все, что вы описываете, не делает *данный конкретный код* более читаемым, а наоборот. Если разбить код на методы, то при чтении придется прыгать взглядом от метода к методу, держать в уме, в каком методе мы сейчас находимся, итд. Если дать осмысленные имена всем константам, смысл которых и так ясен из кода, то следить за тем, что происходит, станет тяжелее, а не легче. Скажем, возьмем вложенные циклы для x,y,z от 0 до 64. Совершенно очевидно, что происходит. То, что в других местах то же самое 64 повторяется, например при выделении места под карту, это плохо с точки зрения поддержки кода, это совершенно недопустимо в настоящей библиотеке, потому что когда-нибудь это число надо будет поменять итд. Но если мы все эти 64 заменим на какие-то x_size, y_size, z_size, это не сделает код более читабельным и легким для понимания - наоборот, нужно будет держать в уме, что есть еще и такие имена, что это константы, которые не меняются (или вносить эту информацию в имя, и у этого есть своя когнитивная цена), и так далее. Что такое 255 в контексте манипуляции битами, понятно любому компетентному программисту, а если эту манипуляцию вынести в отдельную функцию, это опять будет некий скачок внимания во время чтения. Есть в этом коде относительно сложная битовая манипуляция - но буквально в одном-двух местах, и она сложная по серьезной причине: нужно один раз подумать и понять; а все остальное - стандартные совершенно приемы, которые легко читаются с листа.

Есть существенная разница между кодом, который написан правильно с точки зрения будущей поддержки, изменения, тестирования, и кодом, который призван что-то продемонстрировать, чему-то научить, на что-то вдохновить. В первом случае все недостатки, о которых вы говорите, налицо; во втором они зачастую перестают быть недостатками, а наоборот помогают легкому чтению, пониманию главного принципа, схватыванию его с листа.
(Ответить) (Parent) (Thread)
From: captain_tylor
2012-12-03 01:38 pm
Хотел спросить, почему так медленно, потом понял, что это не OpenGL...
(Ответить) (Thread)
[User Picture]From: johnnywoo
2012-12-03 01:47 pm
А вот сам Нотч этот код хорошим не считает :)
http://www.reddit.com/r/programming/comments/146v69/how_notch_procedurally_generates_minecraft/c7aelxz
(Ответить) (Thread)
[User Picture]From: avva
2012-12-03 05:24 pm
Ну он же пишет там, что код выглядит так потому, что был написан специально покороче. И это заметно. Но в этом есть своя польза, потому что за десять минут можно его весь прочитать и понять.
(Ответить) (Parent) (Thread)
From: asox
2012-12-03 03:34 pm
Ну, с одной стороны - используемые библиотеки иммеют гораздо больший размер - а с другой игры в "4k demo" известны тоже давно.
Но забавно, канэшна.
Wolfenstein 3d в браузере. ))
(Ответить) (Thread)
[User Picture]From: avva
2012-12-03 05:22 pm
Тут полезно не то, что малый размер, а то, что малый размер *и* понятный код. Что о 4k-демках не скажешь, конечно.
(Ответить) (Parent) (Thread)
[User Picture]From: bolk
2012-12-03 03:56 pm
Кстати, стиль для IE лишний там, он не работает в IE9+, а версии ниже не поддерживают канвас.
(Ответить) (Thread)
[User Picture]From: burrru
2012-12-03 09:39 pm
Кунштюк классный, да. Особенно, ray-casting.
(Ответить) (Thread)
[User Picture]From: baramin
2012-12-06 01:35 pm
Классно написано! Под впечатлением изваял проект "солнечная система за 3 минуты":
http://jsfiddle.net/baramin/5zuvW/9/
(Ответить) (Thread)
[User Picture]From: roadkiyo
2014-01-06 11:50 am

:)

Вполне, плохая новость
(Ответить) (Thread)