<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>highly professional scums</title>
	<atom:link href="http://blog.gamedeff.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.gamedeff.com</link>
	<description>the place where select game development veterans rant about life, universe, and everything</description>
	<pubDate>Thu, 17 May 2012 07:17:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ClosedCircles - Discovery story</title>
		<link>http://blog.gamedeff.com/?p=442</link>
		<comments>http://blog.gamedeff.com/?p=442#comments</comments>
		<pubDate>Thu, 17 May 2012 06:25:44 +0000</pubDate>
		<dc:creator>CEMEH</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[closedcircles]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=442</guid>
		<description><![CDATA[Предыдущие части:
ClosedCircles - #gamedeff going social
ClosedCircles - How coversations work
Как понятно из предыдущих серий, ClosedCircles формируют очень закрытые коммьюнити. Действительно, если вы не добавили человека в свой список - вы никогда не увидите, что он пишет по определению. Спрашивается - как же в такой системе люди вообще узнают друг о друге?
Есть несколько способов:
Friend List
Можно тыкнуть [...]]]></description>
			<content:encoded><![CDATA[<p>Предыдущие части:</p>
<p><a href="http://blog.gamedeff.com/?p=386">ClosedCircles - #gamedeff going social</a><br />
<a href="http://blog.gamedeff.com/?p=419">ClosedCircles - How coversations work</a></p>
<p>Как понятно из предыдущих серий, ClosedCircles формируют очень закрытые коммьюнити. Действительно, если вы не добавили человека в свой список - вы никогда не увидите, что он пишет по определению. Спрашивается - как же в такой системе люди вообще узнают друг о друге?</p>
<p>Есть несколько способов:</p>
<p><strong>Friend List</strong></p>
<p>Можно тыкнуть на Friend List и посмотреть, кто вообще еще есть на сервисе:<br />
<img src="http://i.imgur.com/dnoSr.png" alt="" /></p>
<p>В Friends of Friends много народу, добавляйте тех, кого знаете. Линк в имени ведет на Facebook/G+ profile, в будущем мы добавим ЖЖ, Твиттеры итд.<br />
<img src="http://i.imgur.com/VSPAk.png" alt="" /></p>
<p><strong>Intro threads</strong></p>
<p>Существуют специальные интро-треды, чтобы знакомить людей друг с другом. Ответы на сообщения в этих тредах увидят не только ваши контакты, а вообще все кто есть в этом треде. Соответственно, внутри таких тредов можно видеть сообщения других людей и с ними общаться. Вот как это может выглядеть:</p>
<p><img src="http://i.imgur.com/lHnvO.png" alt="" /></p>
<p>Если ответить на любое их этих сообщений (как обычно, тыкнув на него мышкой), то ответ увидят все 250 с лишним человек в этом треде. Кстати, я периодически устраиваю такие интро-треды на всех, чтобы новые люди про себя рассказали. Тусовка живая, часто бывают интересные продолжения.<br />
Если тыкнуть на незнакомого человека в интро-треде, в контакт-листе справа появится возможность его добавить.</p>
<p>Кроме представлений, интро-треды можно использовать многими разными способами - я, например, транслировал в реалтайме доклады с GDC. Надо попробовать лекцию устроить - есть еще идеи?</p>
<p>Интро-треды может делать каждый -  надо тыкнуть на кнопку New Intro (над edit box) и выбрать, кто в нем будет учавствовать, галочками в контакт-листе.</p>
<p><strong>Постить интересные дискуссии</strong></p>
<p>Мой настоящий мега-план про discovery - это постить интересные дискуссии. В будущем мы сделаем какую-то автоматическую систему, которая спросит у всех участников что можно постить, а что нельзя, а пока я буду вручную спрашивать и постить что можно время от времени. Следите за апдейтами!</p>
<p><strong>О важном</strong></p>
<p>Напоследок, самое главное - ClosedCircles создан прежде всего чтобы комфортно общаться с людьми, о которых что-то знаешь, а не чтобы гнаться за количеством френдов и добавлять всех подряд.<br />
Более того, чтобы писать и общаться, а не пассивно читать, что пишут другие. Функция пассивного чтения уже и так хорошо выполняется твиттером, ЖЖ и прочим социальным добром. </p>
<p>Посему - даже с такими слабыми механизмами discovery, добавляйте осторожно.<br />
&#8220;Скажи мне, кто твой друг, и я скажу тебе, кто ты&#8221;</p>
<p>Линки чтобы попробовать это все на себе - <a href="http://closedcircles.com/?invite=5283f620e93090c04650f50c58b225799b6d0755">#gamedeff</a>, <a href="http://closedcircles.com/?invite=40830ab442b74e72f4f8dd795829490ef04a599e">#programming</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=442</wfw:commentRss>
		</item>
		<item>
		<title>ClosedCircles - How conversations work</title>
		<link>http://blog.gamedeff.com/?p=419</link>
		<comments>http://blog.gamedeff.com/?p=419#comments</comments>
		<pubDate>Thu, 10 May 2012 08:17:16 +0000</pubDate>
		<dc:creator>CEMEH</dc:creator>
		
		<category><![CDATA[closedcircles]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=419</guid>
		<description><![CDATA[После первого поста о ClosedCircles зарегистрировалось около 260 человек, поэтому все прошлые дни народ знакомился и разбирался с концептом. Пока сложно сказать, сколько из них активных или постоянных, будем смотреть. Добавилось много очень интересных людей отовсюду (были из Jetbrains, Naughty Dog, Gaijin, Creative Assembly, Mail.Ru итд итп). Запостить ли, кстати, интересные куски интродакшенов?
В целом, все [...]]]></description>
			<content:encoded><![CDATA[<p>После <a href="http://blog.gamedeff.com/?p=386">первого поста о ClosedCircles</a> зарегистрировалось около 260 человек, поэтому все прошлые дни народ знакомился и разбирался с концептом. Пока сложно сказать, сколько из них активных или постоянных, будем смотреть. Добавилось много очень интересных людей отовсюду (были из Jetbrains, Naughty Dog, Gaijin, Creative Assembly, Mail.Ru итд итп). Запостить ли, кстати, интересные куски интродакшенов?</p>
<p>В целом, все проходит более гладко чем я ожидал. ClosedCircles - новый медиум общения, который поначалу рвет башку, но к нему привыкаешь. </p>
<p><strong>Давайте я опишу самое базовое.</strong></p>
<p>Итак, <a href="http://blog.gamedeff.com/?p=386">как говорилось раньше</a>, у каждого свой список людей в каждом топике, и кажому гарантируется что то, что он пишет - могут видеть только люди из его списка. Спрашивается, как это вообще работает? Ведь если просто взять групчат и прикрутить к нему фильтр по авторам сообщений, будут видны обрывки разговоров людей в твоем списке c людьми вне твоего списка! Причем они этого понимать не будут, у них же свой список! ААААААА!!</p>
<p>Наше решение - пользователь должен указывать, на какое сообщение отвечает. В этом случае можно отсекать нежелательные ветки разговора, чтобы у каждого была непротиворечивая картина мира.</p>
<p><strong>Смотрите, как это работает.</strong></p>
<p>Предположим, у нас есть пользователи Барбара, Шэрон и Джен. Шэрон очень социальна и дружит со всеми, а Барбара и Джен друг друга не знают (real life story). Вот как выглядят их &#8220;социальные круги&#8221;:</p>
<p><img src="http://i.imgur.com/uUyJ6.png" title="Finally I got to use circles in a sentence!" /></p>
<p>Дженнифер нажимает кнопку &#8220;New Thread&#8221; и пишет сообщение, его видят все ее контакты:</p>
<p><img src="http://i.imgur.com/ttBJz.png" title="Who would imagine" /></p>
<p>Шэрон отвечает на это сообщение - для этого она тыкает на сообщение мышкой (сообщение подсвечивается синим) и потом вводит ответ. Видите там &#8220;reply @Jennifer&#8221;?<br />
Этот ответ видит пересечение контактов Шэрон и Джен, то есть не видит Барбара, хотя они с Шэрон и друзья:</p>
<p><img src="http://i.imgur.com/PEUAu.png" title="Sharon is such a hipster" /></p>
<p>Это очень важный момент. Из-за того, что Шэрон выбрала ответ, ее сообщение не увидела Барбара, которая у нее в списке. Если бы Шэрон ошиблась и не тыкнула на сообщение Джен, ее ответ увидела бы и Барбара и ничего не поняла - причем тут node? Поэтому выбирать ответы надо обязательно. К счастью, привыкаешь быстро.</p>
<p>То есть, многие ветки обсуждений могут быть не видны в угоду приватности. У этой концепции есть свои недостатки, но для приватных обсуждений это скорее работает, чем нет.</p>
<p>Последнее, что стоит упомянуть - что можно написать новое сообщение сразу какому-то пользователю, без ответа на другое. Для этого нужно тыкнуть на имя пользователя в списке контактов. Вот например Барбара пишет Шэрон. Разумеется, это увидит пересечение их контактов:</p>
<p><img src="http://i.imgur.com/DJugI.png" title="Bazinga!"/></p>
<p>Это, на самом деле, не такой новый концепт. Почти так в Твиттере - в своей ленте ты видишь только ответы тех кого ты фолловишь к тем, кого ты фолловишь. И это крайне необходимая часть Твиттера, без нее он бы не работал.</p>
<p><strong>Bottomline</strong></p>
<p>К счастью, про все эти круги, пересечения и кто что видит - думать не надо. Есть всего два правила:<br />
- Выбирай, на какое сообщение отвечаешь<br />
- Добавляй только тех, кому доверяешь видеть все, что ты пишешь в этом канале  </p>
<p><strong>Треды, треды, треды</strong></p>
<p>Кроме приватности, необходимость ответов структурирует чат удивительно полезным образом:<br />
- Дискуссия сама по себе разбивается на треды, которые удобно читать отдельно, особенно когда скопилось 100+ сообщений (дабл-клик на сообщение покажет только его тред).<br />
- Можно вменяемо вести несколько дискуссий, переключая треды<br />
- Почти никогда не надо уточнять, к чему относился короткий ответ &#8220;да&#8221; или &#8220;нет&#8221;<br />
- Нотификации становятся умнее - оно знает, что отвечают тебе, это куда лучше нотификаций в Skype и IRC.<br />
- Hidden bonus: тыкните на разделитель слева, где написано threads</p>
<p>И там еще масса интересных следствий, stay tuned!</p>
<p>Линки чтобы попробовать это все на себе - <a href="http://closedcircles.com/?invite=5283f620e93090c04650f50c58b225799b6d0755">#gamedeff</a>, <a href="http://closedcircles.com/?invite=40830ab442b74e72f4f8dd795829490ef04a599e">#programming</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=419</wfw:commentRss>
		</item>
		<item>
		<title>ClosedCircles - #gamedeff going social</title>
		<link>http://blog.gamedeff.com/?p=386</link>
		<comments>http://blog.gamedeff.com/?p=386#comments</comments>
		<pubDate>Thu, 03 May 2012 01:53:23 +0000</pubDate>
		<dc:creator>CEMEH</dc:creator>
		
		<category><![CDATA[closedcircles]]></category>

		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=386</guid>
		<description><![CDATA[У нас случается следующий виток эволюции gamedeff-тусовки - как нынче модно, с уклоном в social.
Чтобы было понятней, давайте я вкратце расскажу с чего все начиналось.
Как запечатлено в немногословной, но яркой хронике, gamedeff появился в 2004 году (страшно подумать, 8 лет скоро) после того, как на IRC-канале #gamedev сайта gamedev.ru стало слишком много шума.
Доступ был исключительно [...]]]></description>
			<content:encoded><![CDATA[<p>У нас случается следующий виток эволюции gamedeff-тусовки - как нынче модно, с уклоном в social.</p>
<p><strong>Чтобы было понятней, давайте я вкратце расскажу с чего все начиналось.</strong></p>
<p>Как запечатлено в немногословной, но яркой <a href="http://gamedeff.com">хронике</a>, gamedeff появился в 2004 году (страшно подумать, 8 лет скоро) после того, как на IRC-канале #gamedev сайта <a href="http://www.gamedev.ru/">gamedev.ru</a> стало слишком много шума.</p>
<p>Доступ был исключительно закрытым, новые люди исключительно по приглашениям и рекомендациям, жило это все на приватном IRC-канале #gamedeff. Оказалось, что это совершенно офигенный формат общения, народ стал подтягивать вменяемых знакомых и логи #ff читались до утренней почты и ЖЖ-ленты.</p>
<p>В 2007 году мы стали писать <a href="http://blog.gamedeff.com">http://blog.gamedeff.com</a> и достаточно активно писали до 2011.</p>
<p>В разное время размер тусовки менялся от, наверное, человек 7 до 30, с несколькими закатами и рассветами.</p>
<p>Главные мои наблюдения за 8 лет такие - во-первых, закрытая тусовка дружбанов это бесконечно круто, потому что это очень продуктивный метод общаться в онлайне, и, во-вторых, что поддерживать ее живой требует много усилий.</p>
<p><strong>Итак, мега-тезис!</strong></p>
<p>Уютные тусовки распадаются по двум (!) причинам:<br />
    	* Слишком много новых людей<br />
        * Слишком мало новых людей</p>
<p>Это должно быть в общем-то очевидно, но на всякий случай подробнее.</p>
<p>Если новых людей слишком мало, то через некоторое время людей будет становиться все меньше и меньше - иногда кто-то откалывается по объективным причинам: смене интересов или деятельности, переезду, итд. На масштабах нескольких лет из тусовки останется только два-три человека, которые бы и так общались. Это то, как теряются друзья детства и студенчества.</p>
<p>А если новых людей слишком много, то скоро народ почувствует &#8220;кто все эти люди???&#8221; и общение, к которому они привыкли, потеряется в потоке остального. Тусовка вполне может выжить, но уже с другими людьми. Это то, как становятся популярными любые ресурсы и то, почему вы на них ходите меньше и с тоской вспоминаете про былые дни.</p>
<p>И с этой динамикой очень сложно что-то сделать, будь то Facebook group, LJ community, Skype group chat или IRC channel. Хуже того, чем больше народу - тем сложнее балансировать, что ограничивает размер коммьюнити.</p>
<p><strong>И вот под благодатным Калифорнийским солнцем появилась идея.</strong></p>
<p>Представьте себе групчатик, в котором список участников - у каждого свой. Разделенный на каналы, примерно как в IRC, но на каждом канале каждый добавляют людей сам.</p>
<p>Вот как, например, выглядит мой контакт-лист и <a href="http://all.scan3d.ru/">Лехи Власова</a>:<br />
<a href="http://i.imgur.com/rUKmF.png" target="blank"><img src="http://i.imgur.com/rUKmFl.png" title="Contact List" alt="" /></a></p>
<p>Как видно, контакт-листы пересекаются, но не одинаковы.  Каждому гарантируется, что то, что он пишет, могут увидеть только те, кого он сам добавил в свой список. И так - для каждого участника.</p>
<p>Смотрите, как такое может решить обе проблемы.  Наплывом большого количества народу такую тусовку убить очень сложно - то, что кто-то добавил много народу, лично для меня не меняет ничего: он там с ними общается, но ни я, ни они меня не добавили, поэтому меня никто не флудит.  С другой стороны, мне кого-то пригласить и добавить гораздо проще - не надо думать, впишется человек в тусовку или нет. Кому новый человек понравится - добавит, кому не понравится - нет.</p>
<p>Предвосхищая вопросы - в такой модели все интересно, это аццкая смесь G+, Twitter и IRC, я буду потихоньку ее описывать.</p>
<p>И главная прелесть концепта в том, что всей тусовке не надо быть закрытой, каждый выбирает степень уютности сам. Посему - кому интересно попробовать и пообщаться с нами, присоединяйтесь!</p>
<p>Это канальчик про разработку игр:<br />
<a href="http://closedcircles.com/?invite=5283f620e93090c04650f50c58b225799b6d0755">http://closedcircles.com/?invite=5283f620e93090c04650f50c58b225799b6d0755</a><br />
Это про программирование вообще:<br />
<a href="http://closedcircles.com/?invite=40830ab442b74e72f4f8dd795829490ef04a599e">http://closedcircles.com/?invite=40830ab442b74e72f4f8dd795829490ef04a599e</a><br />
Логиниться лучше через Фейсбук, чтобы оттуда сразу добавились контакты. Не беспокойтесь, Фейсбук только для логина, мы никогда ничего туда не постим.</p>
<p>Имейте ввиду, все в режиме раннего прототипа, поэтому подразумевается терпение и, что называется, early adopter mindset.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=386</wfw:commentRss>
		</item>
		<item>
		<title>Yappy!</title>
		<link>http://blog.gamedeff.com/?p=371</link>
		<comments>http://blog.gamedeff.com/?p=371#comments</comments>
		<pubDate>Mon, 04 Apr 2011 12:36:43 +0000</pubDate>
		<dc:creator>IronPeter</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=371</guid>
		<description><![CDATA[Компания google выложила библиотечку компрессии snappy http://code.google.com/p/snappy/. Библиотечка сжимает и разжимает со скоростью работы  SSD дисков, правда коэффициент компрессии не фонтан, хуже gzip. Но с дурацкими lzo, quicklz и прочей шушерой вполне сравнима.
Сразу захотелось поглядеть внутрь, что там. Внутри вариации на тему lz, 70 годы прошлого века.  Отсюда  поинт - вечное не тухнет. Что такое lz? [...]]]></description>
			<content:encoded><![CDATA[<p>Компания google выложила библиотечку компрессии snappy <a href="http://code.google.com/p/snappy/">http://code.google.com/p/snappy/</a>. Библиотечка сжимает и разжимает со скоростью работы  SSD дисков, правда коэффициент компрессии не фонтан, хуже gzip. Но с дурацкими lzo, quicklz и прочей шушерой вполне сравнима.</p>
<p>Сразу захотелось поглядеть внутрь, что там. Внутри вариации на тему lz, 70 годы прошлого века.  Отсюда  поинт - вечное не тухнет. Что такое lz? Это две команды. Первая команда &#8220;прочитай N байт из потока и положи в буфер распаковки&#8221;, вторая команда &#8220;прочитай из буфера распаковки по смещению OFFSET от текущей позиции MATCH байт и опять положи в буфер распаковки&#8221;.</p>
<p>Компрессор snappy так и жмет примерно.  Он умеет кодировать OFFSET с помощью 1, 2 или 4 байт.</p>
<p>Сразу захотелось написать свое. Выходные, все такое. Решил, что мой код будет еще проще. Буду кодировать OFFSET с помощью 1 байта, всегда. А методу распаковки выдам лимит в 32 строчки С++ кода.</p>
<p>Родилось вот такое: <a href="http://www.everfall.com/paste/id.php?o3ug124i2l7p">http://www.everfall.com/paste/id.php?o3ug124i2l7p</a> . Назовем его yappy.</p>
<p>Код распаковки там со строчки 14 по 45. Кроме распаковки там нет ничего интересного. Разве что эвристика, как выбираются 224 разных значения пар [OFFSET / 256: MATCH].</p>
<p>Сразу захотелось измерить пипиську творению.</p>
<p>Возьмем тестовые данные от snappy,  положим их без компрессии в tar архив, сожмем.</p>
<p><strong>SNAPPY: [b 4096K] bytes 4638720 -&gt; 2165687 46.7%  comp 214.9 MB/s  uncomp 683.6 MB/s</strong></p>
<p><strong>SNAPPY: [b 4K] bytes 4638720 -&gt; 2445428 52.7%  comp 226.9 MB/s  uncomp 681.2 MB/s</strong></p>
<p>За буковкой b идет размер блока в килобайтах. А теперь сожмем yappy:</p>
<p><strong>YAPPY: [b 4096K] bytes 4638720 -&gt; 2021663  43.6%  comp  49.2 MB/s  uncomp 1432.3 MB/s</strong></p>
<p><strong>YAPPY: [b 4K] bytes 4638720 -&gt; 2268955  48.9%  comp  49.2 MB/s  uncomp 1476.1 MB/s</strong></p>
<p>Видно две вещи. Вещь первая - что google выложил неудачные тестовые данные. Они слишком короткие, чтобы snappy со своими смещениями в 2 и 4 байта мог развернуться. Очевидно, что на больших продакшн данных все должно сжиматься лучше. Вещь вторая, что программисты google кабаны, они сделали чертовски быструю компрессию.  Собственно, ради чего все и затевалось - чтобы быть всюду быстрее сети и диска.</p>
<p>А теперь&#8230; Возьмем одну из компонент продакшн индекса в Яндексе. Она блочная, блоки по 4k. Готовится оффлайн, время компрессии нас не очень волнует.</p>
<p>Сожмем snappy и yappy.</p>
<p><strong>SNAPPY: [b 4K] bytes 1328385387 -&gt; 750585721 56.5%  comp 182.2 MB/s  uncomp 623.4 MB/s</strong></p>
<p><strong>YAPPY: [b 4K] bytes 1328385387 -&gt; 686910077  51.7%  comp  48.5 MB/s  uncomp 1399.8 MB/s</strong></p>
<p>Отсюда  мораль. Тырьте хорошие идеи, тырьте у грандов. И, вдруг, получите немножко технического экселенса, который приятен.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=371</wfw:commentRss>
		</item>
		<item>
		<title>Software Occlusion Culling</title>
		<link>http://blog.gamedeff.com/?p=364</link>
		<comments>http://blog.gamedeff.com/?p=364#comments</comments>
		<pubDate>Wed, 02 Mar 2011 19:33:55 +0000</pubDate>
		<dc:creator>kas</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=364</guid>
		<description><![CDATA[Оклюжен кулинга сейчас наверное нету только у ленивых. Некоторые используют HW OC, у которых есть очевидные недостатки в виде латентностии какой никакой нагрузки на гпу. Другие используют софтовую растеризацию. К примеру, мы можем растеризовать глубину близлежащих оклюдеров ( специальной или прямо рендер геометрии ), затем проверять баунд боксы отрисовываемых объектов относительно этой глубины. Радостей от [...]]]></description>
			<content:encoded><![CDATA[<p>Оклюжен кулинга сейчас наверное нету только у ленивых. Некоторые используют HW OC, у которых есть очевидные недостатки в виде латентностии какой никакой нагрузки на гпу. Другие используют софтовую растеризацию. К примеру, мы можем растеризовать глубину близлежащих оклюдеров ( специальной или прямо рендер геометрии ), затем проверять баунд боксы отрисовываемых объектов относительно этой глубины. Радостей от такого подхода может быть несколько. Во-первых, мы может рисовать это всё в уменьшенном разрешении. Во-вторых, такая отрисовка достаточно легко паралелится на несколько потоков, что в наше время непрерывного увеличения числа ядер у цпу является приятным бонусом. Для растеризации есть два основных алгоритма - сканлайны и халфспейсы. При использовании сканлайнов мы просто рисуем горизонтальные линии межде ребрами треугольника. При использовании халфспейсов - строим вьюпорт спейс баунд рект треугольника, итерируемся по всем пикселям которые в нём, и, если пиксель внутри треугольника то рисуем его. Но в целом нам достаточно определить сам факт того, скрыта ли тестируемая геометрия оклюдерами или нет.</p>
<p align="center"><a href="http://2.bp.blogspot.com/-ATVPZjYwwbE/TWztYJ3n5GI/AAAAAAAAC7M/D7zk8CBypVY/s1600/softwareoccluder.png"><img style="WIDTH: 400px; HEIGHT: 294px; CURSOR: hand" border="0" alt="" src="http://2.bp.blogspot.com/-ATVPZjYwwbE/TWztYJ3n5GI/AAAAAAAAC7M/D7zk8CBypVY/s400/softwareoccluder.png" /></a></p>
<p><a href="http://blog.gamedeff.com/forum/view.html?id=38">Тут вот на форуме</a>, Петя предложил крутую технику оклюжен кулинга. Пересказывать принцип не буду, просто ещё раз напомню основные шаги алгоритма:</p>
<ol>
<li>Трансформировать треугольники в вьюпорт спейс</li>
<li> Определить границы тайлов</li>
<li> Распределить треугольнички по всем тайлам, которых они касаются</li>
<li> Отсортировать от ближних к дальних очереди треугольников каждоготайла (использую zmin для тест треугольников и zmax для треугольников оклюдеров)</li>
<li> Нарисовать отсортированные списки ( для тест треугольников проверяется виден ли какой либо пиксель его сканлайнов, для оклюдеров записываются битики сканлайнов в буфер тайла)</li>
</ol>
<p> Вообщемто базовую версию алгоритма не сложно реализовать и проверить самим. Моя текущая имплементация может рисовать 300к+ треугольников снапшота с игровой камеры Death Track примерно за 20мсек ( 12 мсек трансформаци + 8 мсек растеризация ) в 720п, что не плохо. И надо понимать что это однопоточная синхронная версия. Думаю, на архитектурах с большим числом регистров будет чуть лучше. Если прикрутить потоки - опять же думают станет ощутимо лучше. Очень органично ложится на концепцию Job Manager. Интересным также выглядит попытка автоматической генерации оклюдеров и тест геометрии. Респекты и уважухи Пете за крутую идею и обсуждение деталей реализации. </p>
<p> <a href="http://fatkas.blogspot.com/2011/02/software-occlusion-culling.html">А ещё опубликовал в своём секретном бложике</a></p>
<p><a href="http://2.bp.blogspot.com/-OWPG4E2Xkoo/TWzqsxCku4I/AAAAAAAAC7E/T21tVVfwM9I/s1600/unoccluded_wireframe.png"><img style="WIDTH: 337px; HEIGHT: 199px; CURSOR: hand" border="0" alt="" src="http://2.bp.blogspot.com/-OWPG4E2Xkoo/TWzqsxCku4I/AAAAAAAAC7E/T21tVVfwM9I/s400/unoccluded_wireframe.png" /></a> <a href="http://4.bp.blogspot.com/-zbVhEvFO4hA/TWzqs0kmRGI/AAAAAAAAC68/p2nT0THYLxo/s1600/unoccluded_solid.png"><img style="WIDTH: 328px; HEIGHT: 199px; CURSOR: hand" border="0" alt="" src="http://4.bp.blogspot.com/-zbVhEvFO4hA/TWzqs0kmRGI/AAAAAAAAC68/p2nT0THYLxo/s400/unoccluded_solid.png" /></a></p>
<p><a href="http://4.bp.blogspot.com/-QX-0t7YhTXA/TWzqsajsqrI/AAAAAAAAC60/IlW2HNYdE60/s1600/occluded_wireframe.png"><img style="WIDTH: 336px; HEIGHT: 203px; CURSOR: hand" border="0" alt="" src="http://4.bp.blogspot.com/-QX-0t7YhTXA/TWzqsajsqrI/AAAAAAAAC60/IlW2HNYdE60/s400/occluded_wireframe.png" /></a> <a href="http://4.bp.blogspot.com/-B_u6AAz6zfE/TWzqseGQbUI/AAAAAAAAC6s/KUV78XSdkqY/s1600/occluded_solid.png"><img style="WIDTH: 332px; HEIGHT: 203px; CURSOR: hand" border="0" alt="" src="http://4.bp.blogspot.com/-B_u6AAz6zfE/TWzqseGQbUI/AAAAAAAAC6s/KUV78XSdkqY/s400/occluded_solid.png" /></a></p>
<div>
<div></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=364</wfw:commentRss>
		</item>
		<item>
		<title>Три задачи с одним решением</title>
		<link>http://blog.gamedeff.com/?p=351</link>
		<comments>http://blog.gamedeff.com/?p=351#comments</comments>
		<pubDate>Thu, 25 Nov 2010 08:24:35 +0000</pubDate>
		<dc:creator>IronPeter</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=351</guid>
		<description><![CDATA[Есть три задачи. Задача первая - решить матричное уравнение A x = b, где A - матрица, x - неизвестный вектор, а b - заданная правая часть, опять вектор. Коэффициенты - действительные числа.
Во второй задаче коэффициенты (и у матрицы и у векторов) - целые числа.
А в третьей задаче все то же самое, только коэффициенты целые [...]]]></description>
			<content:encoded><![CDATA[<p>Есть три задачи. Задача первая - решить матричное уравнение A x = b, где A - матрица, x - неизвестный вектор, а b - заданная правая часть, опять вектор. Коэффициенты - действительные числа.</p>
<p>Во второй задаче коэффициенты (и у матрицы и у векторов) - целые числа.</p>
<p>А в третьей задаче все то же самое, только коэффициенты целые положительные, и уравнение надо  решить в целых положительных числах.</p>
<p>Накал пиздеца постепенно крепчает. Целые числа мы не всегда можем делить друг на друга. Впрочем, взяв пару чисел (a, b),  мы можем вычесть из большего по модулю числа меньшее по модулю, и такая процедура редукции нам отлично заменит деление.</p>
<p>А целые положительные числа мы можем вычитать, только меньшее из большего.</p>
<p>Однако, алгоритм Гаусса решения линейных систем уравнений работает во всех трех случаях (на то он и Гаусс).</p>
<p>Умные дядьки про третью задачу пишут страшное, примерно такое: http://documents.kenyon.edu/math/CWendler.pdf Это страшные люди,  разобраться в их алгебре практически невозможно.</p>
<p>Попытаюсь на пальцах.</p>
<p><span id="more-351"></span></p>
<p>Итак, хотим мы решить системку линейных уравнений в действительных числах. Берем какую-то 4&#215;4 матричку коэффициентов A, приписали справа единичную матрицу со знаком минус.</p>
<p>7.00     8.00     2.00     5.00    |-1.00     0.00     0.00     0.00<br />
3.00     3.00     9.00     8.00    | 0.00    -1.00     0.00     0.00<br />
2.00     9.00     8.00     9.00    | 0.00     0.00    -1.00     0.00<br />
1.00     7.00     3.00     3.00    | 0.00     0.00     0.00    -1.00</p>
<p>Получили 4 вектора длины 8, я разделяю их на две части знаком |, но это чисто визуализация, алгоритм работает с длинными векторами без всякого деления на половинки.</p>
<p>Упорядочим вектора в лексикографическом порядке и применим полную редукцию (алгоритм Гаусса - Бухбергера, назовем так этот процесс). Редукция вектора x по вектору y определяется просто - находим первый ненулевой коэффициент y_i и заменяем x на x - (x_y / y_i) * y. Убили x_i, молодцы, получили лексикографически меньший вектор. Будем редуцировать вектор из набора по всем остальным векторам, пока хоть что-то меняется. Для красоты я еще отнормирую вектора, чтобы первый ненулевой коэффициент был 1. Это мелочь.</p>
<p>Отредуцировали, получили вот такую красивую картинку:</p>
<p>1.00     0.00     0.00     0.00    |-0.13    -0.15     0.24    -0.09<br />
0.00     1.00     0.00     0.00    | 0.00     0.04     0.03    -0.20<br />
0.00     0.00     1.00     0.00    | 0.09    -0.32     0.39    -0.48<br />
0.00     0.00     0.00     1.00    |-0.06     0.28    -0.55     0.65</p>
<p>Слева стоит единичная матрица, справа - какая-то. Замечу, что мы могли взять неквадратную матрицу коэффициентов, могли взять вырожденную матрицу. В алгоритме ничего не поменялось бы.</p>
<p>Решим теперь уравнение A x = b. К вектору b припишем справа нули, и полученный вектор длины 8 редуцируем относительно полученного базиса.</p>
<p>560.00   1763.00  1887.00  1882.00 | 0.00     0.00     0.00     0.00</p>
<p>Вуаля!</p>
<p>0.00     0.00     0.00     0.00    | 1.00    -96.01   -94.00   -91.01</p>
<p>Слева у нас нули, справа - искомый вектор x, решение. Если бы редукция не удалась (b не лежало бы в образе A), то у нас слева были бы ненулевые числа. Такой прикольный алгоритм Гаусса для произвольных систем. Линейка, ВУЗ, первый курс.</p>
<p>Повторим процесс для целочисленных векторов, матрица такая же, как и для предыдущего варианта.</p>
<p>7     8     2     5 |   -1     0     0     0<br />
3     3     9     8 |    0    -1     0     0<br />
2     9     8     9 |    0     0    -1     0<br />
1     7     3     3 |    0     0     0    -1</p>
<p>Применяем редукцию Гаусса-Бухбергера&#8230; Стоп, а как редуцировать один целочисленный вектор относительно другого? Ответ. As simple as x - y или x + y. Находим как и раньше первый ненулевой элемент y_i и смотрим, можем ли мы операцией + или минус уменьшить абсолютное значение x_i (читай, уменьшить вектор относительно лексикографического порядка). Редуцируем систему векторов, пока можем, получаем:</p>
<p>1     0    -2   -23 |    1    -6    12   -14<br />
0    -1     1    19 |   -1     5   -10    12<br />
0     0    -3   -92 |    5   -25    49   -58<br />
0     0     0   209 |  -12    59  -114   135</p>
<p>Как и раньше, для решения уравнения A x = b берем b, приписываем к нему справа четверку нулей, редуцируем полученный вектор:</p>
<p>560  1763  1887  1882 |    0     0     0     0</p>
<p>относительно системы. Получаем&#8230; Шайтан, решение:</p>
<p>0     0     0     0 |   -1    96    94    91</p>
<p>Напомню, если слева у нас получились не нули (которые дальше не хотят редуцироваться ни одним из векторов системы), то пиздец - решения нету. Иначе читаем решение в правой части. Например, наша система не имеет решения для любых векторов b = (0, 0, 0, число не кратное 209). Теория чисел, хороший ВУЗ, третий курс.</p>
<p>Двигаемся дальше. Все то же уравнение A x = b, но в целых положительных числах. Что надо делать, мы уже знаем - нарисовать вот такую красоту надо:</p>
<p>7     8     2     5 |   -1     0     0     0<br />
3     3     9     8 |    0    -1     0     0<br />
2     9     8     9 |    0     0    -1     0<br />
1     7     3     3 |    0     0     0    -1</p>
<p>Редуцируем систему&#8230; Функция редукции x относительно y очень простая - определим для вектора v положительную часть v+, как поэлементную операцию  {max(v_i, 0)}. Скажем, что x можно редуцировать относительно y, если x+ поэлементно не меньше y+, а сама редукция равна в этом случае x - y. Редукция опять уменьшает вектор в лексикографическом смысле. Кроме этого она заебатая тем, что редукция от вектора с неотрицательными элементами снова неотрицательная. К сожалению, так просто все не работает. Редукции запрещают друг друга. Т.е. у нас есть выбор редуцировать вектор x с помощью вектора y или c помощью вектора z, каждый выбор в общем запрещает другую редукцию. Поэтому Бухбергер предложил очень простую вещь. Он сначала полностью редуцирует систему векторов друг относительно друга, а потом добавляет N^2 попарных разностей u - v. И действует так, пока базис не становится стабильным. Чудеса заключаются в том, что хоть число базисных векторов и растет (вообще говоря неконтролируемо), наш процесс останавливается. Добавление попарных разностей u - v гарантирует, что в процессе градиентного спуска мы не залезем в локальную яму.</p>
<p>Для данной системы результат выглядит как (осторожно, длинная простыня чисел):</p>
<p><a href="http://www.everfall.com/paste/id.php?1ydzx51iwu6v">http://www.everfall.com/paste/id.php?1ydzx51iwu6v</a></p>
<p>Хороший математический ВУЗ,  кандидатский минимум по алгебре, &#8220;алгоритм Бухбергера построения базиса Гребнера в идеале полиномов&#8221;.  Это он и есть. Я только аккуратно закамуфлировал в алгоритме полиномы, так что их почти не видно.</p>
<p>Решаем систему,  редуцируем вектор</p>
<p>560  1763  1887  1882 |    0     0     0     0</p>
<p>получаем (по свойству редукции опять вектор с неотрицательными компонентами):</p>
<p>0     0    21    17 |    0    94    93    92</p>
<p>В прошлой части мы получили решение  с одной отрицательной компонентой. А вот тут обломились. Нету положительных решений. А вот для правой части  b = (903  2155  1985  2127) находится решение x = (48    96    94    91). Если решений несколько, найдется лучшее с точки зрения лексикографического порядка.</p>
<p>Как маленький штришок, можно децл модифицировать алгоритм, и он будет искать не просто решение, а решение, где максимизируется целевая линейная функция. Т.е. вчистую решать задачи целочисленного линейного программирования. Надо всего лишь взять порядок не лексикографический, а чуть более другой. Но это в сторону.</p>
<p>Вот такая забавная математика. В ней нет сложных идей. Есть муторные доказательства, но идеи (алгоритмы) все чистые, простецкие. Плохой алгоритм - плохая математика.</p>
<p>сорцы:</p>
<p><a href="http://www.everfall.com/paste/id.php?rpf69siiusru">http://www.everfall.com/paste/id.php?rpf69siiusru</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=351</wfw:commentRss>
		</item>
		<item>
		<title>Из штатного расписания</title>
		<link>http://blog.gamedeff.com/?p=349</link>
		<comments>http://blog.gamedeff.com/?p=349#comments</comments>
		<pubDate>Mon, 15 Nov 2010 15:55:41 +0000</pubDate>
		<dc:creator>aruslan</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=349</guid>
		<description><![CDATA[&#8220;n-way ассоциативный продьюсер&#8221;
]]></description>
			<content:encoded><![CDATA[<p>&#8220;n-way ассоциативный продьюсер&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=349</wfw:commentRss>
		</item>
		<item>
		<title>это очень интересно, что там спрятано внутри</title>
		<link>http://blog.gamedeff.com/?p=342</link>
		<comments>http://blog.gamedeff.com/?p=342#comments</comments>
		<pubDate>Fri, 15 Oct 2010 00:07:19 +0000</pubDate>
		<dc:creator>look4awhile</dc:creator>
		
		<category><![CDATA[graphics]]></category>

		<category><![CDATA[life]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[problems]]></category>

		<category><![CDATA[ps3]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=342</guid>
		<description><![CDATA[тяжела доля моя консультантская

lock-dynamic-vertex-buffer
copy-data
unlock
draw
внутри там, очевидно, какой-то способ выделить кусок памяти. в который мы скопируем результаты, по unlock-у. теперь фокус (следите за руками). если есть allocate, значит где-то есть free. т-е теоретически когда тот, кто рисует, закончил рисовать - он и делает free.
очередной раз гляжу на код, который делает free 3 кадра спустя - просто [...]]]></description>
			<content:encoded><![CDATA[<p>тяжела доля моя консультантская<br />
<span id="more-342"></span><br />
lock-dynamic-vertex-buffer<br />
copy-data<br />
unlock<br />
draw</p>
<p>внутри там, очевидно, какой-то способ выделить кусок памяти. в который мы скопируем результаты, по unlock-у. теперь фокус (следите за руками). если есть allocate, значит где-то есть free. т-е теоретически когда тот, кто рисует, закончил рисовать - он и делает free.</p>
<p>очередной раз гляжу на код, который делает free 3 кадра спустя - просто потому, что никак иначе не может узнать, когда-же GPU закончил рисовать. ps3. 2010 год. я плакаю, рыдаю.</p>
<p>интересно, а доблестный DirectX тоже такую-же херню делает? на цифру 3 я теперь реагирую как бык на красную тряпку. хочу верить в человечество. буду переписывать.</p>
<p>при написании этого поста пока что никто не пострадал&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=342</wfw:commentRss>
		</item>
		<item>
		<title>И еще одна конференция</title>
		<link>http://blog.gamedeff.com/?p=337</link>
		<comments>http://blog.gamedeff.com/?p=337#comments</comments>
		<pubDate>Tue, 05 Oct 2010 09:56:39 +0000</pubDate>
		<dc:creator>IronPeter</dc:creator>
		
		<category><![CDATA[conf]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=337</guid>
		<description><![CDATA[Наш уважаемый shodan горячо зажег на devpoint.
А так как он скромный,  и линк сам не запостит, то придется самому:

http://devpoint.ru/video/f/devpoint2/46778_Andrey_Aksyonov_vtoroy_doklad.html
Так как по тексту упоминается 3D полигон, то вовсе не оффтопик.
Конечно, есть к докладчику замечания - щитаю, что много текста и мало картинок! Есть куда двигаться, чтобы было совсем заебок.
]]></description>
			<content:encoded><![CDATA[<p>Наш уважаемый shodan горячо зажег на devpoint.</p>
<p>А так как он скромный,  и линк сам не запостит, то придется самому:</p>
<p><object type="application/x-shockwave-flash" data="http://devpoint.ru/src/ext/uppod/player.swf" width="580" height="410"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="movie" value="http://devpoint.ru/src/ext/uppod/player.swf" /><param name="FlashVars" value="st=5pJc0IiBgxJQndvB59acgdR3g1wV07W8072h49wug1UQnpJHtznmg1MHM7wBgdhbtAPP&amp;file=5pJc0IiBgxMmZSacT9RhgdR3OjLVgxJQnjEagmABZIA3gm82ZokVZIA3OYEuZYE3gzMHMAPP" /></object></p>
<p><a href="http://devpoint.ru/video/f/devpoint2/46778_Andrey_Aksyonov_vtoroy_doklad.html">http://devpoint.ru/video/f/devpoint2/46778_Andrey_Aksyonov_vtoroy_doklad.html</a></p>
<p>Так как по тексту упоминается 3D полигон, то вовсе не оффтопик.</p>
<p>Конечно, есть к докладчику замечания - щитаю, что много текста и мало картинок! Есть куда двигаться, чтобы было совсем заебок.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=337</wfw:commentRss>
		</item>
		<item>
		<title>Технологическая конференция Яндекса</title>
		<link>http://blog.gamedeff.com/?p=334</link>
		<comments>http://blog.gamedeff.com/?p=334#comments</comments>
		<pubDate>Mon, 13 Sep 2010 10:38:03 +0000</pubDate>
		<dc:creator>IronPeter</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[conference]]></category>

		<guid isPermaLink="false">http://blog.gamedeff.com/?p=334</guid>
		<description><![CDATA[Вот: http://company.yandex.ru/public/yac/
Ваш покорный слуга выступает в качестве содокладчика Ильи Сегаловича (это технический директор Яндекса). О чем успею рассказать за 30 минут - не знаю. Хотелось бы чуть-чуть о поисковом теке рассказать. Приходите, регистрация свободная, вам наверняка будет занятно послушать про совсем другие, нежели в игроделании, технические проблемы.
Примерные слайды: &#8220;что дешевле, железка или мозги&#8221;, &#8220;сжать до меньше энтропии&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>Вот: http://company.yandex.ru/public/yac/</p>
<p>Ваш покорный слуга выступает в качестве содокладчика Ильи Сегаловича (это технический директор Яндекса). О чем успею рассказать за 30 минут - не знаю. Хотелось бы чуть-чуть о поисковом теке рассказать. Приходите, регистрация свободная, вам наверняка будет занятно послушать про совсем другие, нежели в игроделании, технические проблемы.</p>
<p>Примерные слайды: &#8220;что дешевле, железка или мозги&#8221;, &#8220;сжать до меньше энтропии&#8221;, &#8220;мегаэффективный нанопараллелизм&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamedeff.com/?feed=rss2&amp;p=334</wfw:commentRss>
		</item>
	</channel>
</rss>

