avva: (moose)
[personal profile] avva
Эта запись может быть интересна программистам и сочувствующим.

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

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

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

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

Date: 2012-12-03 01:06 pm (UTC)
From: [identity profile] rustler2000.livejournal.com
Неужеле грядет browser only minecraft?

Date: 2012-12-03 01:32 pm (UTC)
From: [identity profile] guamoka.livejournal.com
Парочка экранов спагетти кода, обильно посыпанные magic numbers. Что оно скажет вам об афинных преобразованиях, камере, матричном умножении, структурном программировании?

Date: 2012-12-03 01:55 pm (UTC)
From: [identity profile] shadow-ru.livejournal.com
It just works.

Date: 2012-12-03 03:15 pm (UTC)
From: [identity profile] meshko.livejournal.com
Ну так это же жанр такой. Без magic numbers далеко на яваскрипте не нарендеришь.

Date: 2012-12-03 05:23 pm (UTC)
From: [identity profile] avva.livejournal.com
Что-то вы преувеличиваете. Спагетти там нигде нет, код вполне разумно структурирован, а большинсво магических чисел - попросту шестнадцатеричные цвета. Конечно, если бы это была полноценная библиотека, было бы больше абстрагировано, но в целом - лаконичный, да, но понятный и разумный код.

Date: 2012-12-03 08:45 pm (UTC)
From: [identity profile] guamoka.livejournal.com
Вы вообще по ссылкам, которые привели, пробежались глазами?


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.


Код ужасен даже при беглом взгляде на него. Как человек и написал, это был чисто пруф-оф-концепт-дёрти-тест. Похоже, допиливался в ручном режиме, чтобы "тупо работало"

Date: 2012-12-03 10:18 pm (UTC)
From: [identity profile] avva.livejournal.com
Ссылку на эту цитату уже приводили ниже, и я там ответил.

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

1. В этом коде нет ничего ужасного.
2. В этом коде нет ничего от спагетти-кода. В качестве ликбеза: уясните себе, что такое спагетти-код.
3. В нем также, вопреки вашим утверждениям, почти нет магических чисел.
4. Он написан не так, как должна быть написана нормальная библиотека для 3D-движка, но он для этого и не предназначен.
5. Код читается легко, и для человека в теме в нем нет НИЧЕГО непонятного.
6. Поскольку он очень краток и его структура прозрачна, для человека не в теме, который хочет научиться делать такие вещи, он может служить отличным учебным пособием и мотиватором.

Date: 2012-12-03 10:29 pm (UTC)
From: [identity profile] guamoka.livejournal.com
1. Этот код ужасен. Это признал даже сам автор.
2. Для начала сами прочтите внимательнее определение "спагетии-кода". И хорошенько осмыслите. Если вы уловили только про форматирование или наличие оператора гото- то нет. Это не единственные и даже не главные определяющие спагетти кода.
3. К тому же вы не знаете, что такое меджик намберз.
4. Речь идет конкретно про этот код. Он не обязательно должен быть библиотекой, чтобы быть грамотно написан.
5. Похоже, вы еще более не в теме.
6. В нём множество хвостов и откровенных хаков. Для человека не в теме он вообще противопоказан. Отличным учебным пособием для человека послужат книжки по CG. А так же книги по написанию аккуратного кода.

Date: 2012-12-05 03:41 pm (UTC)
From: [identity profile] t-gra.livejournal.com
Что конкретно плохо в коде:
- Long Methods (С помощью Extract Method я бы раздербанил это на мелкие методы, дав каждому осмысленное имя - замена комментариев)
- Magic Numbers (их совсем не немного, а кое-где по три штуки в одной строке, шестнадцатиричные коды - это как раз нормально, так как повторений нет. Все эти 64, 96, 16*3, 9 и т.п. - что это всё такое? Имеет смысл вынести константы и дать им осмысленные имена, тогда код станет гораздо понятнее.)
- Не очень осмысленные имена переменных
- Битовая арифметика. Оно, может, и эффективно, но нечитабельно.

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

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

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

Date: 2012-12-06 03:48 pm (UTC)
From: [identity profile] avva.livejournal.com
Понимаю вашу точку зрения, но не согласен с ней почти по всем пунктам.

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

Есть существенная разница между кодом, который написан правильно с точки зрения будущей поддержки, изменения, тестирования, и кодом, который призван что-то продемонстрировать, чему-то научить, на что-то вдохновить. В первом случае все недостатки, о которых вы говорите, налицо; во втором они зачастую перестают быть недостатками, а наоборот помогают легкому чтению, пониманию главного принципа, схватыванию его с листа.

Date: 2012-12-03 01:38 pm (UTC)
From: [identity profile] captain-tylor.livejournal.com
Хотел спросить, почему так медленно, потом понял, что это не OpenGL...

Date: 2012-12-03 01:47 pm (UTC)
From: [identity profile] johnnywoo.livejournal.com
А вот сам Нотч этот код хорошим не считает :)
http://www.reddit.com/r/programming/comments/146v69/how_notch_procedurally_generates_minecraft/c7aelxz

Date: 2012-12-03 05:24 pm (UTC)
From: [identity profile] avva.livejournal.com
Ну он же пишет там, что код выглядит так потому, что был написан специально покороче. И это заметно. Но в этом есть своя польза, потому что за десять минут можно его весь прочитать и понять.

Date: 2012-12-03 03:34 pm (UTC)
From: [identity profile] asox.livejournal.com
Ну, с одной стороны - используемые библиотеки иммеют гораздо больший размер - а с другой игры в "4k demo" известны тоже давно.
Но забавно, канэшна.
Wolfenstein 3d в браузере. ))

Date: 2012-12-03 05:22 pm (UTC)
From: [identity profile] avva.livejournal.com
Тут полезно не то, что малый размер, а то, что малый размер *и* понятный код. Что о 4k-демках не скажешь, конечно.

Date: 2012-12-03 03:56 pm (UTC)
From: [identity profile] bolk.livejournal.com
Кстати, стиль для IE лишний там, он не работает в IE9+, а версии ниже не поддерживают канвас.

Date: 2012-12-03 09:39 pm (UTC)
From: [identity profile] burrru.livejournal.com
Кунштюк классный, да. Особенно, ray-casting.

Date: 2012-12-06 01:35 pm (UTC)
From: [identity profile] baramin.livejournal.com
Классно написано! Под впечатлением изваял проект "солнечная система за 3 минуты":
http://jsfiddle.net/baramin/5zuvW/9/

:)

Date: 2014-01-06 11:50 am (UTC)
From: [identity profile] roadkiyo.livejournal.com
Вполне, плохая новость

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 05:04 am
Powered by Dreamwidth Studios