<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3794490644205959426</id><updated>2012-01-05T18:52:37.055+04:00</updated><category term='vsync'/><category term='msdn subscriptions'/><category term='caustic'/><category term='Microsoft'/><category term='xnadev.ru'/><category term='XnaDevRuEngine'/><category term='effect'/><category term='кри'/><category term='MVP'/><category term='xna'/><category term='instancing'/><category term='game'/><category term='dreamspark'/><category term='bizspark'/><category term='Garbage Collector'/><category term='GUI'/><category term='c#'/><category term='Windows Phone 7'/><category term='MSDN'/><category term='Games'/><category term='water'/><category term='Jeffrey Richter'/><category term='GBW'/><category term='RSDN'/><category term='gEngine'/><category term='animation'/><category term='fps'/><category term='video'/><category term='windows'/><category term='calculation'/><category term='article'/><category term='Humor'/><category term='model'/><category term='Forms'/><category term='landscape'/><category term='Intel'/><category term='technet subscriptions'/><title type='text'>Dmitry Timofeev</title><subtitle type='html'>dotNet, C#, XNA, Windows Phone 7</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-7644640453279918235</id><published>2011-10-15T16:04:00.003+04:00</published><updated>2011-10-15T22:12:07.328+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>"GB&amp;W Lite" [wp7][game][release]</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Выпустил лайт версию игры GB&amp;amp;W.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QkYrMNQUaMg/TplzzZILO9I/AAAAAAAAAGc/UkCN4RuuaMc/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-QkYrMNQUaMg/TplzzZILO9I/AAAAAAAAAGc/UkCN4RuuaMc/s320/0.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Вот видео с мастер классом по прохождению 19го уровня:&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/kWtSphWZeQk?hd=1" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;игру можно найти тут:&amp;nbsp;&lt;br /&gt;&lt;div class="XnaCgp_shell_background" id="xnaCgpShellBackground"&gt;&lt;div class="XnaCgp_shell_body_shadow" id="xnaCgpShellBodyShadow"&gt;&lt;div class="XnaCgp_shell_body" id="xnaCgpShellBody"&gt;&lt;div id="appDContentContainer"&gt;&lt;div&gt;&lt;div id="appDContentId"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div id="MetadataInstanceId"&gt;&lt;div class="appDMetadataInstanceColumnsNoMargin"&gt;&lt;div class="appDMetadataColRight"&gt;&lt;div&gt;&lt;div class="appDMetadataProperty"&gt;&lt;span class="styleC"&gt;&lt;a href="http://windowsphone.com/s?appid=127a61e4-a6a9-4c0a-b4e4-b1469856d22b"&gt;http://windowsphone.com/s?appid=127a61e4-a6a9-4c0a-b4e4-b1469856d22b&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Как видите есть ряд изменений в оформлении, они коснулись и полной версии приложения для которого вышло соответствующее обновление.&lt;br /&gt;&lt;br /&gt;Оказалось, при первой публикации лайт версии,GB&amp;amp;W занимает в памяти более 90 МБ (на сколько не скажу). Очень много анимированной растровой рафики. Лайт версию пришлось немного порезать. Получается для GB&amp;amp;W мне в свое время сделали скидку :).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-7644640453279918235?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/7644640453279918235/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/10/gb-lite.html#comment-form' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7644640453279918235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7644640453279918235'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/10/gb-lite.html' title='&quot;GB&amp;W Lite&quot; [wp7][game][release]'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-QkYrMNQUaMg/TplzzZILO9I/AAAAAAAAAGc/UkCN4RuuaMc/s72-c/0.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8342491429771696024</id><published>2011-07-13T21:33:00.007+04:00</published><updated>2011-07-13T22:30:47.473+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Компромисс в выборе между классом и структурой</title><content type='html'>На тему навела вот эта статья &lt;a href="http://www.calabonga.com/Blog/ViewPost.aspx?id=93"&gt;"NET 4.0: Class vs Struct или в чём различия между Классом и Структурой"&lt;/a&gt; . Давно уже собирался собрать для себя набор иерархии универсальных коллекций, которые не попадают под сборку мусора. Тема в очередной раз стала интересна после моего известного эксперимента с Windows Phone 7. Очень сомневаюсь, что моя статья будет полезна для бизнес-приложений.&amp;nbsp; Меня больше интересует данная тема для использования в XNA/DirectX и как область применения - игры. &lt;br /&gt;&lt;br /&gt;Приглашаю вас обсудить данный вопрос.&lt;br /&gt;&lt;br /&gt;И так, условия задачи:&lt;br /&gt;- Нужна коллекция элементов для описания, например, системы частиц (это может быть все что угодно). Такая штука в которой в среднем 60 раз в секунду добавляются и удаляются сотни элементов.&lt;br /&gt;- Изменения в коллекции не должны влиять на сборку мусора.&lt;br /&gt;- Нельзя использовать структуры! Только ссылочные типы.&lt;br /&gt;- Запрещено создавать и удалять классы, за исключением первой инициализации.&lt;br /&gt;- Физическое количество элементов в коллекции должно быть постоянным. Т.к. изменение длинны массива достаточно накладная операция, а количество элементов должно постоянно плавать, то подойдет подобие кеша. Ограничение - разработчику желательно четко знать максимально возможное количество элементов в такой коллекции. А это значит игра должна быть грамотно спроектирована. Хотя лазейку я оставлю.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Набросал вот такой черновик.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Базовый класс для элемента коллекции:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TElementConstLength&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; indexInCollection = -1;&lt;br /&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; IndexInCollection { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; indexInCollection; } }&lt;br /&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetIndexInCollection(&lt;span class="kwrd"&gt;int&lt;/span&gt; i)&lt;br /&gt;        {&lt;br /&gt;            indexInCollection = i;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Базовый класс для коллекции:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TCollectionConstLength&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : TElementConstLength, &lt;span class="kwrd"&gt;new&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; T[] elements;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; count = 0;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Количество живых элементов&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; Count { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; count; } }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; end = -1;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Инициализация колекции&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="length"&amp;gt;Длинна коллекции&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; TCollectionConstLength(&lt;span class="kwrd"&gt;int&lt;/span&gt; length)&lt;br /&gt;        {&lt;br /&gt;            elements = &lt;span class="kwrd"&gt;new&lt;/span&gt; T[length];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Доступ к элементу по индексу&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="index"&amp;gt;Индекс&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Элемент&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; T &lt;span class="kwrd"&gt;this&lt;/span&gt;[&lt;span class="kwrd"&gt;int&lt;/span&gt; index]&lt;br /&gt;        {&lt;br /&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; elements[index]; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Выделение места под новый элемент&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Новый элемент&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; T GetNew() &lt;span class="rem"&gt;// = Add&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="rem"&gt;// если список полон, для режима отладки&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(end == elements.Length - 1)&lt;br /&gt;                Array.Resize(&lt;span class="kwrd"&gt;ref&lt;/span&gt; elements, elements.Length + 1);&lt;br /&gt;            &lt;span class="rem"&gt;// &lt;/span&gt;&lt;br /&gt;            end++;&lt;br /&gt;            count++;&lt;br /&gt;            &lt;span class="rem"&gt;// если не инициализирован элемент&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(elements[end] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                elements[end] = &lt;span class="kwrd"&gt;new&lt;/span&gt; T();&lt;br /&gt;                elements[end].SetIndexInCollection(end);&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; elements[end];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Очистка списка&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Clear()&lt;br /&gt;        {&lt;br /&gt;            end = -1;&lt;br /&gt;            count = 0;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Удаление элемента по индексу&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="index"&amp;gt;Индекс&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(&lt;span class="kwrd"&gt;int&lt;/span&gt; index)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="rem"&gt;// выход за пределы&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(index &amp;lt; 0 || index &amp;gt; end)&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(index &amp;lt; end)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="rem"&gt;// рокировка элементов&lt;/span&gt;&lt;br /&gt;                T temp = elements[end];&lt;br /&gt;                elements[end] = elements[index];&lt;br /&gt;                elements[index] = temp;&lt;br /&gt;                &lt;span class="rem"&gt;// рокировка индексов&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;int&lt;/span&gt; i = elements[end].IndexInCollection;&lt;br /&gt;                elements[end].SetIndexInCollection(elements[index].IndexInCollection);&lt;br /&gt;                elements[index].SetIndexInCollection(i);&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="rem"&gt;// уменьшаем список&lt;/span&gt;&lt;br /&gt;            end--;&lt;br /&gt;            count--;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Удаление элемента&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="e"&amp;gt;Элемент&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(T e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="rem"&gt;// проверка на соответствие ссылок (защита от тупости)&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(e != elements[e.IndexInCollection])&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;            Remove(e.IndexInCollection);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;Вот пример для тестов:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; CollectionConstLength&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ElementTest : TElementConstLength&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; name;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; name; } set { name = &lt;span class="kwrd"&gt;value&lt;/span&gt;; } }&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ElementTest() { }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; TCollectionConstLength&amp;lt;ElementTest&amp;gt; item;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            item = &lt;span class="kwrd"&gt;new&lt;/span&gt; TCollectionConstLength&amp;lt;ElementTest&amp;gt;(5);&lt;br /&gt;            ElementTest et;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 5; i++)&lt;br /&gt;            {&lt;br /&gt;                et = item.GetNew();&lt;br /&gt;                et.Name = i.ToString();&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;            Print();&lt;br /&gt;            &lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;            item.Remove(item[1]);&lt;br /&gt;            Print();&lt;br /&gt;            &lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Print()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"//--------------------------------"&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; item.Count; i++)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;br /&gt;                    &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"index - {0}; name - \"{1}\";"&lt;/span&gt;, &lt;br /&gt;                        item[i].IndexInCollection, &lt;br /&gt;                        item[i].Name));&lt;br /&gt;            }&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"//--------------------------------"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Пример наращивания функционала через наследование:&lt;br /&gt;&lt;br /&gt;- Расширенный класс элемента:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TUpdate : TElementConstLength&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update() { }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;- Расширенный класс коллекции&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TUpdateCollection&amp;lt;T&amp;gt; : TCollectionConstLength&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : TUpdate, &lt;span class="kwrd"&gt;new&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; TUpdateCollection(&lt;span class="kwrd"&gt;int&lt;/span&gt; l) : &lt;span class="kwrd"&gt;base&lt;/span&gt;(l) { }&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update()&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.Count; i++)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;base&lt;/span&gt;[i].Update();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Данный подход позволяет исключить сборку мусора и равномерно распределить нагрузку на процессор. Для каждого наследника от базового класса нужно добавить метод заполняющий поля данного класса, что делает процесс инициализации нового члена коллекции похожим на инициализацию структуры.&lt;br /&gt;&lt;br /&gt;Давайте пообщаемся на эту тему.&lt;br /&gt;Так же буду рад ссылкам на статьи с подобными темами и изысканиями.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8342491429771696024?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8342491429771696024/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/blog-post_13.html#comment-form' title='Комментарии: 22'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8342491429771696024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8342491429771696024'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/blog-post_13.html' title='Компромисс в выборе между классом и структурой'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-571912916064089956</id><published>2011-07-06T19:31:00.002+04:00</published><updated>2011-07-06T19:32:51.395+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>От идеи до реализации: история игры GB&amp;W</title><content type='html'>&lt;div align="center"&gt;Написал о создании игры статью для wp7rocks.com&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;a href="http://www.wp7rocks.com/2011/07/gb.html"&gt;"От идеи до реализации: история игры GB&amp;amp;W"&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uOo4nlNLL3s/ThSABuKj8XI/AAAAAAAAAGE/3xve3gn5kCQ/s1600/480x800.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-uOo4nlNLL3s/ThSABuKj8XI/AAAAAAAAAGE/3xve3gn5kCQ/s320/480x800.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-571912916064089956?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/571912916064089956/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/gb.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/571912916064089956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/571912916064089956'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/gb.html' title='От идеи до реализации: история игры GB&amp;W'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-uOo4nlNLL3s/ThSABuKj8XI/AAAAAAAAAGE/3xve3gn5kCQ/s72-c/480x800.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-3763207979647153557</id><published>2011-07-02T20:51:00.002+04:00</published><updated>2011-07-02T20:54:32.955+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Лето ... Юмор ...</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;Бред конечно, но когда пытаешься сосредоточиться на работе, а тебе при этом постоянно мешают, еще эта жара - именно такие мысли лезут в голову:&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: к сожалению, пока некогда :(( работа... осенью закуплю девайсы и морозными зимними вечерами... :)&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: да.. да..)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: я вот тут думаю, как бы до морозных вечеров обороты набрать, что бы потом только щепки летели)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: лето... мозги вообще ничего делать не хотят... :((&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: у нас жара вторую неделю... жесть...&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: ищу стимулы, у нас тоже пекло)&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: ну у вас-то еще бы!&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: )))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: мы-то люди северные, к жаре не привычные&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: да я лето из за лени ненавижу)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: хотя я 17 лет в минводах прожил, но тут уже адаптировался... )&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: у меня такое подозрение, что для того что бы я смог раскрыть все свои способности, по максимуму, и реализовать их - меня нужно запереть на какой ни будь полярной станции и не выпускать.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: только с компом и интернетом)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: и раз в неделю привозить еду и женщин)))))))))))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: ух ...&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: у меня такое же мнение!!! сто пудово! если запереть - реализуемся...&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: даже женщин на хрен не возите, только отвлекать будут... потерплю тройку месяцев ))))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: раз в неделю можно часок расслабиться)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: при таком раскладе даже в покер научится играть можно профессионально... ))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: ну.. если часок... но потом чтоб СРАЗУ УВОЗИЛИ! :))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: прилетела на вертолете, еды привезла, удовлетворила и улетела)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: идеал женщины)))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: )))))))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #f6b26b;"&gt;Тенгизи&lt;/span&gt;: к тому же чтоб глухонемая была ))&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="color: #ffd966;"&gt;Dmitry&lt;/span&gt;: не вопрос)))&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Приятно осознавать, что ты не один такой :)&lt;/i&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-3763207979647153557?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/3763207979647153557/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3763207979647153557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3763207979647153557'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/blog-post.html' title='Лето ... Юмор ...'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-2673731087469202327</id><published>2011-07-02T13:36:00.001+04:00</published><updated>2011-07-02T13:40:05.950+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GBW'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>"GB&amp;W" in "Top WP7 Games : June 2011 [ POLL ]"</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Сайт &lt;a href="http://www.bestwp7games.com/"&gt;bestwp7games.com&lt;/a&gt; предложил голосование за игры для Windows Phone 7 вышедшие в июне. В этом списке на ряду с топовыми играми, имеющими статут xbox live, каким то образом, оказалась и наша игра GB&amp;amp;W. Приглашаю вас присоединиться к нашей группе болельщиков и принять участие в голосовании.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bestwp7games.com/top-wp7-games-june-2011-poll.html"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: orange;"&gt;Проголосовать можно тут&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Регистрация не нужна. Достаточно выбрать соответствующий пункт и подтвердить кнопкой "vote".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Всем огромное спасибо за отклик и участие!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;P.S. Топовым играм, имеющим статус xbox live и команду поддержки, хватает внимания, загрузок и покупок, а вот нам бы все это даже очень не помешало.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-2673731087469202327?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/2673731087469202327/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/gb-in-top-wp7-games-june-2011-poll.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2673731087469202327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2673731087469202327'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/07/gb-in-top-wp7-games-june-2011-poll.html' title='&quot;GB&amp;W&quot; in &quot;Top WP7 Games : June 2011 [ POLL ]&quot;'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-3532825777039564336</id><published>2011-06-13T23:22:00.001+04:00</published><updated>2011-06-13T23:24:13.886+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>GB&amp;W - Update v1.4</title><content type='html'>Это уже 4-е обновление. &lt;br /&gt;&lt;br /&gt;Сейчас доступно:&lt;br /&gt;- 40 уровней.&lt;br /&gt;- 14 типов кирпичей&lt;br /&gt;- 14 бонусов&lt;br /&gt;&lt;br /&gt;Одна из последних добавленный пакостей это кирпич с кодовым названием "Биомасса". Он не прерывно плодиться с постоянной скоростью, кроме того он подвержен влиянию 2х бонусов:&lt;br /&gt;- катализатор, единовременно ускоряющий рост общего объема биомассы&lt;br /&gt;- заморозка, соответственно временно останавливающий рост биомассы.&lt;br /&gt;&lt;br /&gt;Вот новое видео:&lt;br /&gt;&lt;iframe width="480" height="390" src="http://www.youtube.com/embed/h5m0uhxfOWg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-3532825777039564336?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/3532825777039564336/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/06/gb-update-v14.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3532825777039564336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3532825777039564336'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/06/gb-update-v14.html' title='GB&amp;W - Update v1.4'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/h5m0uhxfOWg/default.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-7304839697606272132</id><published>2011-05-18T22:48:00.002+04:00</published><updated>2011-05-18T22:59:14.361+04:00</updated><title type='text'>GB&amp;W и Конкурс мобильных приложений</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;С начала главный вопрос на повестке дня).&lt;br /&gt;&lt;br /&gt;Сегодня зарегистрировал свой проект в конкурсе мобильных приложений под Windows Phone 7 на сайте конференции &lt;a href="http://event.msdevcon.ru/wp7.aspx"&gt;&lt;span style="color: #f6b26b;"&gt;DevCon•11&lt;/span&gt;&lt;/a&gt;. В конкурсе участвует следующее видео:&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/B2TBZFYYzWU?hd=1" width="480"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Ребят у меня к вам просьба - кому симпатичен данный проект, пожалуйста не пожалейте 5 секунд своего времени, проголосуйте за него, для меня важен каждый Ваш голос. Ниже кнопочка для голосования:&lt;br /&gt;&lt;a href="http://wp7-contest.cloudapp.net/Vote/116ad744-87c2-4e95-a755-152ee6397247"&gt;&lt;img src="http://wp7-contest.cloudapp.net/Images/vote.png" /&gt;&lt;/a&gt;&lt;br /&gt;Заранее благодарен.&lt;br /&gt;&lt;br /&gt;Наконец то завершена работа над первым релизом игры. Почему первым? Потому что в планах добавлять уровни в следующих обновлениях. Сейчас приложение находится на этапе публикации в Marketplace.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-7304839697606272132?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/7304839697606272132/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/05/gb.html#comment-form' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7304839697606272132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7304839697606272132'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/05/gb.html' title='GB&amp;W и Конкурс мобильных приложений'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/B2TBZFYYzWU/default.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-767031740776805432</id><published>2011-04-23T15:05:00.011+04:00</published><updated>2011-04-23T15:26:04.005+04:00</updated><title type='text'>GB&amp;W - Windows Phone 7 game preview 3</title><content type='html'>Не пугайтесь обилию выпадающих бонусов. Это один из первых десяти обучающих уровней. Десятка разбита по применению тематических бонусов их комбинаций.&lt;br /&gt;В этом уровне первый раз появляется усиление на пулемет, который в свою очередь превращается в нечто иное :).&lt;br /&gt;&lt;br /&gt;Рекомендую смотреть в качестве 720p (сейчас 480p)&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="480" height="800" src="http://www.youtube.com/embed/keu3-XGnJ2I?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Мне часто задают вопрос - как происходит управление в игре и как целиться? Все просто. Кораблик управляется одним касанием и постоянно находится под пальцем. Пулеметы наводятся на ближайшую цель в радиусе поражения. Вторым касанием на кнопки в верхней панели активируется тяжелое вооружение:&lt;br /&gt;ракета I - открыть/закрыть подвеску, для экономии боезапаса. Само наводится и поражает ближайшего бота. При потере цели в процессе подлета (цель уничтожена др. ракетой и т.д.) находит и атакует следующую ближайшую.&lt;br /&gt;ракета II - пуск. Само наводится и поражает/запечатывает ближайшую шахту из которой появляются боты.&lt;br /&gt;ракета III - активация ракеты. Второе нажатие в области экрана помечает область поражения и происходит старт. Так же взрывается от столкновения с кирпичами.&lt;br /&gt;&lt;br /&gt;Я потратил какое то время на изменение своего Touch класса. Теперь он понимает второе касание типа Tap при активном первом касании. Т.е. можно не прерываясь контролить кораблик и активировать ракетные бонусы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-767031740776805432?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/767031740776805432/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/04/gb-windows-phone-7-game-preview-3.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/767031740776805432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/767031740776805432'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/04/gb-windows-phone-7-game-preview-3.html' title='GB&amp;W - Windows Phone 7 game preview 3'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/keu3-XGnJ2I/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-7659132530353369936</id><published>2011-03-23T23:57:00.000+03:00</published><updated>2011-03-23T23:57:23.320+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>"Guns, Balls &amp; Walls" - Windows Phone 7 game preview 2</title><content type='html'>Делюсь очередным видео. Музыкальное сопровождение отключено по политическим соображениям. Еще нет четкой договоренности с композитором.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/BSSHp9zlpDg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-7659132530353369936?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/7659132530353369936/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game_23.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7659132530353369936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7659132530353369936'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game_23.html' title='&quot;Guns, Balls &amp; Walls&quot; - Windows Phone 7 game preview 2'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/BSSHp9zlpDg/default.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-1351371738876162960</id><published>2011-03-07T16:22:00.004+03:00</published><updated>2011-03-21T04:19:05.929+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>"Guns, Balls &amp; Walls" - Windows Phone 7 game preview</title><content type='html'>Игра предназначается для Windows Phone 7 marketplace.&lt;br /&gt;Cуть игры - смешанный коктейль трех направлений:&lt;br /&gt;1) арканоид - основная идея и условия прохождения уровня.&lt;br /&gt;2) аэрохоккей - расширенные правила взаимодействия биты(battleship) и мяча&lt;br /&gt;3) хардкорный 2d шутер - пулеметы, ракеты, враги, кровь, взрывы ... боже дай мне сил остановиться :))).&lt;br /&gt;&lt;br /&gt;Отладочный уровень:&lt;br /&gt;&lt;iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/q_ab-4F6Lf0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Планируется сменное оружие для обоих типов вооружения, &lt;br /&gt;а так же их прокачка. Возможные параметры: дальность, урон, скорострельность. Пока остановимся на стандартных амбициях.&lt;br /&gt;&lt;br /&gt;В целом данный проект является экспериментом, в том числе и в 2d.&lt;br /&gt;Очень много времени уходит на рисование, особенно что касается на первый взгляд не заметных деталей таких как кровь на решетках вентиляторов и т.д. . Примерное соотношение времени = (день рисую) / (час программирую). С самим вопросом рисования проблем нет, но не набита рука, плюс, например, если в карандаше я нарисую все что угодно, то ощущение цвета нужно еще нарабатывать. Радует то, что по мере работы прокачка движется. Мега респект создателям графического редактора Paint.net&lt;br /&gt;&lt;br /&gt;Windows Phone 7 радует своими возможностями. По предварительным подсчетам, в данном приложении, запас на частицы порядка 4000 штук. Возможно при желании у меня получится и больше. Время покажет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-1351371738876162960?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/1351371738876162960/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game.html#comment-form' title='Комментарии: 15'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1351371738876162960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1351371738876162960'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game.html' title='&quot;Guns, Balls &amp; Walls&quot; - Windows Phone 7 game preview'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/q_ab-4F6Lf0/default.jpg' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-4708743307955977112</id><published>2011-02-10T01:32:00.007+03:00</published><updated>2011-02-10T23:16:19.274+03:00</updated><title type='text'>XNA GUI library for Windows &amp; Windows Phone 7. General Presentation Foundation</title><content type='html'>Вот на таком эпическом названии остановился мой выбор). В основном такая идея была продиктована большой схожестью названий и возможностей элементов библиотеки с технологией Windows Presentation Foundation. Это как бы должно с первых шагов подвести пользователя к мысли что все просто и знакомо в обращении. В библиотеке есть еще места которые можно в перспективе рефакторить для еще большей схожести, но всему свое время. У меня ушло очень много времени на создание сайта на сильверлайте. Именно сильверлайт я выбрал по причине отсутствия необходимости учить для меня что то новое, т.к. я ни когда не работал в области web и это мой первый сайт.&lt;br /&gt;&lt;br /&gt;Пересекая очередной финиш, хочу выразить огромную благодарность за помощь, советы и творческие обсуждения своим друзьям:&lt;br /&gt;- Сергей Лутай      - &lt;a href="http://lutay.uneta.com.ua"&gt;блог&lt;/a&gt; - &lt;a href="http://twitter.com/sergeylutay"&gt;твиттер&lt;/a&gt;&lt;br /&gt;- Сергей Звездин    - &lt;a href="http://blog.zwezdin.com/ru/"&gt;блог&lt;/a&gt;&lt;br /&gt;- Ильшат Хабибуллин&lt;br /&gt;Спасибо ребят).&lt;br /&gt;&lt;br /&gt;Сам сайт продукта &lt;a href="http://generalpf.ru"&gt;http://generalpf.ru&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-4708743307955977112?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/4708743307955977112/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/02/general-presentation-foundation.html#comment-form' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4708743307955977112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4708743307955977112'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/02/general-presentation-foundation.html' title='XNA GUI library for Windows &amp; Windows Phone 7. General Presentation Foundation'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-3343857148156078256</id><published>2011-02-10T00:32:00.000+03:00</published><updated>2011-02-10T00:32:05.074+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Comments for Vic Gundotra message:"#feb11 Two turkeys do not make an Eagle"</title><content type='html'>Забавный мужик этот Vic Gundotra. Он является вице-президентом по разработкам в Google. В своем блоге он оставил такое сообщение "#feb11 Two turkeys do not make an Eagle", что по нашему звучит как "11 февраля Из двух индеек не получится Орла". Мало кто сомневается, что речь идет о возможном альянсе Microsoft и Nokia. &lt;br /&gt;&lt;br /&gt;Заерзали значит, это хорошо). На уровне вице-президента публичные цирки происходят.&lt;br /&gt;&lt;br /&gt;"Кроме мяса, индейки дают много ценного пуха и пера" &lt;a href="http://ru.wikipedia.org/wiki/Домашняя_индейка"&gt;[Домашняя индейка]&lt;/a&gt;, а орел?))).&lt;br /&gt;&lt;br /&gt;У одной индейки богатый опыт в области мобильных решений, правда ОС не сахар, видимо софт не их занятие. У другой большой потенциал с софтом и возможностями. Есть повод для переживаний).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-3343857148156078256?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/3343857148156078256/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/02/comments-for-vic-gundotra-messagefeb11.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3343857148156078256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3343857148156078256'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/02/comments-for-vic-gundotra-messagefeb11.html' title='Comments for Vic Gundotra message:&quot;#feb11 Two turkeys do not make an Eagle&quot;'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-1948996320962611095</id><published>2011-01-14T18:16:00.001+03:00</published><updated>2011-01-14T18:21:21.967+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Garbage Collector'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='vsync'/><title type='text'>XNA, GarbageCollector, SynchronizeWithVerticalRetrace, IsFixedTimeStep – используйте правила и будет вам счастье …</title><content type='html'>И так по порядку. Что значат эти термины:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SynchronizeWithVerticalRetrace&lt;/i&gt; – public properties GraphicsDeviceManager.   Gets or sets a value that indicates whether to sync to the vertical trace (vsync) when presenting the back buffer (MSDN). Эта штука синхронизирует переключение back buffers с частотой обновления экрана монитора. Зная, как технически происходит обновление изображения на мониторе, можно сказать, что включение данного  параметра нужно для предотвращения разрезания изображения при смене кадров.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;IsFixedTimeStep&lt;/i&gt; - public properties Microsoft.Xna.Framework.Game. Gets or sets a value indicating whether to use fixed time steps (MSDN). Параметр, отвечающий за включение или отключение режима, который отвечает за ограничение частоты вызовов метода Update.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;GarbageCollector&lt;/i&gt; – системный сборщик мусора. Конкретно нас будет интересовать класс System.GC .&lt;br /&gt;&lt;br /&gt;Как работают SynchronizeWithVerticalRetrace и IsFixedTimeStep. Есть четыре сочетания данных флагов:&lt;br /&gt;1. &lt;i&gt;SynchronizeWithVerticalRetrace = false&lt;/i&gt; и &lt;i&gt;IsFixedTimeStep = false&lt;/i&gt;&lt;br /&gt;В этом случае графические буферы меняются по мере их рисования, не дожидаясь синхроимпульса, синхронно вызывается метод Update.&lt;br /&gt;Особенности: обычно в приложении не требуется вызывать метод Update с максимально возможной частотой. При SynchronizeWithVerticalRetrace = false мы имеем возможность измерять значение fps превышающее частоту обновления монитора. Активно пользуюсь при отладке приложения.&lt;br /&gt;2. &lt;i&gt;SynchronizeWithVerticalRetrace = false&lt;/i&gt; и &lt;i&gt;IsFixedTimeStep = true&lt;/i&gt;&lt;br /&gt;В этом случае мы можем дополнительно контролировать частоту вызова методов Update и Draw и устанавливать фиксированный интервал через свойство TargetElapsedTime.&lt;br /&gt;Особенности: сомнительное удовольствие применять данный подход повсеместно. Он подходит, для каких либо исключительных случаев, в которых его применение полностью обоснованно. Не пользуюсь.&lt;br /&gt;3. &lt;i&gt;SynchronizeWithVerticalRetrace = true&lt;/i&gt; и &lt;i&gt;IsFixedTimeStep = false&lt;/i&gt;&lt;br /&gt;Тут все просто, обновляем, рендерим, ждем синхронизации, меняем back buffers и по новой.&lt;br /&gt;Особенности: невозможно измерить значение fps выше частоты обновления монитора. Пользуюсь.&lt;br /&gt;4. &lt;i&gt;SynchronizeWithVerticalRetrace = true&lt;/i&gt; и &lt;i&gt;IsFixedTimeStep = true&lt;/i&gt; &lt;br /&gt;Интересный случай. Если время синхронизации меньше IsFixedTimeStep, то ждем следующей синхронизации и только после этого выполняется Update и Draw. Если же время синхронизации больше IsFixedTimeStep, то по факту выполнения синхронизации не медленно выполняется Update и Draw. Эдакий хромающий ослик без одной ноги).&lt;br /&gt;Особенности: теряюсь в догадках где это можно применить, точно не мой профиль). В некоторых случаях при значениях TargetElapsedTime/ vsyncTime = 1.5f (примерно) можно на глаз заметить не равномерное обновления экрана. Не пользуюсь.&lt;br /&gt;&lt;br /&gt;Уже теплее. И так, о главном). Если вы написали приложение|игру используя XNA, применили из вышеописанных приемов 1й или 3й и в вашем приложении наблюдаются периодические задержки, а вы к тому же нечайно вспомнили «слова которые нельзя произносить» - Garbage Collector ))). Главное не паникуйте, при этом не обязательно писать в различных форумах Ваше мнение о  .net и XNA, крутости и преимуществах C++. Все это от нервов, нервы от не знания, не знание от лени, лень от глупости, но это лечится.&lt;br /&gt;&lt;br /&gt;Как пользуется Garbage Collector’ом рядовой «пользователь» Visual Studio? Да ни как. Он полагается на настройки по умолчанию для Garbage Collector’а. Настройки по умолчанию рассчитаны на так называемые бизнес приложения, для динамичной работы с DirectX нужно доработать.&lt;br /&gt;&lt;br /&gt;По умолчанию Garbage Collector выполняет освобождение памяти в любом случае не синхронно с работой Update. Мертвый груз копится и освобождается в непредсказуемый, для логики вашего приложения, момент. Самый простой выход – это делать в начале очередного Update:&lt;br /&gt;&lt;i&gt;System.GC.Collect(1);&lt;/i&gt;&lt;br /&gt;Где 1 это номер поколения, значение подобрано экспериментально.&lt;br /&gt;&lt;br /&gt;С другой стороны может быть не целесообразно перегибать палку и выполнять сборку мусора 60 раз в секунду при включенной синхронизации (если у монитора такая рабочая частота обновления экрана) или более 60 раз при выключенной синхронизации.&lt;br /&gt;По этому можно сделать так:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; GeneralPresentationFoundation.gSystem.gGarbageCollector&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; GarbageCollector&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; BackgroundWorker bw = &lt;span class="kwrd"&gt;new&lt;/span&gt; BackgroundWorker();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; stepNumber = 0;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; sleepStep = 1;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; SleepStep { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; sleepStep; } set { sleepStep = &lt;span class="kwrd"&gt;value&lt;/span&gt;; } }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; GarbageCollector()&lt;br /&gt;        {&lt;br /&gt;            Init();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; GarbageCollector(&lt;span class="kwrd"&gt;int&lt;/span&gt; sleepStep)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.sleepStep = sleepStep;&lt;br /&gt;            Init();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Init()&lt;br /&gt;        {&lt;br /&gt;            bw.DoWork += &lt;span class="kwrd"&gt;new&lt;/span&gt; DoWorkEventHandler(bw_DoWork);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update()&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(!bw.IsBusy)&lt;br /&gt;            {&lt;br /&gt;                stepNumber++;&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt;(stepNumber == sleepStep)&lt;br /&gt;                {&lt;br /&gt;                    stepNumber = 0;&lt;br /&gt;                    bw.RunWorkerAsync();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; bw_DoWork(Object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            GC.Collect(1);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Возможно не везде будет полезным применение потока, это просто мой случай.&lt;br /&gt;GarbageCollector  gc = new GarbageCollector(20);&lt;br /&gt;т.е. при частоте монитора 60 Гц - 3 раза в секунду.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-1948996320962611095?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/1948996320962611095/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2011/01/xna-garbagecollector.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1948996320962611095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1948996320962611095'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2011/01/xna-garbagecollector.html' title='XNA, GarbageCollector, SynchronizeWithVerticalRetrace, IsFixedTimeStep – используйте правила и будет вам счастье …'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-661210169482611814</id><published>2010-12-01T14:50:00.002+03:00</published><updated>2010-12-01T14:53:42.459+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>RSDN совместно с MSDN сообщают о новом конкурсе статей по технологиям Microsoft</title><content type='html'>RSDN совместно с MSDN сообщают о новом конкурсе статей по технологиям Microsoft, посвященных одной из двух тем: &lt;br /&gt;- Возможности операционной системы Windows 7 &lt;br /&gt;- .NET &lt;br /&gt;На конкурс принимаются русскоязычные технические статьи, присланные на адрес submit@rsdn.ru в период с 12 октября по 31 января 2011 года.&lt;br /&gt;Первые три места получают:&lt;br /&gt;1 Notebok Acer "Aspire 3820TG-5464G50iks"&lt;br /&gt;2 Коммуникатор HTC "HD2 T8585"&lt;br /&gt;3 XBox 360&lt;br /&gt;&lt;br /&gt;Участники, написавшие интересные статьи, но не попавшие в первую тройку, получат специальные призы от жюри:&lt;br /&gt;4 Microsoft "Wireless Laser Desktop 7000"&lt;br /&gt;5 Microsoft "Natural Ergonomic Keyboard 4000"&lt;br /&gt;6 Microsoft "Wireless Arc Mouse" ZJA-00010&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rsdn.ru"&gt;Подробности тут&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-661210169482611814?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/661210169482611814/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/12/rsdn-msdn-microsoft.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/661210169482611814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/661210169482611814'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/12/rsdn-msdn-microsoft.html' title='RSDN совместно с MSDN сообщают о новом конкурсе статей по технологиям Microsoft'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-2068899713510601594</id><published>2010-10-14T18:36:00.000+04:00</published><updated>2010-10-14T18:36:08.245+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xnadev.ru'/><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><title type='text'>GPF - "WPF" for XNA</title><content type='html'>GPF - на таком рабочем названии библиотеки я остановился.&lt;br /&gt;&lt;br /&gt;Сегодня закончил модуль 3d форм - это такой штука, обеспечивающая &lt;br /&gt;функционал добавления в сцену объектов на плоские грани которых можно проецировать формы и оперировать ими указателем мыши.&lt;br /&gt;&lt;br /&gt;Пока не стал возиться с наложением форм на не плоские поверхности по&lt;br /&gt;причине того, что это нарушит совместимость с Windows Phone 7 экземпляром библиотеки.&lt;br /&gt;&lt;br /&gt;Вот такое видео:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HahT-fzWxj4?fs=1&amp;amp;hl=ru_RU"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HahT-fzWxj4?fs=1&amp;amp;hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="320"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Показал Expander, DataGrid, Table.&lt;br /&gt;Со стилями элементов опять не поиграл. Оставил на потом)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-2068899713510601594?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/2068899713510601594/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/gpf-wpf-for-xna.html#comment-form' title='Комментарии: 28'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2068899713510601594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2068899713510601594'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/gpf-wpf-for-xna.html' title='GPF - &quot;WPF&quot; for XNA'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-3816519345696368320</id><published>2010-10-09T21:30:00.005+04:00</published><updated>2010-10-13T17:58:17.484+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xnadev.ru'/><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='gEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><title type='text'>XNA. gEngine. Forms (GUI)</title><content type='html'>Вот и созрел я до первого показа своего интерфейса для приложений реализованных на базе XNA. Как говорится лучше один раз увидеть …, так не буду Вас задерживать:&lt;br /&gt;&lt;br /&gt;Рекомендую смотреть в HD режиме.&lt;br /&gt;&lt;object width="480" height="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UEhgTCKhc4Q?fs=1&amp;amp;hl=ru_RU"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UEhgTCKhc4Q?fs=1&amp;amp;hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="320"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Данное видео не показывает всех элементов и возможностей. Опубликовал по многочисленным заявкам. За продолжением следите в следующих сериях.&lt;br /&gt;&lt;br /&gt;Идея архитектуры, данного интерфейса, базируется на архитектуре предложенной в WPF. Но ядро и элементы написаны с нуля и оптимизированы под 3d. Так же данная библиотека работает и на Windows Phone 7.&lt;br /&gt;Список уже реализованных элементов выглядит следующим образом:&lt;br /&gt;- Button&lt;br /&gt;- Canvas&lt;br /&gt;- CheckBox&lt;br /&gt;- CheckElement&lt;br /&gt;- ConsoleOutput&lt;br /&gt;- DataGrid&lt;br /&gt;- Expander&lt;br /&gt;- Image&lt;br /&gt;- ListSelector&lt;br /&gt;- Menu&lt;br /&gt;- ProgressBar&lt;br /&gt;- ScrollBar&lt;br /&gt;- ScrollDiagram2d&lt;br /&gt;- ScrollView&lt;br /&gt;- Slider&lt;br /&gt;- StackPanel&lt;br /&gt;- Switch&lt;br /&gt;- TabControl&lt;br /&gt;- Table&lt;br /&gt;- TextBlock&lt;br /&gt;- TextBox&lt;br /&gt;В этот список попали не характерные для WPF элементы, что было продиктовано первоочередной необходимостью реализации отображения функционала 3d движка.&lt;br /&gt;В представленном видео все элементы и формы выводятся с простым базовым стилем. Под базовым стилем подразумевается (если есть) прямоугольная рамка и (если есть) прямоугольник фона. Стиль любого элемента достаточно просто меняется наследованием от него нового нового класса. Я пока не стал перегружать рабочую версию интерфейса надуманным стилем и растровой графикой, бесполезная трата времени на то что в последствии не пригодится.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-3816519345696368320?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/3816519345696368320/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/xna-gengine-forms-gui.html#comment-form' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3816519345696368320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3816519345696368320'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/xna-gengine-forms-gui.html' title='XNA. gEngine. Forms (GUI)'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-6864314785569430272</id><published>2010-10-07T19:03:00.003+04:00</published><updated>2010-10-07T19:21:52.224+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xnadev.ru'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Фрагмент истории xnadev.ru</title><content type='html'>&lt;div class="MsoNormal"&gt;Своим рассказом хочу развеять некоторые предрассудки, заблуждения и прояснить ситуацию.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Как то зашел разговор о том, что с различных ресурсов, пользователей задающих вопросы по XNA, перенаправляют на наш сайт &lt;a href="http://xnadev.ru/"&gt;xnadev.ru&lt;/a&gt;. Пользователи приходят не (!) регистрируясь осматриваются, чаще всего делаю вывод о том что форум мертв и уходят. Т.е. не задерживаются. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;На самом же деле форум не мертв. Собралась достаточно дружная компания, костяк из админов, MVP, активных грамотных пользователей, плюс немного интересных и эксцентричных персонажей, добавляющих в наше общение позитив, и прочие читатели. Каждый занимается своим делом, временами рассказываем, показываем наработки. Ежедневно отвечаем на вопросы (я это делаю по вечерам). Общаемся в меру свободного времени и настроения.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Но до недавнего времени доступ к самым активным веткам форума был закрыт (!) для не зарегистрированных пользователей. Без злого умысла, данное обстоятельство было продиктовано техническими ограничениями тарифа хостинга сайта (нагрузки, трафик и т.д.), а так как админы платили кровные из своего кармана, то пояса пришлось затянуть по туже. Сейчас мы сменили хостинг, переехали на &lt;a href="http://1gb.ru/"&gt;1gb.ru&lt;/a&gt;. Еще раз спасибо за содействие Евгению Марченкову (Microsoft). Возможности расширились и мы изменили права доступа для всех пользователей (и соответственно поисковых систем). Вот такая вот наша сказка).&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Милости просим.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-6864314785569430272?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/6864314785569430272/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/xnadevru.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/6864314785569430272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/6864314785569430272'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/10/xnadevru.html' title='Фрагмент истории xnadev.ru'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8328478084706275532</id><published>2010-09-20T23:55:00.001+04:00</published><updated>2010-09-21T00:49:50.493+04:00</updated><title type='text'>Твоя Microsoft Visual Studio 2010 Ultimate with MSDN Subscription</title><content type='html'>&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_XDL74WV16Ms/TJe5So2wc4I/AAAAAAAAAFk/3Nr6IaVmJjM/s1600/en-US111_Visual_Studio_Ult_2010_MSDN_H9F-00001.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_XDL74WV16Ms/TJe5So2wc4I/AAAAAAAAAFk/3Nr6IaVmJjM/s320/en-US111_Visual_Studio_Ult_2010_MSDN_H9F-00001.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_XDL74WV16Ms/TJe1khsC8xI/AAAAAAAAAFc/8cJ8VD2qIHs/s1600/en-US111_Visual_Studio_Ult_2010_MSDN_H9F-00001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Внимание акция в рамках ресурса &lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://xnadev.ru/news.php?readmore=101"&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;xnadev.ru&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;напиши статью и получи:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;Microsoft Visual Studio 2010 Ultimate with MSDN Subscription&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Такой подарок получат первые двое авторов статей на темы из области XNA. Двое т.к. активационных кодов у меня осталось два.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="color: red;"&gt;&lt;b&gt;Поспешите, срок активации ограничен!&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8328478084706275532?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8328478084706275532/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/09/microsoft-visual-studio-2010-ultimate.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8328478084706275532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8328478084706275532'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/09/microsoft-visual-studio-2010-ultimate.html' title='Твоя Microsoft Visual Studio 2010 Ultimate with MSDN Subscription'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XDL74WV16Ms/TJe5So2wc4I/AAAAAAAAAFk/3Nr6IaVmJjM/s72-c/en-US111_Visual_Studio_Ult_2010_MSDN_H9F-00001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-2029453630056895971</id><published>2010-05-19T19:13:00.002+04:00</published><updated>2010-05-19T20:31:25.191+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Windows Phone 7 + XNA 4.0 + Test Game</title><content type='html'>Поигрался с Windows Phone 7, начал с проверки возможностей 2D, вот что получилось:&lt;br /&gt;&lt;object width="300" height="540"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_Z5rT7KBFzc&amp;hl=ru_RU&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_Z5rT7KBFzc&amp;hl=ru_RU&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="300" height="540"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;очень пока не хватает возможности использовать собственные шейдеры, а решать этот вопрос в обход длинным путем не очень хочется. так бы уже можно было поиграть с normal maping и добавить к рельефу освещение).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-2029453630056895971?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/2029453630056895971/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/05/windows-phone-7-xna-40-test-game.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2029453630056895971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2029453630056895971'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/05/windows-phone-7-xna-40-test-game.html' title='Windows Phone 7 + XNA 4.0 + Test Game'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-5969091444556277922</id><published>2010-02-27T23:15:00.014+03:00</published><updated>2010-03-06T23:37:30.572+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='Jeffrey Richter'/><title type='text'>Твой путь</title><content type='html'>Данную статью я посвящаю трем категориям людей: евангелистам Microsoft, работодателям и специалистам, связавшим свою деятельность с платформой dotNet (далее будем подразумевать язык C#). На написание данного опуса меня вдохновило очередное перечитывание книги «CLR via C#» Джеффри Рихтера. Сейчас объясню почему.&lt;br /&gt;&lt;br /&gt;На данном историческом этапе людям, позиционирующим себя как dotNet разработчики, зачастую приходится отвечать на вопросы подобные этим:&lt;br /&gt;&lt;br /&gt;- почему вы выбрали C#, а не C++?&lt;br /&gt;- чем C# лучше C++?&lt;br /&gt;- а вы знаете, что C# медленнее C++? (очередной «капитан очевидность»)&lt;br /&gt;&lt;br /&gt;Работодателей выделю в отдельный абзац, по причине существования тенденции непонимания ими основополагающих факторов. В моей практике не так давно был веселый случай, когда перспективный работодатель, зная мое владение C++, предложил работу, которая подразумевала бы мой абсолютный переход обратно на C++. На что, получив мой отрицательный ответ, мотивированный нежеланием делать шаг назад, начал дискуссию в лучших традициях “Holy wars C++ vs C#”. Но война не сложилась. Видимо сказалось мое  накопленное к тому моменту  недовольство с оплатой предыдущих проектов, в итоге гражданин дуется на меня до сих пор, так и не поняв мотивов и побуждений движущих мною. По этому, уважаемые работодатели, на подобные предложения я хотел бы ответить Вам цитированием слов абсолютного авторитета в нашей области Джеффри Рихтера (цитата приведена далее по тексту и выделена &lt;span style="font-style:italic;"&gt;курсивом&lt;/span&gt;, особенно ценное выражение выделено &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;жирным курсивом&lt;/span&gt;&lt;/span&gt;). И если в ответе на ваше предложение вы нашли ссылку на данную статью, то мой ответ скорее отрицательный, чем положительный.&lt;br /&gt;&lt;br /&gt;Так же постоянно находятся желающие, хотите вы этого или нет, поспорить с вами, развязать священную войну и доказать  что именно C++ есть единственный и ничего кроме него. От серьезного человека Вы вряд ли такое услышите и скорее всего найдутся более интересные темы для беседы с ним. Разработчики с такими ситуациями сталкиваются в своей повседневной деятельности, в разговорах с коллегами, желающими выделится на вашем фоне, и т.д., евангелисты на встречах, семинарах, выступлениях, докладах. У каждого из нас есть свой багаж аргументов и оборонительных тактик, что является естественным. Не всегда выгодно игнорировать человека. Иногда обстоятельства складываются так, что остается только два пути пасовать или побеждать. Для победы, желательно не затягивая дебаты, нужны веские и достаточные аргументы. Какими же эти аргументы должны быть? Возьмем за основу три принципа:&lt;br /&gt;&lt;br /&gt;1. Козьма Прутков: «Зри в корень» -&gt; определи -  что для оппонента является точкой опоры.&lt;br /&gt;2. Основополагающее правило РРБ: «Лишить противника равновесия максимально эффективно и быстро» -&gt; соответственно выбить почву из под ног, лишив опоры.&lt;br /&gt;3. Геометрический метод: «Доказательство от обратного» -&gt; все действия нужно провернуть с позитивом, не стандартно и оригинально.&lt;br /&gt;&lt;br /&gt;Исходя из выше сказанного и того, что ваш оппонент ярко выраженный фанат С++, а так же человек не желающий развиваться дальше достигнутой ступеньки. Возьмем за основу нашей тактики следующую последовательность вопросов:&lt;br /&gt;&lt;br /&gt;1. Какая книга и какого автора является для вас библией в вашей профессиональной деятельности как C++ программиста? – естественно автор будет Джеффри Рихтер или вы общаетесь не с программистом.&lt;br /&gt;2. Что из себя представляет Джеффри Рихтер как специалист и кем он является: например по отношению к таким компаниям как Intel, DreamWorks и Microsoft? – нужно понимать, что данным вопросом мы преследуем сразу несколько целей. Во-первых: он подготавливает ситуацию к финальному ходу. Во-вторых: есть возможность заработать бонусные балы себе в глазах свидетелей (в зале например), если человек не владеет информацией глубже литературной деятельности автора. В-третьих: мы получаем добровольное признание оппонента в том, что данный автор является для него авторитетом с абсолютной степенью значимости. «… кто его тронет, он же памятник! …» - Рихтер выступал в роли консультанта для таких компаний как Intel, DreamWorks и Microsoft.&lt;br /&gt;3. И контрольный вопрос: Как вы относитесь к высказыванию Джеффри Рихтера в одной из относительно недавних его книг? А конкретно:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;«…Уже несколько лет я использую .NET Framework и должен сказать с уверенностью, что ни за что не вернусь к устаревшим технологиям абстрагирования и способам разработки ПО. &lt;span style="font-weight:bold;"&gt;И, если меня заставят, я предпочту сменить профессию!&lt;/span&gt; Вот как трудно отвыкать от хорошего. Честно говоря, вспоминая, чего стоило создавать приложения с использованием старых технологий, я просто не могу представить, как разработчикам вообще удавалось так долго создавать работающее ПО.»&lt;/span&gt;&lt;br /&gt;Джеффри Рихтер, книга «CLR via C# программирование на платформе .NET FRAMEWORK на языке С#» 2-е издание, Введение, страница  XIV.&lt;br /&gt;&lt;br /&gt;За сим прощаюсь с вами. Вешаю на свой щит, как икону, фото и цитату Рихтера и со словами «изыйдите нечистые» продолжу свой путь.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;P.S.&lt;/span&gt; Данная статья является результатом стечения обстоятельств и соответствующего настроения )&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;P.S.S.&lt;/span&gt; За статьей последовала переписка с Джеффри Рихтером, которую я привожу с его на то разрешения (Разговорный английский ни когда не был моей сильной стороной):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;- Good day Jeffrey. I'm Russian developer and I adore Your books, that has directed me on writing the following article: &lt;a href="http://dtimofeev.blogspot.com/2010/02/blog-post.html"&gt;«Твой путь»&lt;/a&gt;. This article writing on Russian language. I be very happy if see You comment, if You have possibility.&lt;br /&gt;- Добрый день Джеффри. Я являюсь русским разработчиком и достаточно сильно уважаю ваши книги, что вдохновило меня на написание следующей статьи: &lt;a href="http://dtimofeev.blogspot.com/2010/02/blog-post.html"&gt;«Твой путь»&lt;/a&gt;. Данная статья написана на русском языке. Я был бы очень счастлив увидеть Ваши комментарии, если Вас это не обременит.&lt;br /&gt;-- Dmitry Timofeev &lt;br /&gt;&lt;br /&gt;- I read your post via a translator which didn't do a great job of translating the text but I think I get the general gist idea of what you are trying to say. I have to say that C# is a much more programmer-friendly environment than C++ is. But, I also have to say that C++ can do some things that C# cannot do: more control over your system, better error recovery and, in some cases, better performance. I don't want to give the impression that C# is the solution for every problem. There are some problems that C++ is better suited for: operating systems and database servers come immediately to mind. Personally, I'm in a position where I would not go back to C++ development but there is still a needs for C++ developers as C# can't do everything.&lt;br /&gt;- Я прочитал Ваш пост через переводчик, который не делал большой работы по переводу текста, но думаю, что понял то, что Вы пытаетесь сказать. Должен сказать, что C# является намного более благоприятной для программиста средой, чем C++. Но также должен сказать, что C++ может сделать некоторые вещи лучше, чем C# : возможен больший контроль над системой, лучшее восстановление после ошибок и, в некоторых случаях, лучшая производительность.&lt;br /&gt;Я не хочу создать впечатление, что C# - решение для каждой проблемы. Есть некоторые задачи, для решения которых лучше подходит С++: на ум сразу приходят операционные системы и серверы баз данных. &lt;span style="font-weight:bold;"&gt;Лично я не хотел бы вернуться назад к разработке на C++&lt;/span&gt;, но есть все еще потребность в C++ разработчиках, поскольку C# не может сделать всего. &lt;br /&gt;-- Jeffrey Richter &lt;a href="http://Wintellect.com"&gt;(http://Wintellect.com)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Thank's from comments. Your words once again emphasize true meaning my article. My opinion comply with You. I have attitude to programing in old school style. Including programming on periods: assembler Z80 (XZ Spectrum), c++, c++ and OpenGL, and in present time C#, particularly pay own attention XNA, it's explain my relation with quoting You words. I  ask You permit publication in my blog from You mail comments.&lt;br /&gt;- Спасибо за комментарий. Ваши слова еще раз подтверждают мысль моей статьи. Наши мнения совпадают. Я отношусь к программистам которых относят к старой школе (old school). Прохождение через периоды программирования на: ассемблере Z80 (ZX Spectrum), c++, c++ и OpenGL, и в настоящее время C #, особенно много уделяя собственное внимание XNA, может объяснить мое отношении к цитированию Ваших слов. Я прошу Вашего разрешения публикации Ваших комментариев в моем блоге.&lt;br /&gt;-- Dmitry Timofeev &lt;br /&gt;&lt;br /&gt;- Yes you may post what i sent you.&lt;br /&gt;- Да Вы можете опубликовать то, что я послал Вам.&lt;br /&gt;-- Jeffrey Richter &lt;a href="http://Wintellect.com"&gt;(http://Wintellect.com)&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-5969091444556277922?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/5969091444556277922/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/blog-post.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5969091444556277922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5969091444556277922'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/blog-post.html' title='Твой путь'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-1906592217397483429</id><published>2010-02-21T18:11:00.003+03:00</published><updated>2010-02-21T18:16:29.303+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='XnaDevRuEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>#1 XnaDevRuEngine - 3d Max Export Plugin</title><content type='html'>Заработал мой плагин экспорта из 3d Max. Были сложности с взаимодействием костей, но упорство, блокнот и карандаш все решили.&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1L6Xd_cPwgM&amp;hl=ru_RU&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1L6Xd_cPwgM&amp;hl=ru_RU&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-1906592217397483429?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/1906592217397483429/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/1-xnadevruengine-3d-max-export-plugin.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1906592217397483429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1906592217397483429'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/1-xnadevruengine-3d-max-export-plugin.html' title='#1 XnaDevRuEngine - 3d Max Export Plugin'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-4530428311540627511</id><published>2010-02-04T22:34:00.005+03:00</published><updated>2010-02-04T22:59:20.639+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xnadev.ru'/><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='XnaDevRuEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>#0 XnaDevRuEngine</title><content type='html'>Мои коллеги, с которыми меня объединяет деятельность в рамках ресурса &lt;a href="xnadev.ru"&gt;xnadev.ru&lt;/a&gt;, и я, начали работу над 3D движком &lt;span style="font-weight:bold;"&gt;XnaDevRuEngine&lt;/span&gt;. Если не брать в расчет наработки по модулю интерфейса (forms), которые ранее существовали как самостоятельный проект, то следующее видео можно считать первым, демонстрирующим XnaDevRuEngine:&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zq0TW_yFVjA&amp;hl=ru_RU&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zq0TW_yFVjA&amp;hl=ru_RU&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Сейчас частично готовы модули SceneTree и прототип ResorceManager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-4530428311540627511?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/4530428311540627511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/0-xnadevruengine.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4530428311540627511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4530428311540627511'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2010/02/0-xnadevruengine.html' title='#0 XnaDevRuEngine'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-1328301271020636184</id><published>2009-09-18T22:26:00.003+04:00</published><updated>2009-09-18T22:33:45.613+04:00</updated><title type='text'>Конкурс статей XNAdev.ru !!!</title><content type='html'>С 1-го октября 2009 года, совместно с администрацией ресурса &lt;a href="http://xnadev.ru/news.php"&gt;xnadev.ru&lt;/a&gt;, начинаем конкурс статей. Тематика статей XNA и 3D в целом.&lt;br /&gt;Приз за первое место:&lt;br /&gt;– годовая подписка &lt;a href="https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;checkda=1&amp;ct=1253298567&amp;rver=6.0.5276.0&amp;wp=MCLBI&amp;wlcxt=msdn%24msdn%24msdn&amp;wreply=http:%2F%2Fmsdn.microsoft.com%2Fru-ru%2Fsubscriptions%2Fbuy.aspx%3Fpm%3DLv%255C:19&amp;lc=1033&amp;id=254354"&gt;MSDN Premium + Visual Studio Team System 2008 Team Suite&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XDL74WV16Ms/SrPSB3zhdSI/AAAAAAAAAFI/qbnlftKF_s0/s1600-h/aa718657.Tile_MSDN_VSTS2008TS_v(en-us,MSDN.10).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://2.bp.blogspot.com/_XDL74WV16Ms/SrPSB3zhdSI/AAAAAAAAAFI/qbnlftKF_s0/s400/aa718657.Tile_MSDN_VSTS2008TS_v(en-us,MSDN.10).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382876909239629090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xnadev.ru/news.php?readmore=77"&gt;Подробности можно прочесть здесь ...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-1328301271020636184?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/1328301271020636184/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/09/xnadevru.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1328301271020636184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1328301271020636184'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/09/xnadevru.html' title='Конкурс статей XNAdev.ru !!!'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XDL74WV16Ms/SrPSB3zhdSI/AAAAAAAAAFI/qbnlftKF_s0/s72-c/aa718657.Tile_MSDN_VSTS2008TS_v(en-us,MSDN.10).jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-2582044687183051298</id><published>2009-09-10T18:48:00.016+04:00</published><updated>2009-09-10T22:06:45.738+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fps'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>С#+XNA. В погоне за fps. I</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Краткое содержание:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Введение;&lt;br /&gt;- Часть 1-я. Новичкам;&lt;br /&gt;- Часть 2-я. Та же песня с Microsoft'ом;&lt;br /&gt;- Часть 3-я философская. Охотник или жертва;&lt;br /&gt;- Заключение.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Введение.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Данная статья является попыткой посмотреть в корень проблемы. Проблемы достижения высоких показателей fps с точки зрения построения C# кода не касаясь при этом XNA раздела 3D, относящегося к непосредственным инструкциям видеокарте.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Часть 1-я. Новичкам.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Мои наблюдения основаны на постоянном присутствии в различных форумах и участии в различных проектах. Соль рассматриваемого мною вопроса заключается в  использовании Fields и Properties членов классов и структур.&lt;br /&gt;Для полноты ощущений, в моих изысканиях, меня интересовали следующие ссылочные типы:&lt;br /&gt;- class;&lt;br /&gt;- interface;&lt;br /&gt;- object.&lt;br /&gt;Сейчас мы просмотрим на время выполнения кода при различной организации доступа к членам класса.&lt;br /&gt;Пример:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; TestObjectInterface&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; Unit[]       unit;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[]     unitobj;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; iUnit[]      uniti;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;          count;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            count       = 10000000;&lt;br /&gt;            unit        = &lt;span class="kwrd"&gt;new&lt;/span&gt; Unit[count];&lt;br /&gt;            unitobj     = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[count];&lt;br /&gt;            uniti       = &lt;span class="kwrd"&gt;new&lt;/span&gt; iUnit[count];&lt;br /&gt;            Init();&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; tf   = TestFields();&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; tp   = TestProperties();&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; tfo  = TestFieldsObject();&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; tpo  = TestPropertiesObject();&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; tpi  = TestPropertiesInterface();&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testFields = "&lt;/span&gt;               &lt;br /&gt;                + tf.ToString() + &lt;span class="str"&gt;" mc, k = 1"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testProperties = "&lt;/span&gt;           &lt;br /&gt;                + tp.ToString() + &lt;span class="str"&gt;" mc, k = "&lt;/span&gt; &lt;br /&gt;                + (tp / tf).ToString());&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testFieldsObject = "&lt;/span&gt;         &lt;br /&gt;                + tfo.ToString() + &lt;span class="str"&gt;" mc, k = "&lt;/span&gt; &lt;br /&gt;                + (tfo / tf).ToString());&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testPropertiesObject = "&lt;/span&gt;     &lt;br /&gt;                + tpo.ToString() + &lt;span class="str"&gt;" mc, k = "&lt;/span&gt; &lt;br /&gt;                + (tpo / tf).ToString());&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testPropertiesInterface = "&lt;/span&gt;  &lt;br /&gt;                + tpi.ToString() + &lt;span class="str"&gt;" mc, k = "&lt;/span&gt; &lt;br /&gt;                + (tpi / tf).ToString());&lt;br /&gt;            &lt;span class="rem"&gt;//Console.ReadKey();&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Init()&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                unit[i]     = &lt;span class="kwrd"&gt;new&lt;/span&gt; Unit(i, i * 2);&lt;br /&gt;                uniti[i]    = (iUnit)unit[i];&lt;br /&gt;                unitobj[i]  = (&lt;span class="kwrd"&gt;object&lt;/span&gt;)unit[i];&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestFields()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; n;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                n = unit[i].x + unit[i].y; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestProperties()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; n;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                n = unit[i].X + unit[i].Y;  &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestFieldsObject()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; n;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).x + ((Unit)unitobj[i]).x; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestPropertiesObject()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; n;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                n = ((Unit)unitobj[i]).X + ((Unit)unitobj[i]).Y; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestPropertiesInterface()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; n;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                n = uniti[i].iX + uniti[i].iY; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;interface&lt;/span&gt; iUnit&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; iX {get;}&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; iY {get;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Unit : iUnit&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; x;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; X { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; x; } }&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; iUnit.iX { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; x; } }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; y;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Y { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; y; } }&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; iUnit.iY { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; y; } }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Unit(&lt;span class="kwrd"&gt;int&lt;/span&gt; inX, &lt;span class="kwrd"&gt;int&lt;/span&gt; inY)&lt;br /&gt;        {&lt;br /&gt;            x = inX;&lt;br /&gt;            y = inY;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Я не буду уделять внимание коду, пример достаточно детский. Скажу только то, что по 10 инструкций в каждом цикле сделано для контрастного выделения времени выполнения тела цикла, от самой инструкции цикла.&lt;br /&gt;У меня программа отработала следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XDL74WV16Ms/SqkUNegE9aI/AAAAAAAAAE4/CWXPbl7I6Ls/s1600-h/1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;" src="http://1.bp.blogspot.com/_XDL74WV16Ms/SqkUNegE9aI/AAAAAAAAAE4/CWXPbl7I6Ls/s400/1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5379853451629229474" /&gt;&lt;/a&gt;&lt;br /&gt;На мой взгляд все достаточно наглядно. Самый скоростной способ это естественно  обращение к полю класса на прямую.&lt;br /&gt;А теперь поясню к чему рассказал и продемонстрировал прописную истину. Всем так же известно, что в разработке 3D, в отличие от бизнес, приложений особенно ярко выражена погоня за скоростью. Но тем не менее, специалисты начинающие(!) работать с XNA, уже как правило, достаточно уверенно себя ощущают в области C# разработки. Вот в этом то и заключается основной казус. Который объясняется тем фактом, что вся справочная и обучающая литература пестрит примерами описывающими доступ к полям классов через свойства. В следствии чего ребята начинают автоматически(!) применять данный подход во всех случаях. И там где это действительно необходимо, и где не очень. Да это хороший тон(!). Удобно перехватывать обращения к полю класса, обрабатывать возникающие при этом исключительные ситуации. Но не подходит для применения в 3D(!!!). &lt;br /&gt;Не всегда можно быстро выдать столько информации по данному вопросу очередному собеседнику. Да и сейчас я описал вопрос не за пять минут, но в дальнейшем могу с легкостью ссылаться на себя :).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Часть 2-я. Та же песня с Microsoft'ом.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Не для кого не секрет, что я люблю поковырять рефлектором все, что меня хотя бы мало-мальски интересует. Добавлю то, что порой это приносит больше информации, чем например чтение непосредственно MSDN. Поэтому в довесок к первой части я решил привести один(!) пример из библиотеки XNA.&lt;br /&gt;Рассмотрим XNA 3.1, виндовую библиотеку Microsoft.Xna.Framework.dll,&lt;br /&gt;одноименный namespace, и пусть подопытным будет структура Vector3.&lt;br /&gt;Вот часть кода данной структуры, в рамках которой мы сейчас и пообщаемся:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; Vector3&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; X;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Y;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Z;&lt;br /&gt;    ...&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Vector3 _one;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Vector3 One&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;               &lt;span class="kwrd"&gt;return&lt;/span&gt; _one;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    ...&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3(&lt;span class="kwrd"&gt;float&lt;/span&gt; x, &lt;span class="kwrd"&gt;float&lt;/span&gt; y, &lt;span class="kwrd"&gt;float&lt;/span&gt; z)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.X = x;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Y = y;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Z = z;&lt;br /&gt;    }&lt;br /&gt;    ...&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; Vector3()&lt;br /&gt;    {&lt;br /&gt;        ...&lt;br /&gt;        _one = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(1f, 1f, 1f);&lt;br /&gt;    ...&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;К полям X, Y и Z вопросов нет. Но обращаю ваше внимание на свойство One. По логике One возвращает единичный вектор постоянного значения. А вот тут по подробнее. Разум цепляется за формулировку "постоянное значение". Читаем MSDN и выясняем, что переменная или поле с постоянным значением может быть объявлена при помощи двух ключевых слов модификаторов доступа, которыми являются const и readonly. На всякий случай поясню формулировкой, переменная или поле постоянного значения бывает двух видов:&lt;br /&gt;- const -&gt; применяется при объявления полей и локальных переменных, постоянное  значение присваивается на этапе компиляции, исключительно(!) при объявлении;&lt;br /&gt;- readonly -&gt; применяется при объявления полей, значение может  присваивается как при объявлении, так и в конструкторе данного класса или структуры.&lt;br /&gt;Но речь идет о поле постоянного значения которое не возможно рассчитать при компиляции, что накладывает ряд ограничений и в соответствии с рассматриваемым нами случаем, расширим  формулировки: &lt;br /&gt;- Модификатор static не допускается в объявлении константы;&lt;br /&gt;- значение константы должно быть полностью вычислено во время компиляции;&lt;br /&gt;- Единственными возможными значениями для констант ссылочных типов являются  string и null;&lt;br /&gt;Ясное дело на static ставим крест, он однозначно не подходит. А вот readonly наш размерчик! И как нельзя лучше вписывается в нашу ситуацию. Потому, заранее уже зная куда нас это приведет, предлагаю по тестировать и сравнить время чтения значения из свойства стандартной структуры с чтением значения из иначе построенной структуры.&lt;br /&gt;Смотрим пример:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; TestFields&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; count;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            count = 10000000;&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testStandartVector3 = "&lt;/span&gt; + &lt;br /&gt;                TestStandartVector3().ToString() + &lt;br /&gt;                &lt;span class="str"&gt;" mc"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;"testMyVector3 = "&lt;/span&gt; + &lt;br /&gt;                TestMyVector3().ToString() + &lt;br /&gt;                &lt;span class="str"&gt;" mc"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestStandartVector3()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            Vector3 vec;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                vec = Vector3.One; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; TestMyVector3()&lt;br /&gt;        {&lt;br /&gt;            DateTime dtStart = DateTime.Now;&lt;br /&gt;            gVector3 vec;&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 0&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 5&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;br /&gt;                vec = gVector3.One; &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            DateTime dtEnd = DateTime.Now;&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (dtEnd - dtStart).TotalMilliseconds;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; gVector3&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; X;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Y;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Z;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; gVector3 One;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; gVector3(&lt;span class="kwrd"&gt;float&lt;/span&gt; x, &lt;span class="kwrd"&gt;float&lt;/span&gt; y, &lt;span class="kwrd"&gt;float&lt;/span&gt; z) &lt;br /&gt;        { &lt;br /&gt;            X = x;&lt;br /&gt;            Y = y;&lt;br /&gt;            Z = z;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; gVector3() &lt;br /&gt;        { &lt;br /&gt;            One = &lt;span class="kwrd"&gt;new&lt;/span&gt; gVector3(1, 1, 1);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Получаем вот такой вот результат:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XDL74WV16Ms/SqkUZIFYLEI/AAAAAAAAAFA/LauTGUDnGns/s1600-h/2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 104px;" src="http://4.bp.blogspot.com/_XDL74WV16Ms/SqkUZIFYLEI/AAAAAAAAAFA/LauTGUDnGns/s400/2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5379853651770092610" /&gt;&lt;/a&gt;&lt;br /&gt;Внимание вопрос(!): какая была необходимость реализовывать "постоянное значение" через свойство возвращающее значение приватного поля, если в сравнительном отношении скорости, с реализацией через модификатор доступа readonly, составляет разницу практически в(!) два раза? Мне не понятно, а вам? Буду очень признателен тому человеку, который вежливо мне объяснит.&lt;br /&gt;Товарищам, которые планируют достаточно часто применять постоянные вектора: &lt;br /&gt;- Zero;&lt;br /&gt;- One;&lt;br /&gt;- UnitX;&lt;br /&gt;- UnitY;&lt;br /&gt;- UnitZ;&lt;br /&gt;- Up;&lt;br /&gt;- Down;&lt;br /&gt;- Right;&lt;br /&gt;- Left;&lt;br /&gt;- Forward;&lt;br /&gt;- Backward.&lt;br /&gt;Рекомендую не использовать стандартные, а реализовать самостоятельно, как в выше приведенном примере.&lt;br /&gt;Мысль которую я хотел донести, звучит следующим образом: &lt;br /&gt;- изучайте все средства, которые собираетесь применять в своих проектах;&lt;br /&gt;- в результате изучения берите только лучшее и делайте наконец то сказку былью;&lt;br /&gt;- не знание законов не освобождает от ответственности. Это про специалистов, которые по своей беспечности, не разбираясь, применяют все подряд, а в последствии сетуют на Microsoft. Хотя это говорит с плохой стороны не(!) о Microsoft.&lt;br /&gt;- допуская то, что не смотря на "много букв", у читателей данной статьи мнения  разойдутся. Я добавил третью часть. Читать рекомендую всем, только одним принять к сведению, а иным просто улыбнуться. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Часть 3-я философская. Охотник или жертва?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Жертвам своей не компетентности, которые любят плохо отзываться о Microsoft, посвящается.&lt;br /&gt;Что, из себя, представляет понятие мода? Мода - в широком смысле этого слова, определяет стремление, того или иного человека, быть похожим на основное  большинство. Хм, так то оно так, когда в меру, без фанатизма и крайностей. А так же не идет в разрез с законами эволюции, которые не зависимо от нас хранят  приоритетное право "сильных" и "особенно удачных" особей выживать.  К примеру  обратная крайность это не формальные движения в нашем обществе.&lt;br /&gt;Применяем выше описанное отступление к нашей основной теме. И так у нас есть три основных типа людей. Систематизируем их и результат оформим в виде структуры:&lt;br /&gt;- ярко выражено не(!) довольные Microsoft'ом -&gt; модные "жертвы". Да, уже более  десяти лет считается модно и наверное круто так себя вести;&lt;br /&gt;- фанаты Microsoft'а -&gt; назовем их "панки", так веселее смотрится не формальное  определение. Обычно эти люди либо являются специалистами, но узкого профиля, либо совсем не являются таковыми. Если кого то обидел, сообщите мне. Я подберу более мягкое определение. &lt;br /&gt;- специалисты -&gt; "охотники". Ни кому не покланяются, ни кого не ругают. Им некогда отвлекаться на разную чушь. Эти люди берут от жизни только лучшее, прекрасно понимая при этом как и где это лучшее применять, и как и где не стоит. Они же становятся MCP, MVP, "черными поясами" Intel, … , и другими почетными товарищами.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Заключение.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну вот и все. Всем перца насыпал. Развеялся. Можно дальше "охотиться" ... оговорился :) ... работать и точить свое мастерство.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-2582044687183051298?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/2582044687183051298/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/09/xna-fps-i.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2582044687183051298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2582044687183051298'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/09/xna-fps-i.html' title='С#+XNA. В погоне за fps. I'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XDL74WV16Ms/SqkUNegE9aI/AAAAAAAAAE4/CWXPbl7I6Ls/s72-c/1.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-4665132720936110617</id><published>2009-08-29T15:07:00.005+04:00</published><updated>2009-08-30T11:21:21.761+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='caustic'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='water'/><title type='text'>XNA: Water video</title><content type='html'>Рекомендую смотреть в режиме HD 1024x768&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ez68CI5yYF8&amp;hl=ru&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ez68CI5yYF8&amp;hl=ru&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;В данном исполнении нет каустики. Но сейчас я заинтересовался этой темой, нагреб кучу инфы, изучаю ... пробую. &lt;br /&gt;Пока мои изыскания выглядят так:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7BXxLtQsYLc&amp;hl=ru&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7BXxLtQsYLc&amp;hl=ru&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Т.е. простое вычисление в один (сильно тяжелые вычисления для real time) проход на CPU.&lt;br /&gt;&lt;br /&gt;Пока делал первое видео, в глаза бросилась вот какая штука. Изначально видео с водичкой весило 2,092 ГБ, конвертировал при помощи &lt;a href="http://www.techsmith.com/download/camtasiatrial.asp"&gt;Camtasia Studio&lt;/a&gt; и как то сильно быстро изменялся прогресс конвертирования. Посмотрел загрузку процессоров ... и о чудо. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XDL74WV16Ms/SpkwSkU6M6I/AAAAAAAAAEw/x1jyfJUn6oo/s1600-h/camtasia+studio+calculation.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 166px;" src="http://4.bp.blogspot.com/_XDL74WV16Ms/SpkwSkU6M6I/AAAAAAAAAEw/x1jyfJUn6oo/s400/camtasia+studio+calculation.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5375380725790552994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Camtasia Studio умеет распределять вычисления на все доступные процессоры.&lt;br /&gt;Конвертация прошла в real time режиме :). Очень порадовало!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-4665132720936110617?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/4665132720936110617/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/xna-water-video.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4665132720936110617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/4665132720936110617'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/xna-water-video.html' title='XNA: Water video'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XDL74WV16Ms/SpkwSkU6M6I/AAAAAAAAAEw/x1jyfJUn6oo/s72-c/camtasia+studio+calculation.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-2573479013343617137</id><published>2009-08-24T22:56:00.003+04:00</published><updated>2009-08-24T23:01:05.281+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='water'/><title type='text'>XNA: Water - проба пера</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/SpLiqiyY51I/AAAAAAAAAEo/KyllFXoyCvE/s1600-h/Water.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/SpLiqiyY51I/AAAAAAAAAEo/KyllFXoyCvE/s400/Water.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373606525926958930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сферическая карта неба + пока простая водичка.&lt;br /&gt;Превый блин, так сказать, в этом направлении.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-2573479013343617137?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/2573479013343617137/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/xna-water.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2573479013343617137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/2573479013343617137'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/xna-water.html' title='XNA: Water - проба пера'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XDL74WV16Ms/SpLiqiyY51I/AAAAAAAAAEo/KyllFXoyCvE/s72-c/Water.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8102853242802360712</id><published>2009-08-10T00:11:00.013+04:00</published><updated>2009-08-11T22:01:52.147+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msdn subscriptions'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='technet subscriptions'/><category scheme='http://www.blogger.com/atom/ns#' term='dreamspark'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='bizspark'/><title type='text'>Windows 7 RTM Now Available for MSDN and TechNet Plus Subscribers</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Windows 7 RTM стала доступна для подписчиков MSDN и TECHNET+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sn8uxfxshiI/AAAAAAAAAEY/dCO1Tv3BUH0/s1600-h/aa336858.win7banner_msdn_RU2(ru-ru,MSDN.10).gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 49px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sn8uxfxshiI/AAAAAAAAAEY/dCO1Tv3BUH0/s400/aa336858.win7banner_msdn_RU2(ru-ru,MSDN.10).gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5368060708727326242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sn8u3rKD6cI/AAAAAAAAAEg/lM4cPyXIrAU/s1600-h/ms788692.win7banner_technet_EN(en-us,MSDN.10).gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 49px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sn8u3rKD6cI/AAAAAAAAAEg/lM4cPyXIrAU/s400/ms788692.win7banner_technet_EN(en-us,MSDN.10).gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5368060814861527490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7 августа, для счастливых обладателей подписок &lt;a href="http://msdn.microsoft.com/ru-ru/subscriptions/default.aspx"&gt;MSDN Subscription&lt;/a&gt; и &lt;a href="http://technet.microsoft.com/en-us/subscriptions/default.aspx"&gt;TECHNET Subscription&lt;/a&gt; стала доступна для скачивания &lt;span style="font-weight:bold;"&gt;Windows 7 RTM&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;несколько строк из приглашения:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Dear ...&lt;br /&gt;Как TechNet Плюс подписчик, Вы имеете преимущество того, чтобы быть среди первых в мире имеющих доступ к Windows 7 RTM.  &lt;br /&gt;Загрузите свою копию Windows 7 RTM и начните оценивать сегодня! &lt;br /&gt;...&lt;br /&gt;Windows Home Premium это - большой выбор для дома и для бизнеса.&lt;br /&gt;...&lt;br /&gt;Посетите Windows Springboard, полную последних ресурсов для Windows 7 включая ресурсы для прикладной совместимости, организации сети, работы и совместимости аппаратных средств, и много другого.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Мне крайне повезло иметь обе подписки. Очень рекомендую всем. Любая из этих подписок очень полезная штука. &lt;br /&gt;&lt;br /&gt;Немного поясню для тех кто не знает что это.&lt;br /&gt;-Во первых, платно подписаться может любой.&lt;br /&gt;-Во вторых подписку можно получить в награду при определенных стечениях обстоятельств. Мне известно пока только об одной подобной возможности, т.к. сам получил обе подписки как бонус к награде MVP (&lt;a href="http://www.microsoft.com/rus/communities/mvp/default.mspx"&gt;Microsoft MVP&lt;/a&gt;, &lt;a href="http://blogs.gotdotnet.ru/personal/allo/permalink.aspx?guid=bdf3726c-e5b2-4513-a314-1a7de2ffba20"&gt;Кто такие MVP?&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/allo/archive/2009/04/29/rd-mvp.aspx"&gt;Кто такие RD и MVP?&lt;/a&gt;).&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(пока писал, вспомнил о еще одной из &lt;span style="font-weight:bold;"&gt;без платных&lt;/span&gt; возможностей)&lt;/span&gt;&lt;br /&gt;- программа для бизнеса &lt;a href="http://ms-start.ru/Programs/BizSpark.aspx"&gt;BizSpark&lt;/a&gt;. &lt;a href="http://www.microsoft.com/rus/microsoft4you/documents/bizspark/default.aspx"&gt;Описание программы BizSpark&lt;/a&gt;, &lt;a href="http://bizspark.softline.ru"&gt;описание от Softline&lt;/a&gt; (партнера по сообществу BizSpark) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Что же такого интересного в этих подписках? &lt;br /&gt;Коротко вкусности выглядят так:&lt;br /&gt;-Обновленные продукты (6)&lt;br /&gt;-Business Solutions (25)&lt;br /&gt;-Библиотека MSDN (11)&lt;br /&gt;-Операционные системы (29)&lt;br /&gt;-Приложения (57)&lt;br /&gt;-Серверы (65)&lt;br /&gt;-Средства для разработчиков (42)&lt;br /&gt;-Средства и ресурсы (105)&lt;br /&gt;-Средства проектирования (4)&lt;br /&gt;&lt;br /&gt;Там все, что вам нужно для счастья. Ко всему ПО (которое требует) там же можно получить ключи, скачать и оценить в полной мере. Под словами «в полной мере» я имею в виду установить, официально зарегистрировать, получить все обновления и в результате оценить продукт по достоинству в настоящем виде. Фишка не для дилетантов, а для людей ценящих свое время, силы и деньги. Переиначу известную поговорку - «Мы не на столько богаты, что бы тратить деньги на дешевые пиратские подделки».&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8102853242802360712?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8102853242802360712/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/windows-7-rtm-now-available-for-msdn.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8102853242802360712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8102853242802360712'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/08/windows-7-rtm-now-available-for-msdn.html' title='Windows 7 RTM Now Available for MSDN and TechNet Plus Subscribers'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XDL74WV16Ms/Sn8uxfxshiI/AAAAAAAAAEY/dCO1Tv3BUH0/s72-c/aa336858.win7banner_msdn_RU2(ru-ru,MSDN.10).gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-1990900870385446233</id><published>2009-07-17T14:21:00.005+04:00</published><updated>2009-08-30T11:21:50.510+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='instancing'/><title type='text'>Video: Animated Skinned Instancing</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FKFNA7EyHp0&amp;hl=ru&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FKFNA7EyHp0&amp;hl=ru&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;У каждой модельки свой прогресс анимации.&lt;br /&gt;Как то так.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-1990900870385446233?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/1990900870385446233/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/07/animated-skinned-instancing.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1990900870385446233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/1990900870385446233'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/07/animated-skinned-instancing.html' title='Video: Animated Skinned Instancing'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-7727848147263177228</id><published>2009-06-21T08:28:00.010+04:00</published><updated>2009-07-15T22:54:43.675+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calculation'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>UV координаты вершины принадлежащей треугольнику</title><content type='html'>При сложном разбиении mesh’а (дополнительная генерация геометрии), треугольники дробятся таким образом, что текстурные координаты новых вершин бывает не так просто вычислить. Потому, что новая вершина может по разным причинам быть различно удаленной от вершин треугольника. Вспомнил, что как то приводил свой вывод расчета в форуме &lt;a href="http://www.xnadev.ru/"&gt;xnadev.ru&lt;/a&gt;, но как понадобилось самому, долго искал, где именно.&lt;br /&gt;&lt;br /&gt;Делаю для себя заначку, чтоб добру не пропадать:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System; &lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework; &lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Test &lt;br /&gt;{ &lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TestMath2 &lt;br /&gt; { &lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; TestMath2() &lt;br /&gt; { &lt;br /&gt; &lt;span class="rem"&gt;// вершины треугольника &lt;/span&gt;&lt;br /&gt; Vector3 A = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(1f, -1f, 0f); &lt;br /&gt; Vector3 B = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(3f, -4f, 0f); &lt;br /&gt; Vector3 C = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(5f, -1f, 0f); &lt;br /&gt; &lt;span class="rem"&gt;// текстурные координаты вершин &lt;/span&gt;&lt;br /&gt; Vector2 tA = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(1f, 1f); &lt;br /&gt; Vector2 tB = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(3f, 4f); &lt;br /&gt; Vector2 tC = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(5f, 1f); &lt;br /&gt; &lt;span class="rem"&gt;// точка в плоскости треугольника ограниченная его гранями &lt;/span&gt;&lt;br /&gt; Vector3 D = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(3f, -2f, 0f); &lt;br /&gt; &lt;span class="rem"&gt;//           B &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//           . &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//          / \ &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//         /   \ &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//        /     \ &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//       /   .D  \ &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//      /         \ &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//     .-----------. &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;//  A               C &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;// расчет &lt;/span&gt;&lt;br /&gt; Vector2 tD = CalculationDuvFromABC( A, tA, &lt;br /&gt; B, tB, &lt;br /&gt; C, tC, &lt;br /&gt; D); &lt;br /&gt; } &lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Нахождение текстурных координат точки D &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки A &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Текстурные координаты точки A &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки B &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Текстурные координаты точки B &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки C &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Текстурные координаты точки C &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки D &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Текстурные координаты точки D &lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; Vector2 CalculationDuvFromABC( Vector3 A, Vector2 tA, &lt;br /&gt; Vector3 B, Vector2 tB, &lt;br /&gt; Vector3 C, Vector2 tC, &lt;br /&gt; Vector3 D) &lt;br /&gt; { &lt;br /&gt; Vector3 E = PointOfLinesCrossing(A, B, C, D); &lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; kAEC = (E - A).Length() / (C - A).Length(); &lt;br /&gt; Vector2 tE = tA + (tC - tA) * kAEC; &lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; kBDE = (D - B).Length() / (E - B).Length(); &lt;br /&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; (Vector2)(tB + (tE - tB) * kBDE); &lt;br /&gt; } &lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Нахождение позиции точки пересечения двух прямых, &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// проходящих через точки AC и BD &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки A &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки B &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки C &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки D &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Позиция точки E, полученной пересечением двух прямых AC и BD &lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; Vector3 PointOfLinesCrossing(Vector3 A, Vector3 B, Vector3 C, Vector3 D) &lt;br /&gt; { &lt;br /&gt; Vector3 vecAC = C - A; &lt;br /&gt; Vector3 vecBD = D - B; &lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Tac = Math.Abs( Matrix2x2Determinant( vecBD.X, A.X - B.X, &lt;br /&gt; vecBD.Y, A.Y - B.Y) &lt;br /&gt; / &lt;br /&gt; Matrix2x2Determinant( vecBD.X, vecAC.X, &lt;br /&gt; vecBD.Y, vecAC.Y)); &lt;br /&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; Vector3.Add(A, Vector3.Multiply(vecAC, Tac)); &lt;br /&gt; } &lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Определитель матрицы 2х2 &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// a00 &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// a01 &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// a10 &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// a11 &lt;/span&gt;&lt;br /&gt; &lt;span class="rem"&gt;/// Определитель &lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Matrix2x2Determinant( &lt;span class="kwrd"&gt;float&lt;/span&gt; a00, &lt;span class="kwrd"&gt;float&lt;/span&gt; a01, &lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; a10, &lt;span class="kwrd"&gt;float&lt;/span&gt; a11) &lt;br /&gt; { &lt;br /&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;float&lt;/span&gt;)(a00 * a11 - a10 * a01); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-7727848147263177228?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/7727848147263177228/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/uv.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7727848147263177228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/7727848147263177228'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/uv.html' title='UV координаты вершины принадлежащей треугольнику'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-289379167007987189</id><published>2009-06-21T08:01:00.004+04:00</published><updated>2009-06-21T08:07:48.019+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Intel'/><title type='text'>Процессор Intel® Core™ i7 (Nehalem)</title><content type='html'>Вот уже чуть менее полу года такой кристалл (920) живет в моем доме. А чувство восторга не стало меньше. Свой вклад конечно же (подливает масла в огонь) вносит nVIDIA GeForce GTX 280.  Вполне возможно это так же связанно с тем, что предыдущая смена железа была в далеком 2003 году. Кто знает.&lt;br /&gt;&lt;br /&gt;Приведу список ссылок, где расписаны умения этого творения рук человеческих:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.techdays.ru/videos/1231.html"&gt;i7 SDK (Software Development Key): ключ к разработке эффективных программ для новейшего процессора Intel Core i7&lt;/a&gt; – подробный видео доклад доступен на &lt;a href="http://www.techdays.ru"&gt;www.techdays.ru&lt;/a&gt;. Докдладчик &lt;a href="http://www.techdays.ru/speaker/Zhislina_Victoria.html"&gt;Victoria Zhislina&lt;/a&gt; работает в компании Intel с 1997 года и имеет экстремальный опыт создания графических библиотек и многопоточных приложений. В настоящее время занимается технической поддержкой компаний-разработчиков программного обеспечения, помогая им внедрить и эффективно использовать в своих продуктах возможности аппаратных платформ Intel (copy/paste).&lt;br /&gt; &lt;br /&gt;- &lt;a href="http://www.intel.com/cd/products/services/emea/rus/processors/corei7/406043.htm"&gt;описание Intel’а&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;- &lt;a href="http://ru.wikipedia.org/wiki/Intel_Core_i7"&gt;википедия&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;P.S. если раньше не хватало процессоров, то сейчас самостоятельному Indie не хватает рук и времени …&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-289379167007987189?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/289379167007987189/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/intel-core-i7-nehalem.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/289379167007987189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/289379167007987189'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/intel-core-i7-nehalem.html' title='Процессор Intel® Core™ i7 (Nehalem)'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-3191291043832461247</id><published>2009-06-21T04:45:00.010+04:00</published><updated>2009-08-30T11:22:18.476+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='landscape'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Terrain Geomorphing in the Vertex Shader</title><content type='html'>Читал несколько статей на эту тему. Искал с рабочими примерами (желательно на XNA + HLSL), конкретно с пред расчетом и готовым шейдером. Но нашел только много теории и не для XNA и DirectX, а в общем. Написано умно,  ничего не понял. Конкретно озадачив себя, просидел как всегда допоздна. На утро, проснулся с готовым представлением о содержимом шейдера. Мне повезло.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj2Hcdjqm_I/AAAAAAAAADo/_tE-Ir4UFyk/s1600-h/Terrain+Geomorphing+in+the+Vertex+Shader.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 311px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj2Hcdjqm_I/AAAAAAAAADo/_tE-Ir4UFyk/s400/Terrain+Geomorphing+in+the+Vertex+Shader.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5349580855426325490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Демонстрация:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tCU_kpH2wKM&amp;hl=ru&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/tCU_kpH2wKM&amp;hl=ru&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;И так по порядку.&lt;br /&gt;Рассмотрим вот такую картинку:&lt;br /&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj2W-XpYC9I/AAAAAAAAADw/DvNUrG-_PgQ/s1600-h/Terrain+Geomorphing+in+the+Vertex+Shader0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 200px;" src="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj2W-XpYC9I/AAAAAAAAADw/DvNUrG-_PgQ/s400/Terrain+Geomorphing+in+the+Vertex+Shader0.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5349597930629630930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Здесь изображен процесс перехода между уровнями детализации ландшафта.&lt;br /&gt;черным цветом - контур геометрии предыдущего слоя детализации;&lt;br /&gt;синим цветом – его вершины;&lt;br /&gt;красным цветом – вершины нового уровня детализации.&lt;br /&gt;зеленым цветом – выделен контур новой геометрии с учетом достроенных вершин, в следствии разбиения;&lt;br /&gt;фиолетовым цветом – вершины середин отрезков между вершинами предыдущего слоя детализации;&lt;br /&gt;красные вектора в низ – delta вектора разности между серединами отрезков вершин предыдущего слоя и соответствующими им новыми вершинами. Дальше по тексту разъясню подробнее.&lt;br /&gt;&lt;br /&gt;Что из себя представляет «Terrain Geomorphing in the Vertex Shader»?&lt;br /&gt;Если посмотреть более пристально на видео пример к моей предыдущей статье "&lt;a href="http://dtimofeev.blogspot.com/2009/06/procedural-landscape-on-xna-game-studio.html"&gt;Procedural Landscape on XNA Game Studio 3.0&lt;/a&gt;", где нет геоморфинга,то можно увидеть как «выпрыгивает» (новый научный термин) новая геометрия, при наезде друг на друга слоев с различной детализацией. &lt;br /&gt;&lt;br /&gt;Это не есть good!&lt;br /&gt;&lt;br /&gt;Легко избежать этого можно следующим образом:&lt;br /&gt;- для каждой достраиваемой вершине в новом, более детализированном слое рассчитываем ее положение на середине отрезка построенного между соседними вершинами старого, менее детализированного слоя. Эта вершина поможет нам скрыть (замаскировать) первоначальную разницу изменения геометрии. И находим вектор разницу между этой вершиной и вершиной с реальным значением высоты. Вектор должен быть именно такого направления как показано на рисунке. Это даст нам возможность при его сложении с реальной вершиной опускать ее до уровня середины отрезка.&lt;br /&gt;&lt;br /&gt;Нам понадобится следующее описание формата вершин для хранения выше описанных данных:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; gEngine.gProgressiveLandscape&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; gplVertexPositionNormalTexture&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3  Position;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3  PositionGeomorphing;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3  Normal;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3  NormalGeomorphing;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2  TextureCoordinate;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt;    IndexDetailedLayer;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; VertexElement[] VertexElements;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; gplVertexPositionNormalTexture()&lt;br /&gt;        {&lt;br /&gt;            VertexElements = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement[6];&lt;br /&gt;            &lt;span class="kwrd"&gt;short&lt;/span&gt; offset    = 0;&lt;br /&gt;            &lt;span class="rem"&gt;// Position&lt;/span&gt;&lt;br /&gt;            VertexElements[0] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset, &lt;br /&gt;                                            VertexElementFormat.Vector3, &lt;br /&gt;                                            VertexElementMethod.Default, &lt;br /&gt;                                            VertexElementUsage.Position, 0);&lt;br /&gt;            offset += (&lt;span class="kwrd"&gt;short&lt;/span&gt;)Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3());&lt;br /&gt;            &lt;span class="rem"&gt;// PositionGeomorphing&lt;/span&gt;&lt;br /&gt;            VertexElements[1] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset, &lt;br /&gt;                                            VertexElementFormat.Vector3, &lt;br /&gt;                                            VertexElementMethod.Default, &lt;br /&gt;                                            VertexElementUsage.Position, 1);            &lt;span class="rem"&gt;// !&lt;/span&gt;&lt;br /&gt;            offset += (&lt;span class="kwrd"&gt;short&lt;/span&gt;)Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3());&lt;br /&gt;            &lt;span class="rem"&gt;// Normal&lt;/span&gt;&lt;br /&gt;            VertexElements[2] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset,&lt;br /&gt;                                            VertexElementFormat.Vector3,&lt;br /&gt;                                            VertexElementMethod.Default,&lt;br /&gt;                                            VertexElementUsage.Normal, 0);&lt;br /&gt;            offset += (&lt;span class="kwrd"&gt;short&lt;/span&gt;)Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3());&lt;br /&gt;            &lt;span class="rem"&gt;// NormalGeomorphing&lt;/span&gt;&lt;br /&gt;            VertexElements[3] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset,&lt;br /&gt;                                            VertexElementFormat.Vector3,&lt;br /&gt;                                            VertexElementMethod.Default,&lt;br /&gt;                                            VertexElementUsage.Normal, 1);              &lt;span class="rem"&gt;// !&lt;/span&gt;&lt;br /&gt;            offset += (&lt;span class="kwrd"&gt;short&lt;/span&gt;)Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3());&lt;br /&gt;            &lt;span class="rem"&gt;// TextureCoordinate&lt;/span&gt;&lt;br /&gt;            VertexElements[4] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset,&lt;br /&gt;                                            VertexElementFormat.Vector2,&lt;br /&gt;                                            VertexElementMethod.Default,&lt;br /&gt;                                            VertexElementUsage.TextureCoordinate, 0);&lt;br /&gt;            offset += (&lt;span class="kwrd"&gt;short&lt;/span&gt;)Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2());&lt;br /&gt;            &lt;span class="rem"&gt;// NamberDetailedLayer&lt;/span&gt;&lt;br /&gt;            VertexElements[5] = &lt;span class="kwrd"&gt;new&lt;/span&gt; VertexElement(0, offset,&lt;br /&gt;                                            VertexElementFormat.Single,&lt;br /&gt;                                            VertexElementMethod.Default,&lt;br /&gt;                                            VertexElementUsage.TextureCoordinate, 1);   &lt;span class="rem"&gt;// !&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; gplVertexPositionNormalTexture(  Vector3 position,&lt;br /&gt;                                                Vector3 positionGeomorphing,&lt;br /&gt;                                                Vector3 normal,&lt;br /&gt;                                                Vector3 normalGeomorphing,&lt;br /&gt;                                                Vector2 textureCoordinate,&lt;br /&gt;                                                &lt;span class="kwrd"&gt;float&lt;/span&gt; indexDetailedLayer)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Position               = position;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.PositionGeomorphing    = positionGeomorphing;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Normal                 = normal;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.NormalGeomorphing      = normalGeomorphing;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.TextureCoordinate      = textureCoordinate;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.IndexDetailedLayer     = indexDetailedLayer;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SizeInBytes&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(   Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3()) + &lt;br /&gt;                                Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3()) +&lt;br /&gt;                                Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3()) +&lt;br /&gt;                                Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3()) +&lt;br /&gt;                                Marshal.SizeOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2()) +&lt;br /&gt;                                &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(&lt;span class="kwrd"&gt;float&lt;/span&gt;));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Здесь PositionGeomorphing и есть то поле для хранения вектора смещения.&lt;br /&gt;&lt;br /&gt;Нечто похожее делаем и с нормалями.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Все волшебство произойдет в шейдере!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Куда мы передадим дополительную информацию о:&lt;br /&gt;float3 vEyePosition; - положении камеры&lt;br /&gt;float layerRadius[7]; - реальные размеры уровней детализации&lt;br /&gt;&lt;br /&gt;Для каждой вершины будем считать удаление от камеры, по ее индексу выбирать данные, из массива размеров уровней детализации, для расчета коэффициента затухания вектора PositionGeomorphing.&lt;br /&gt;&lt;br /&gt;Сам шейдер выглядит следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;float4x4 matWorld   : WORLD;&lt;br /&gt;float4x4 matWVP     : WORLDVIEWPROJECTION;&lt;br /&gt;&lt;br /&gt;float3  vLightPosition;&lt;br /&gt;float3  vEyePosition;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt;  layerRadius[7];&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; fogBegin = 200.0f;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; fogEnd = 400.0f;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;struct&lt;/span&gt; VS_INPUT&lt;br /&gt;{&lt;br /&gt;    float3 Position             : POSITION0;&lt;br /&gt;    float3 PositionGeomorphing  : POSITION1;&lt;br /&gt;    float3 Normal               : NORMAL0;&lt;br /&gt;    float3 NormalGeomorphing    : NORMAL1;&lt;br /&gt;    float2 Texcoord             : TEXCOORD0;&lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; IndexDetailedLayer  : TEXCOORD1;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;struct&lt;/span&gt; VS_OUTPUT&lt;br /&gt;{&lt;br /&gt;    float4 Position    : POSITION0;&lt;br /&gt;    float2 Texcoord    : TEXCOORD0;&lt;br /&gt;    float3 Light       : TEXCOORD1;&lt;br /&gt;    float3 Normal      : TEXCOORD2;&lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Fog      : TEXCOORD3; &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;VS_OUTPUT VS(VS_INPUT In)&lt;br /&gt;{&lt;br /&gt;    VS_OUTPUT Out = ( VS_OUTPUT ) 0;&lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Distance = length ( In.Position - vEyePosition );&lt;br /&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; K   = clamp  ((( Distance / layerRadius[In.IndexDetailedLayer] - 0.5f ) * 2.0f ), 0.0f, 1.0f );&lt;br /&gt;    Out.Position = mul  ( float4(In.Position + In.PositionGeomorphing * K, 1.0f ), matWVP );&lt;br /&gt;    Out.Fog   = clamp  ((( 1.0f - (Distance - fogBegin) / fogEnd) - 0.5f) * 2.0f, 0.0f, 1.0f);&lt;br /&gt; &lt;span class="rem"&gt;//Out.Fog = 1.0f;&lt;/span&gt;&lt;br /&gt;    Out.Texcoord = In.Texcoord;&lt;br /&gt;    Out.Light  = normalize ( mul(vLightPosition, matWorld) );&lt;br /&gt;    Out.Normal  = normalize ( mul( In.Normal + In.NormalGeomorphing * K, matWorld ) ); &lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; Out;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;texture tex;&lt;br /&gt;sampler2D sTexture = sampler_state&lt;br /&gt;{&lt;br /&gt;   Texture = (tex);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; spec = 0.5f;&lt;br /&gt;&lt;br /&gt;float4 PS(VS_OUTPUT In) : COLOR0&lt;br /&gt;{&lt;br /&gt; float4 specColor = tex2D( sTexture, In.Texcoord ) * spec;&lt;br /&gt; float4 diffColor = clamp( tex2D( sTexture, In.Texcoord ) * dot( In.Normal, In.Light ), 0.0f, 1.0f );&lt;br /&gt; float4 color  = float4(1.0f, 1.0f, 1.0f, 1.0f) * (1.0f - In.Fog) + (diffColor + specColor) * In.Fog;&lt;br /&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;technique TerrainGeomorphing&lt;br /&gt;{&lt;br /&gt;    pass Pass1&lt;br /&gt;    {&lt;br /&gt;        VertexShader = compile vs_3_0 VS();&lt;br /&gt;        PixelShader  = compile ps_3_0 PS();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Да, в шейдере добавлен расчет тумана, его можно выбросить. Он влияет только на текстурирование.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dtimofeev.blogspot.com/2009/06/terrain-geomorphing-in-vertex-shader.html"&gt;Оригинальный блог&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-3191291043832461247?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/3191291043832461247/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/terrain-geomorphing-in-vertex-shader.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3191291043832461247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/3191291043832461247'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/terrain-geomorphing-in-vertex-shader.html' title='Terrain Geomorphing in the Vertex Shader'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XDL74WV16Ms/Sj2Hcdjqm_I/AAAAAAAAADo/_tE-Ir4UFyk/s72-c/Terrain+Geomorphing+in+the+Vertex+Shader.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8315166855615834363</id><published>2009-06-21T00:40:00.014+04:00</published><updated>2009-08-30T11:22:47.816+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='landscape'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Procedural Landscape on XNA Game Studio 3.0</title><content type='html'>Динамический ландшафт&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj1utUQsl0I/AAAAAAAAADQ/XZrg1-PNvTw/s1600-h/landscape.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 302px;" src="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj1utUQsl0I/AAAAAAAAADQ/XZrg1-PNvTw/s400/landscape.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5349553657197926210" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Демонстрация:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BJZromjBGXI&amp;hl=ru&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/BJZromjBGXI&amp;hl=ru&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;На видео я намеренно включаю рисование сетки треугольников и поднимаю камеру над ландшафтом. Для наглядности так же выключил, из расчета, определение видимых слоев детализации по мере взлета, потому видно все. Обращаем внимание на fps (когда камера высоко не в счет, по выше описанной причине)&lt;br /&gt;&lt;br /&gt;Закончил эту часть работы давно. Даже успели обсудить на xnadev.ru . Сейчас данный проект уже несколько раз преобразился. Возможно, в скором времени, дойдут руки сделать новое видео. Как раз будет повод рассказать о том, что из себя представляет «Terrain Geomorphing in the Vertex Shader» и с чем его едят. Пока расскажу об этом этапе.&lt;br /&gt;&lt;br /&gt;Как это делалось?&lt;br /&gt;&lt;br /&gt;Описал представление слоев детализации и данных о вершинах.&lt;br /&gt;Карта логики представления слоев детализации выглядит так:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj1RPtq1InI/AAAAAAAAADA/dEemQ92DCZ4/s1600-h/map+layers.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 360px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj1RPtq1InI/AAAAAAAAADA/dEemQ92DCZ4/s400/map+layers.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5349521262785143410" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Карта логики связывания вершин слоев детализации в треугольники, с учетом связей между соседними слоями выглядит так:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj1Rxu-7NiI/AAAAAAAAADI/UkgwbzseXpQ/s1600-h/map+layers+4x.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_XDL74WV16Ms/Sj1Rxu-7NiI/AAAAAAAAADI/UkgwbzseXpQ/s400/map+layers+4x.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5349521847253415458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;На обеих картинках цвета слоев не совпадают. Лень переделывать. Просто остались наработанные картинки, которые изначально не предназначались для статьи.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для каждого слоя детализации происходит проверка изменения положения камеры. Если произошло смещение на расстояние равное шагу данного слоя детализации, значит этот слой участвует в рекурсивной генерации новых данных для индексного буфера. Данный механизм запускается в отдельном потоке каждый раз, когда помечается на обновление слой с самой высокой детализацией. А далее проверяется выше описанное условие для остальных слоев.&lt;br /&gt;В потоке выполняются следующие операции:&lt;br /&gt;&lt;br /&gt;        private void        backgroundWorker_DoWork&lt;br /&gt;                                                    (object sender, DoWorkEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            PartitionLevels();&lt;br /&gt;            geometry.InitIndex();&lt;br /&gt;            geometry.GenNormal();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;- разбиение слоев детализации, добавление новых вершин (и корректировка их высот) в единый массив вершин;&lt;br /&gt;- инициализация единого массива индексов, связывающих все треугольники (вершины), всех слоев детализации.&lt;br /&gt;- генерация нормалей.&lt;br /&gt;&lt;br /&gt;На пальцах все это выглядит просто, для оценки реализации приведу пример рекурсивного метода, рассчитывающего интервал значений индексного массива, соответствующего ветке дерева визуализации нулевого слоя детализации. &lt;br /&gt;Честное слово, мне проще код писать, чем слова в предложения собирать. Не ругайте сильно, но по другому мне сложно коротко сформулировать ту кучу "каракуль", которыми я исписал свой блокнот, занимаясь данной темой. &lt;br /&gt;Нулевым в данном случае является слой наименьшей детализации. Что бы окончательно Вас запутать. Скажу что понятия уровней детализации и дерева детализации тесно сплетены между собой. Дерево это восходящие, из слоя нулевой детализации, ветви  связей перпендикулярно пересекающие  по иерархии старшинства следующие уровни (плоскости) детализации, разделяясь в точке пересечения на четыре наследника. Потому Quad tree. Зачем все так сложно? Зачем представление в виде дерева и плоскостей? Все просто. Каждое представление для выполнения различных задач. Каждые задачи наиболее быстро выполняются только в одном из представлений. Плоскости для линейных задач, дерево для рекурсивных и отслеживания наследственных связей. Выше упомянутый обещанный рекурсивный метод возвращает все индексы всех треугольников ограниченных габаритами одной ветки нулевого слоя детализации.&lt;br /&gt;&lt;br /&gt;Блок схема обещанного метода:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XDL74WV16Ms/Sj1u8OEwqhI/AAAAAAAAADY/mchsR6b0Tuo/s1600-h/landscape+init+idex.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 184px; height: 400px;" src="http://4.bp.blogspot.com/_XDL74WV16Ms/Sj1u8OEwqhI/AAAAAAAAADY/mchsR6b0Tuo/s400/landscape+init+idex.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5349553913235286546" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Блок схема автоматически сгенерирована примочкой к Visual Studio под названием «Microsoft Visual Studio Learning Pack 2.0»&lt;br /&gt;&lt;br /&gt;Код метода:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;Код метода:&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Рекурсивная сборка индексов отдельной ветки дерава уровней детализации ландшафта&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitNodeIndex (gplNode inNode, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; inIndex)&lt;br /&gt;{&lt;br /&gt;&lt;span class="rem"&gt;// --- уровень детализации ---------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; l = inNode.Level;&lt;br /&gt;&lt;span class="rem"&gt;// --- индекс активной ветки --------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; i = inNode.Index;&lt;br /&gt;&lt;span class="rem"&gt;// --- размеры активного уровня детализации -----------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; w = levelInfo[l].W;&lt;br /&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; h = levelInfo[l].H;&lt;br /&gt;&lt;span class="rem"&gt;// --- признаки соединение со слоем более низкой детализации ------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; bLeft = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; bRight = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; bUp = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; bDown = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span class="rem"&gt;// --- индексные направления слоя для псевдодвухмерной карты ------&lt;/span&gt;&lt;br /&gt;gxplTrends trends = &lt;span class="kwrd"&gt;new&lt;/span&gt; gxplTrends();&lt;br /&gt;trends.NewTrends(i, w);&lt;br /&gt;&lt;span class="rem"&gt;// --- если ветка не разбита ----------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (inNode.NodeChildren == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- собираем два треугольника ---------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// - 1й треугольник -----------------------&lt;/span&gt;&lt;br /&gt;indices[inIndex + 0] = trends.Center;&lt;br /&gt;indices[inIndex + 1] = trends.Right;&lt;br /&gt;indices[inIndex + 2] = trends.Down;&lt;br /&gt;&lt;span class="rem"&gt;// - 2й треугольник -----------------------&lt;/span&gt;&lt;br /&gt;indices[inIndex + 3] = trends.Down;&lt;br /&gt;indices[inIndex + 4] = trends.Right;&lt;br /&gt;indices[inIndex + 5] = trends.DownRight;&lt;br /&gt;inIndex += 6;&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --- если разбита -------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- определение режима соединения с соседними ветками ---------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// --- check left join --------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//if (!bNoLeft)&lt;/span&gt;&lt;br /&gt;bLeft = (inNode.Coord.X &amp;gt; levelInfo[l].SX0) ?&lt;br /&gt;map[trends.Left].NodeChildren == &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="rem"&gt;// --- check right join -------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//if (!bNoRight)&lt;/span&gt;&lt;br /&gt;bRight = (inNode.Coord.X &amp;lt; levelInfo[l].SX0 + levelInfo[l].W - 1) ?&lt;br /&gt;map[trends.Right].NodeChildren == &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="rem"&gt;// --- check up join ----------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//if (!bNoUp)&lt;/span&gt;&lt;br /&gt;bUp = (inNode.Coord.Y &amp;gt; levelInfo[l].SY0) ?&lt;br /&gt;map[trends.Up].NodeChildren == &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="rem"&gt;// --- check down join --------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//if (!bNoDown)&lt;/span&gt;&lt;br /&gt;bDown = (inNode.Coord.Y &amp;lt; levelInfo[l].SY0 + levelInfo[l].H - 1) ?&lt;br /&gt;map[trends.Down].NodeChildren == &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- сборка всех треугольников с учетом связей различных слоев детализации -------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// --- индексные направления слоя +1 для псевдодвухмерной карты -------------------------&lt;/span&gt;&lt;br /&gt;gxplTrends trends4x3 = &lt;span class="kwrd"&gt;new&lt;/span&gt; gxplTrends(inNode.NodeChildren[3].Index, levelInfo[l + 1].W);&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- если с лева соединение с более высокой детализацией --------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (bLeft)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Center;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 2] = trends.Down;&lt;br /&gt;inIndex += 3;&lt;br /&gt;&lt;span class="rem"&gt;// --- если с верху нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bUp)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Center;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Up;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Center;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --- если с низу нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bDown)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Down;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Down;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="rem"&gt;// если нет соединение с более высокой детализацией, то переходим к следующему уровню детализации&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bUp) &lt;span class="rem"&gt;// Х0&lt;/span&gt;&lt;br /&gt;InitNodeIndex(inNode.NodeChildren[0], &lt;span class="kwrd"&gt;ref&lt;/span&gt; inIndex); &lt;span class="rem"&gt;// 00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bDown) &lt;span class="rem"&gt;// 00&lt;/span&gt;&lt;br /&gt;InitNodeIndex(inNode.NodeChildren[2], &lt;span class="kwrd"&gt;ref&lt;/span&gt; inIndex); &lt;span class="rem"&gt;// Х0&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- если с права соединение с более высокой детализацией ------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (bRight)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Right;&lt;br /&gt;indices[inIndex + 1] = trends.DownRight;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Center;&lt;br /&gt;inIndex += 3;&lt;br /&gt;&lt;span class="rem"&gt;// --- если с верху нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bUp)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Up;&lt;br /&gt;indices[inIndex + 2] = trends.Right;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --- если с низу нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bDown)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 1] = trends.DownRight;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Down;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="rem"&gt;// если нет соединение с более высокой детализацией, то переходим к следующему уровню детализации&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bUp) &lt;span class="rem"&gt;// 0Х&lt;/span&gt;&lt;br /&gt;InitNodeIndex(inNode.NodeChildren[1], &lt;span class="kwrd"&gt;ref&lt;/span&gt; inIndex); &lt;span class="rem"&gt;// 00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bDown) &lt;span class="rem"&gt;// 00&lt;/span&gt;&lt;br /&gt;InitNodeIndex(inNode.NodeChildren[3], &lt;span class="kwrd"&gt;ref&lt;/span&gt; inIndex); &lt;span class="rem"&gt;// 0Х&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- если с верху соединение с более высокой детализацией ------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (bUp)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Center;&lt;br /&gt;indices[inIndex + 1] = trends.Right;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Center;&lt;br /&gt;inIndex += 3;&lt;br /&gt;&lt;span class="rem"&gt;// --- если с лева нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bLeft)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Center;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Left;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --- если с права нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bRight)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 1] = trends.Right;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Right;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; --- если с низу соединение с более высокой детализацией -------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (bDown)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends.Down;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 2] = trends.DownRight;&lt;br /&gt;inIndex += 3;&lt;br /&gt;&lt;span class="rem"&gt;// --- если с лева нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bLeft)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 1] = trends.Down;&lt;br /&gt;indices[inIndex + 2] = trends4x3.Left;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;// --- если с права нет! соединения с более высокой детализацией (добавочный треугольник)&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!bRight)&lt;br /&gt;{&lt;br /&gt;indices[inIndex + 0] = trends4x3.Center;&lt;br /&gt;indices[inIndex + 1] = trends4x3.Right;&lt;br /&gt;indices[inIndex + 2] = trends.DownRight;&lt;br /&gt;inIndex += 3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="rem"&gt;//else&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//{&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//}&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#endregion&lt;/span&gt; ------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span class="rem"&gt;// --------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Свои задачи данная разработка уже выполнила. Для себя дальнейшие пути развития данной идеи я вижу два:&lt;br /&gt;1) Растачивать дальше в этом направлении. Реализовать динамическую подгруздку данных о высотах с диска. Есть расчетные таблицы. Разработан алгоритм быстрого обновления кэшей высот к уровням детализации, без смещения (move) данных. Это позволит работать с ландшафтами огромного размера. Приведу пример расчета размеров LOD’ов для карты 1310.72^2 км с максимальной детализацией до 10^2 м:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XDL74WV16Ms/Sj1vIznrTmI/AAAAAAAAADg/EHhzELC-4Aw/s1600-h/landscape+tabl.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 254px;" src="http://2.bp.blogspot.com/_XDL74WV16Ms/Sj1vIznrTmI/AAAAAAAAADg/EHhzELC-4Aw/s400/landscape+tabl.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5349554129472278114" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;2) Для игр. Придется переделать исходную коллекцию массивов высот в один. И реализовать новую выборку.&lt;br /&gt;&lt;br /&gt;Вот как то так.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dtimofeev.blogspot.com/2009/06/procedural-landscape-on-xna-game-studio.html"&gt;Оригинальный блог&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8315166855615834363?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8315166855615834363/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/procedural-landscape-on-xna-game-studio.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8315166855615834363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8315166855615834363'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/procedural-landscape-on-xna-game-studio.html' title='Procedural Landscape on XNA Game Studio 3.0'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XDL74WV16Ms/Sj1utUQsl0I/AAAAAAAAADQ/XZrg1-PNvTw/s72-c/landscape.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-5299967623447040971</id><published>2009-06-20T23:41:00.000+04:00</published><updated>2009-06-21T00:17:20.028+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Content Processor for Normal Map Texture</title><content type='html'>&lt;a href="http://www.blogger.com/profile/07549780411551878883"&gt;Пахомов Андрей&lt;/a&gt; (PAX), на основе моей статьи &lt;a href="http://dtimofeev.blogspot.com/2009/06/calculation-deep-normal-map.html"&gt;Calculation deep normal map&lt;/a&gt;, сделал (для XNA Game Studio приложений) свой Content Processor для загрузки, через Content Manager, и пересчета текстуры в карту нормалей.&lt;br /&gt;&lt;br /&gt;Скачать можно &lt;a href="http://xnadev.ru/downloads.php?page_id=31"&gt;тут&lt;/a&gt; (требуется регистрация &lt;a href="http://xnadev.ru"&gt;xnadev.ru&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dtimofeev.blogspot.com/2009/06/content-processor-for-texture-normal.html"&gt;Оригинал блога&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-5299967623447040971?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/5299967623447040971/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/content-processor-for-texture-normal.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5299967623447040971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5299967623447040971'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/content-processor-for-texture-normal.html' title='Content Processor for Normal Map Texture'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8735463943035569560</id><published>2009-06-20T19:24:00.001+04:00</published><updated>2009-06-21T22:04:55.537+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Effect “Bump mapping”</title><content type='html'>В этой статье своей целью я ставлю попытку, по своему, раскрыть суть данного эффекта, более подробно и доступно чем это делалось ранее, кем бы то ни было и с реализацией на XNA GS. Так, что бы было понятно начинающим. По максимуму охватить опорные моменты и используемые инструменты, а так же из собственного опыта нюансы, которые могут возникнуть.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj0m1AdDBYI/AAAAAAAAACw/dXmZ-Qveaoo/s1600-h/BumpMapping0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 311px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj0m1AdDBYI/AAAAAAAAACw/dXmZ-Qveaoo/s400/BumpMapping0.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5349474624482772354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И так поехали.&lt;br /&gt;&lt;br /&gt;Для чистоты эксперимента рассмотрим частный случай.&lt;br /&gt;&lt;br /&gt;Описание условий эксперимента:&lt;br /&gt;Объект – (Поверхность текстурирования) плоскость, квадрат.&lt;br /&gt;Расположение объекта – (изначальное) параллельно плоскости экрана, лицом к камере.&lt;br /&gt;Карта нормалей – (текстура) для ее построения используем расчет, приведенный в моей статье &lt;a href="http://dtimofeev.blogspot.com/2009/06/calculation-deep-normal-map.html"&gt;«Calculation deep normal map»&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Нам потребуется новый тип описания формата вершин, назовем его VertexPositionTangentSpaceTexture.&lt;br /&gt;&lt;br /&gt;(код его реализации)&lt;br /&gt;   public struct VertexPositionTangentSpaceTexture&lt;br /&gt;   {&lt;br /&gt;       public Vector3  Position;&lt;br /&gt;       public Vector3  Normal;&lt;br /&gt;       public Vector3  Binormal;&lt;br /&gt;       public Vector3  Tangent;&lt;br /&gt;       public Vector2  TextureCoordinate;&lt;br /&gt;       public static readonly VertexElement[] VertexElements;&lt;br /&gt;       static VertexPositionTangentSpaceTexture()&lt;br /&gt;       {&lt;br /&gt;           VertexElements = new VertexElement[5];&lt;br /&gt;           short offset    = 0;&lt;br /&gt;           // Position&lt;br /&gt;           VertexElements[0] = new VertexElement(&lt;br /&gt;                                           0, offset,&lt;br /&gt;                                           VertexElementFormat.Vector3,&lt;br /&gt;                                           VertexElementMethod.Default,&lt;br /&gt;                                           VertexElementUsage.Position,&lt;br /&gt;                                           0);&lt;br /&gt;           offset += (short)Marshal.SizeOf(new Vector3());&lt;br /&gt;           // Normal&lt;br /&gt;           VertexElements[1] = new VertexElement(&lt;br /&gt;                                           0, offset,&lt;br /&gt;                                           VertexElementFormat.Vector3,&lt;br /&gt;                                           VertexElementMethod.Default,&lt;br /&gt;                                           VertexElementUsage.Normal,&lt;br /&gt;                                           0);&lt;br /&gt;           offset += (short)Marshal.SizeOf(new Vector3());&lt;br /&gt;           // Binormal&lt;br /&gt;           VertexElements[2] = new VertexElement(&lt;br /&gt;                                           0, offset,&lt;br /&gt;                                           VertexElementFormat.Vector3,&lt;br /&gt;                                           VertexElementMethod.Default,&lt;br /&gt;                                           VertexElementUsage.Binormal,&lt;br /&gt;                                           0);&lt;br /&gt;           offset += (short)Marshal.SizeOf(new Vector3());&lt;br /&gt;           // Tangent&lt;br /&gt;           VertexElements[3] = new VertexElement(&lt;br /&gt;                                           0, offset,&lt;br /&gt;                                           VertexElementFormat.Vector3,&lt;br /&gt;                                           VertexElementMethod.Default,&lt;br /&gt;                                           VertexElementUsage.Tangent,&lt;br /&gt;                                           0);&lt;br /&gt;           offset += (short)Marshal.SizeOf(new Vector3());&lt;br /&gt;           // TextureCoordinate&lt;br /&gt;           VertexElements[4] = new VertexElement(&lt;br /&gt;                                           0, offset,&lt;br /&gt;                                           VertexElementFormat.Vector2,&lt;br /&gt;                                           VertexElementMethod.Default,&lt;br /&gt;                                           VertexElementUsage.TextureCoordinate,&lt;br /&gt;                                           0);&lt;br /&gt;       }&lt;br /&gt;       public VertexPositionTangentSpaceTexture(    &lt;br /&gt;           Vector3 position,&lt;br /&gt;                  Vector3 normal,&lt;br /&gt;                                               Vector3 binormal,&lt;br /&gt;                                               Vector3 tangent,&lt;br /&gt;                                               Vector2 textureCoordinate)&lt;br /&gt;       {&lt;br /&gt;           this.Position               = position;&lt;br /&gt;           this.Normal                 = normal;&lt;br /&gt;           this.Binormal               = binormal;&lt;br /&gt;           this.Tangent                = tangent;&lt;br /&gt;           this.TextureCoordinate      = textureCoordinate;&lt;br /&gt;       }&lt;br /&gt;       public static int SizeInBytes&lt;br /&gt;       {&lt;br /&gt;           get&lt;br /&gt;           {&lt;br /&gt;               return (int)(   Marshal.SizeOf(new Vector3()) +&lt;br /&gt;                               Marshal.SizeOf(new Vector3()) +&lt;br /&gt;                               Marshal.SizeOf(new Vector3()) +&lt;br /&gt;                               Marshal.SizeOf(new Vector3()) +&lt;br /&gt;                               Marshal.SizeOf(new Vector2()));&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;В его описании поля: Normal, Binormal и Tangent. Послужат нам описанием локальной системы координат для каждой вершины, так называемый tangent space – пространство косательной. В данном примере мы не будем ударятся в оптимизацию и экономию. Потому для наглядности примера используем все три вектора и тем самым заострим внимание на самой сути Bump Map’инга и  возможно это помежет кому либо избежать подводных камней при изучении этого примера.&lt;br /&gt;&lt;br /&gt;Генерируем поверхность с вершинами типа VertexPositionTangentSpaceTexture.&lt;br /&gt;&lt;br /&gt;(пример)&lt;br /&gt;       public void             Quad()&lt;br /&gt;       {&lt;br /&gt;           float y0 = 0.5f;&lt;br /&gt;           float y1 = -y0;&lt;br /&gt;           float x0 = -0.5f;&lt;br /&gt;           float x1 = -x0;&lt;br /&gt;           float z0 = 0.5f;&lt;br /&gt;           float z1 = -z0;&lt;br /&gt;           z0 = 0; z1 = 0;&lt;br /&gt;           verts = new VertexPositionTangentSpaceTexture[4];&lt;br /&gt;           indices = new int[6];&lt;br /&gt;           int iv, ii;&lt;br /&gt;           iv = 0;&lt;br /&gt;           ii = 0;&lt;br /&gt;           // front&lt;br /&gt;           verts[iv + 0].Position = new Vector3(x0, y0, z0);&lt;br /&gt;           verts[iv + 1].Position = new Vector3(x1, y0, z0);&lt;br /&gt;           verts[iv + 2].Position = new Vector3(x0, y1, z0);&lt;br /&gt;           verts[iv + 3].Position = new Vector3(x1, y1, z0);&lt;br /&gt;           verts[iv + 0].Normal = Vector3.Backward;&lt;br /&gt;           verts[iv + 1].Normal = Vector3.Backward;&lt;br /&gt;           verts[iv + 2].Normal = Vector3.Backward;&lt;br /&gt;           verts[iv + 3].Normal = Vector3.Backward;&lt;br /&gt;           verts[iv + 0].Binormal = Vector3.Up;&lt;br /&gt;           verts[iv + 1].Binormal = Vector3.Up;&lt;br /&gt;           verts[iv + 2].Binormal = Vector3.Up;&lt;br /&gt;           verts[iv + 3].Binormal = Vector3.Up;&lt;br /&gt;           verts[iv + 0].Tangent = Vector3.Right;&lt;br /&gt;           verts[iv + 1].Tangent = Vector3.Right;&lt;br /&gt;           verts[iv + 2].Tangent = Vector3.Right;&lt;br /&gt;           verts[iv + 3].Tangent = Vector3.Right;&lt;br /&gt;           verts[iv + 0].TextureCoordinate = Vector2.Zero;&lt;br /&gt;           verts[iv + 1].TextureCoordinate = Vector2.UnitX;&lt;br /&gt;           verts[iv + 2].TextureCoordinate = Vector2.UnitY;&lt;br /&gt;           verts[iv + 3].TextureCoordinate = Vector2.One;&lt;br /&gt;           indices[ii + 0] = iv + 0;&lt;br /&gt;           indices[ii + 1] = iv + 1;&lt;br /&gt;           indices[ii + 2] = iv + 2;&lt;br /&gt;           indices[ii + 3] = iv + 2;&lt;br /&gt;           indices[ii + 4] = iv + 1;&lt;br /&gt;           indices[ii + 5] = iv + 3;&lt;br /&gt;           iv += 4;&lt;br /&gt;           ii += 6;&lt;br /&gt;           // verts&lt;br /&gt;           vertexBuffer = new VertexBuffer(&lt;br /&gt;                               graphics.GraphicsDevice,&lt;br /&gt;                               VertexPositionTangentSpaceTexture.SizeInBytes * verts.Length,&lt;br /&gt;                               BufferUsage.None);&lt;br /&gt;           vertexBuffer.SetData&lt;vertexpositiontangentspacetexture&gt;(verts);&lt;br /&gt;           // index&lt;br /&gt;           indexBuffer = new IndexBuffer(&lt;br /&gt;                               graphics.GraphicsDevice,&lt;br /&gt;                               sizeof(int) * indices.Length,&lt;br /&gt;                               BufferUsage.None, IndexElementSize.ThirtyTwoBits);&lt;br /&gt;           indexBuffer.SetData&lt;int&gt;(indices);&lt;br /&gt;           vertexDeclaration = new VertexDeclaration(graphics.GraphicsDevice, VertexPositionTangentSpaceTexture.VertexElements);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;Обращаю Ваше внимание на инициализацию опять же Normal, Binormal и Tangent. Фишка в том, что по условиям эксперимента я заранее знаю как будет расположен в пространстве текстурируемый объект. Потому так же знаю как будет расположенна нормаль к его лицевой стороне и соответствующие ей Binormal и Tangent.&lt;br /&gt;&lt;br /&gt;В случае же со сложной, изогнутой поверхностью с большим количеством треугольников нам прийдется выполнять не простые вычисления для расчета tangent space к каждой вершине. Так же учитывать углы между плоскостями треугольников с общими вершинами и либо усреднять tangent space при малых углах, либо добовлять новые вершины для разделения значений tangent space соответствующие этим же треугольникам при углах близких к 90 градусам. Но это уже развитие идеи и большая тема для отдельной статьи.&lt;br /&gt;&lt;br /&gt;Для чего нам это нужен tangent space?&lt;br /&gt;Все просто. Как вы наверно знаете, в вершинном шейдере при обычном текстурировании, для правильного проецирования в плоскость экрана, мы выполняем следующие преобразования:&lt;br /&gt;&lt;br /&gt;(пример)&lt;br /&gt;  Out.Position = mul( In.Position, matWVP );&lt;br /&gt;  Out.Light = normalize( vLight );&lt;br /&gt;  Out.Normal = normalize( mul( In.Normal, matWorld ) );&lt;br /&gt;  Out.Texcoord = In.Texcoord;&lt;br /&gt;&lt;br /&gt;Т.е.&lt;br /&gt;- преобразуем и проецируем координаты вершины в плоскость экрана матрицей matWVP (семантика :WORLDVIEWPROJECTION);&lt;br /&gt;- преобразуем нормали матрицей matWorld (семантика :WORLD) – поворот нормалей для правильного расчета освещения в пиксельном шейдере;&lt;br /&gt;&lt;br /&gt;Но в нашем случае нормали к вершинам поворачивать мы не будем. Потому, что это влечет за собой поворот всех нормалей, к каждому пикселю текстуры, принадлежащих выводимым треугольникам, а это лишние действия. Классический прием - поворот вектора освещения обратно повороту объекта, вот так:&lt;br /&gt;&lt;br /&gt;(пример)&lt;br /&gt;float3 vLight = mul(vLightPos, matWorldBack) - In.Position;   &lt;br /&gt;//float3 tangent = float3(1,0,0); \&lt;br /&gt;//float3 binormal = float3(0,1,0); - в нашем частном случае&lt;br /&gt;//float3 normal = float3(0,0,1); /&lt;br /&gt;float3 normal = normalize(In.Normal);&lt;br /&gt;float3 binormal = normalize(In.Binormal);&lt;br /&gt;float3 tangent = normalize(In.Tangent);&lt;br /&gt;float3x3 matTS = float3x3(tangent, binormal, normal);&lt;br /&gt;Out.vLightTS = normalize(mul(vLight, matTS));&lt;br /&gt;&lt;br /&gt;Мы поворачиваем вектор источника света vLightPos в соответствии с преобразованиями накопленными в матрице matWorldBack. Эта матрица является обратной матрицей для мировой матрицы объекта. Прернос и масштабирование в данном случае нас не интересуют, потому как vLightPos вектор, а не координата, и мы нормализуем итоговый результат.&lt;br /&gt;Что значит обратная матрица? Матрица в которой собраны преобразования обратные оригинальной матрице. В данном случае с помощью обратной матрицы мы вращаем вектор освещения в сторону обратную вращению нашего объекта.&lt;br /&gt;Получить обратную матрицу средствами XNA очень просто:&lt;br /&gt;matWorldBack = Matrix.Invert(matWorld);&lt;br /&gt;Далее переводим координаты источника света (в статичную!) локальную систему координат очередной вершины действиями:&lt;br /&gt;float3 normal = normalize(In.Normal);&lt;br /&gt;float3 binormal = normalize(In.Binormal);&lt;br /&gt;float3 tangent = normalize(In.Tangent);&lt;br /&gt;float3x3 matTS = float3x3(tangent, binormal, normal);&lt;br /&gt;Out.vLightTS = normalize(mul(vLight, matTS));&lt;br /&gt;Где, matTS – матрица описывающая tangent space вершины.&lt;br /&gt;&lt;br /&gt;После чего мы готовы к текстурированию с учетом освещения и псевдо рельефа.&lt;br /&gt;В пиксельном шейде (пример):&lt;br /&gt;float4 ps(PS_INPUT In) : COLOR0&lt;br /&gt;{  &lt;br /&gt;float3 vNormalTS = tex2D( sTexture0, In.Texcoord ) * 2 - 1;&lt;br /&gt;float4 color  = float4(0.8f, 0.8f, 0, 1);&lt;br /&gt;float3 vlightTS = In.vLightTS;&lt;br /&gt;&lt;br /&gt;float light  = clamp(dot(vNormalTS, vlightTS), 0, 1);&lt;br /&gt;return mul(color, light);&lt;br /&gt;}&lt;br /&gt;Стоит обратить внимание на две строчки:&lt;br /&gt;1) float3 vNormalTS = tex2D( sTexture0, In.Texcoord ) * 2 - 1;&lt;br /&gt;где, мы берем нормаль к поверхности в данном пикселе текстуры и распаковываем ее в первоначальный вид, т.к. в normal map у нас хранятся данные о (естественно) нормалях, но упакованными по условной формуле:&lt;br /&gt;color = normal * 0.5f + vector(0.5f, 0.5f, 0.5f);&lt;br /&gt;Подробнее смотреть статью о расчете - &lt;a href="http://dtimofeev.blogspot.com/2009/06/calculation-deep-normal-map.html"&gt;«Calculation deep normal map»&lt;/a&gt;.&lt;br /&gt;2) float light = clamp(dot(vNormalTS, vlightTS, 0, 1);&lt;br /&gt;сам расчет интенсивности освещения для данного пикселя текстуры.&lt;br /&gt;&lt;br /&gt;(полный пример шейдера)&lt;br /&gt;float4x4 matWorld   : WORLD0;&lt;br /&gt;float4x4 matWorldBack : WORLD1;&lt;br /&gt;float4x4 matWVP    : WORLDVIEWPROJECTION0;&lt;br /&gt;float3  vLightPos;&lt;br /&gt;float3  vViewPos;&lt;br /&gt;struct VS_INPUT&lt;br /&gt;{&lt;br /&gt;  float3 Position  : POSITION0;&lt;br /&gt;  float3 Normal   : NORMAL0;&lt;br /&gt;  float3 Binormal  : BINORMAL0;&lt;br /&gt;  float3 Tangent   : TANGENT0;&lt;br /&gt;  float2 Texcoord  : TEXCOORD0;&lt;br /&gt;};&lt;br /&gt;struct VS_OUTPUT&lt;br /&gt;{&lt;br /&gt;float4 Position  : POSITION0;&lt;br /&gt;float2 Texcoord  : TEXCOORD0;&lt;br /&gt;float3 vLightTS  : TEXCOORD3;&lt;br /&gt;};&lt;br /&gt;VS_OUTPUT vs( VS_INPUT In )&lt;br /&gt;{&lt;br /&gt;  float3 vLight = mul(vLightPos, matWorldBack) - In.Position;   &lt;br /&gt;   float3 normal = normalize(In.Normal);&lt;br /&gt;   float3 binormal = normalize(In.Binormal);&lt;br /&gt;   float3 tangent = normalize(In.Tangent);&lt;br /&gt;   float3x3 matTS = float3x3( tangent, binormal, normal );&lt;br /&gt;   VS_OUTPUT Out = ( VS_OUTPUT ) 0;&lt;br /&gt;Out.Position = mul(float4( In.Position, 1 ), matWVP);&lt;br /&gt;Out.Texcoord = In.Texcoord;&lt;br /&gt;Out.vLightTS = normalize(mul(vLight, matTS));&lt;br /&gt;return Out;&lt;br /&gt;}&lt;br /&gt;texture tex0;&lt;br /&gt;sampler2D sTexture0 = sampler_state&lt;br /&gt;{&lt;br /&gt;Texture  = (tex0);&lt;br /&gt;MinFilter = LINEAR;&lt;br /&gt;MagFilter = LINEAR;&lt;br /&gt;MipFilter = LINEAR;&lt;br /&gt;AddressU = CLAMP;&lt;br /&gt;AddressV = CLAMP;&lt;br /&gt;};&lt;br /&gt;struct PS_INPUT&lt;br /&gt;{&lt;br /&gt;float2 Texcoord  : TEXCOORD0;&lt;br /&gt;float3 vLightTS  : TEXCOORD3;&lt;br /&gt;};&lt;br /&gt;float4 ps(PS_INPUT In) : COLOR0&lt;br /&gt;{  &lt;br /&gt;float3 vNormalTS = tex2D( sTexture0, In.Texcoord ) * 2 - 1;&lt;br /&gt;float4 color  = float4(0.8f, 0.8f, 0, 1);&lt;br /&gt;float3 vlightTS = In.vLightTS;&lt;br /&gt;float light  = clamp(dot(vNormalTS, vlightTS), 0, 1);&lt;br /&gt;return mul(color, light);&lt;br /&gt;}&lt;br /&gt;{&lt;br /&gt;  pass Pass_0&lt;br /&gt;  {&lt;br /&gt;     VertexShader = compile vs_2_0 vs();&lt;br /&gt;     PixelShader = compile ps_2_0 ps();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Результат:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj0m-Cw3zgI/AAAAAAAAAC4/m_MKJ_OiSgM/s1600-h/BumpMapping2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 311px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/Sj0m-Cw3zgI/AAAAAAAAAC4/m_MKJ_OiSgM/s400/BumpMapping2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5349474779721616898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Абсолютно прозрачные и простые примеры это хорошо. Но закончить статью хочется ярче. Потому поковыряв в приложении к RenderMonkey пример «Parallax Occlusion Mapping». Я добавил бликовую модель освещения и тут же картинка (ее можно увидеть в начале статьи) стала живее.&lt;br /&gt;(пример шейдера)&lt;br /&gt;&lt;br /&gt;float4x4 matWorld   : WORLD0;&lt;br /&gt;float4x4 matWorldBack : WORLD1;&lt;br /&gt;float4x4 matWVP    : WORLDVIEWPROJECTION0;&lt;br /&gt;float3  vLightPos;&lt;br /&gt;float3  vViewPos;&lt;br /&gt;struct VS_INPUT&lt;br /&gt;{&lt;br /&gt;  float3 Position  : POSITION0;&lt;br /&gt;  float3 Normal   : NORMAL0;&lt;br /&gt;  float3 Binormal  : BINORMAL0;&lt;br /&gt;  float3 Tangent   : TANGENT0;&lt;br /&gt;  float2 Texcoord  : TEXCOORD0;&lt;br /&gt;};&lt;br /&gt;struct VS_OUTPUT&lt;br /&gt;{&lt;br /&gt;float4 Position  : POSITION0;&lt;br /&gt;float2 Texcoord  : TEXCOORD0;&lt;br /&gt;float3 vNormalWS  : TEXCOORD1;&lt;br /&gt;float3 vViewWS   : TEXCOORD2;&lt;br /&gt;float3 vLightTS  : TEXCOORD3;&lt;br /&gt;float3 vViewTS   : TEXCOORD4;&lt;br /&gt;};&lt;br /&gt;VS_OUTPUT vs( VS_INPUT In )&lt;br /&gt;{&lt;br /&gt;   float3 vLight = mul(vLightPos, matWorldBack) - In.Position;   &lt;br /&gt;   float3 vViewDir  = mul(vViewPos, matWorldBack) - In.Position;   &lt;br /&gt;   float3 normal = normalize(In.Normal);&lt;br /&gt;   float3 binormal = normalize(In.Binormal);&lt;br /&gt;   float3 tangent = normalize(In.Tangent);&lt;br /&gt;   float3x3 matTS = float3x3( tangent, binormal, normal );&lt;br /&gt;   VS_OUTPUT Out = ( VS_OUTPUT ) 0;&lt;br /&gt;Out.Position = mul(float4( In.Position, 1 ), matWVP);&lt;br /&gt;Out.Texcoord = In.Texcoord;&lt;br /&gt;Out.vNormalWS = In.Normal;&lt;br /&gt;Out.vViewWS  = vViewDir;&lt;br /&gt;Out.vLightTS = normalize(mul(vLight, matTS));&lt;br /&gt;Out.vViewTS  = normalize(mul(vViewDir, matTS));&lt;br /&gt;return Out;&lt;br /&gt;}&lt;br /&gt;texture tex0;&lt;br /&gt;sampler2D sTexture0 = sampler_state&lt;br /&gt;{&lt;br /&gt;Texture  = (tex0);&lt;br /&gt;MinFilter = LINEAR;&lt;br /&gt;MagFilter = LINEAR;&lt;br /&gt;MipFilter = LINEAR;&lt;br /&gt;AddressU = CLAMP;&lt;br /&gt;AddressV = CLAMP;&lt;br /&gt;};&lt;br /&gt;struct PS_INPUT&lt;br /&gt;{&lt;br /&gt;float2 Texcoord  : TEXCOORD0;&lt;br /&gt;float3 vNormalWS  : TEXCOORD1;&lt;br /&gt;float3 vViewWS   : TEXCOORD2;&lt;br /&gt;float3 vLightTS  : TEXCOORD3;&lt;br /&gt;float3 vViewTS   : TEXCOORD4;&lt;br /&gt;};&lt;br /&gt;float4 cSpecularColor = float4(1, 1, 1, 1);&lt;br /&gt;float fSpecularExponent = 300;&lt;br /&gt;float4 ps(PS_INPUT In) : COLOR0&lt;br /&gt;{  &lt;br /&gt;float3 vNormalTS = tex2D( sTexture0, In.Texcoord ) * 2 - 1;&lt;br /&gt;float4 color  = float4(0.8f, 0.8f, 0, 1);&lt;br /&gt;float3 vlightTS = In.vLightTS;&lt;br /&gt;float3 vReflectionTS = normalize( 2 * dot( In.vViewTS, vNormalTS ) * vNormalTS - In.vViewTS );&lt;br /&gt;float fRdotL = dot( vReflectionTS, In.vLightTS );&lt;br /&gt;float4 cSpecular = saturate( pow( fRdotL, fSpecularExponent )) * cSpecularColor;&lt;br /&gt;float light  = clamp(dot(vNormalTS, vlightTS) * (color + cSpecular), 0, 1);&lt;br /&gt;return mul(color, light);&lt;br /&gt;}&lt;br /&gt;technique BumpMapping&lt;br /&gt;{&lt;br /&gt;  pass Pass_0&lt;br /&gt;  {&lt;br /&gt;     VertexShader = compile vs_2_0 vs();&lt;br /&gt;     PixelShader = compile ps_2_0 ps();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xnadev.ru/downloads.php?page_id=32"&gt;Скачать пример можно тут&lt;/a&gt; (требуется регистрация &lt;a href="http://xnadev.ru/"&gt;xnadev.ru&lt;/a&gt;) &lt;span style="font-style:italic;"&gt;(чуть позже, в оригинальном блоге, ссылка станет доступна)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dtimofeev.blogspot.com/2009/06/effect-bump-mapping.html"&gt;Оригинал блога&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8735463943035569560?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8735463943035569560/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/effect-bump-mapping.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8735463943035569560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8735463943035569560'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/effect-bump-mapping.html' title='Effect “Bump mapping”'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XDL74WV16Ms/Sj0m1AdDBYI/AAAAAAAAACw/dXmZ-Qveaoo/s72-c/BumpMapping0.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-5150822731337833101</id><published>2009-06-19T23:13:00.000+04:00</published><updated>2009-06-19T23:50:20.960+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calculation'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Calculation deep normal map</title><content type='html'>Calculation normal map for “Bump mapping” &amp;amp; “Parallax Mapping” II&lt;br /&gt;&lt;br /&gt;Вот еще один, более сложный пример расчета.&lt;br /&gt;&lt;br /&gt;Что тут добавлено:&lt;br /&gt;I. При расчете переворачивается ось Y, для приведения соответствующего tangent space к нормальному виду.&lt;br /&gt;Это связанно с тем, что в мировой системе координат ось Y смотрит в верх, а в текстуре в низ.&lt;br /&gt;II. Сглаживание normal map&lt;br /&gt;III. Масштабирование для получения более глубокого эффекта.&lt;br /&gt;&lt;br /&gt;(код примера)&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Расчет normal map к текстуре&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        /// &lt;param name="inTex"&gt;Текстура для расчета (цветная, черно-белая - по барабану)&lt;/param&gt;&lt;br /&gt;        /// &lt;param name="K"&gt;Во сколько целых раз нужно уменьшить (2^n)&lt;/param&gt;&lt;br /&gt;        /// &lt;returns&gt;Рассчитанная normal map текстура&lt;/returns&gt;&lt;br /&gt;        private Texture2D GenNormalMamp(Texture2D inTex, int K)&lt;br /&gt;        {&lt;br /&gt;            int inX = inTex.Width;&lt;br /&gt;            int inY = inTex.Height;&lt;br /&gt;            int outX = inTex.Width / K;&lt;br /&gt;            int outY = inTex.Height / K;&lt;br /&gt;            float z = 1;&lt;br /&gt;            int l = inX * inY;&lt;br /&gt;            Texture2D outTex = new Texture2D(graphics.GraphicsDevice, outX, outY);&lt;br /&gt;            Color[] inColor = new Color[l];&lt;br /&gt;            Color[] outColor = new Color[l / (K * K)];&lt;br /&gt;            float[,] heightMap = new float[outX, outY];&lt;br /&gt;            Vector3[,] normalMap = new Vector3[outX, outY];&lt;br /&gt;            inTex.GetData&lt;Color&gt;(inColor);&lt;br /&gt;            // height map&lt;br /&gt;            for (int iy = 0; iy &lt; outY; iy++)&lt;br /&gt;            {&lt;br /&gt;                for (int ix = 0; ix &lt; outX; ix++)&lt;br /&gt;                {&lt;br /&gt;                    Vector3 v3 = inColor[iy * inX * K + ix * K].ToVector3();&lt;br /&gt;                    heightMap[ix, iy] = (v3.X + v3.Y + v3.Z) / 3;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            // normal map&lt;br /&gt;            float[] delHeight = new float[8];&lt;br /&gt;            Vector3[] v38 = new Vector3[8];&lt;br /&gt;            Vector3 vAddPack = new Vector3(0.5f, 0.5f, 0.5f);&lt;br /&gt;            Vector3 vScale = new Vector3(2f, 2f, 1f);&lt;br /&gt;            for (int iy = 0; iy &lt; outY; iy++)&lt;br /&gt;            {&lt;br /&gt;                for (int ix = 0; ix &lt; outX; ix++)&lt;br /&gt;                {&lt;br /&gt;                    if (iy == 0 || iy == outY - 1 || ix == 0 || ix == outX - 1)&lt;br /&gt;                    {&lt;br /&gt;                        normalMap[ix, iy] = Vector3.Backward;&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                    delHeight[0] = heightMap[ix, iy] - heightMap[ix - 1, iy - 1];&lt;br /&gt;                    delHeight[1] = heightMap[ix, iy] - heightMap[ix, iy - 1];&lt;br /&gt;                    delHeight[2] = heightMap[ix, iy] - heightMap[ix + 1, iy - 1];&lt;br /&gt;                    delHeight[3] = heightMap[ix, iy] - heightMap[ix - 1, iy];&lt;br /&gt;                    delHeight[4] = heightMap[ix, iy] - heightMap[ix + 1, iy];&lt;br /&gt;                    delHeight[5] = heightMap[ix, iy] - heightMap[ix - 1, iy + 1];&lt;br /&gt;                    delHeight[6] = heightMap[ix, iy] - heightMap[ix, iy + 1];&lt;br /&gt;                    delHeight[7] = heightMap[ix, iy] - heightMap[ix + 1, iy + 1];&lt;br /&gt;                    v38[0] = new Vector3(-delHeight[0], delHeight[0], z - delHeight[0]);&lt;br /&gt;                    v38[1] = new Vector3(0f, delHeight[1], z - delHeight[1]);&lt;br /&gt;                    v38[2] = new Vector3(delHeight[2], delHeight[2], z - delHeight[2]);&lt;br /&gt;                    v38[3] = new Vector3(-delHeight[3], 0f, z - delHeight[3]);&lt;br /&gt;                    v38[4] = new Vector3(delHeight[4], 0f, z - delHeight[4]);&lt;br /&gt;                    v38[5] = new Vector3(-delHeight[5], -delHeight[5], z - delHeight[5]);&lt;br /&gt;                    v38[6] = new Vector3(0f, -delHeight[6], z - delHeight[6]);&lt;br /&gt;                    v38[7] = new Vector3(delHeight[7], -delHeight[7], z - delHeight[7]);&lt;br /&gt;                    normalMap[ix, iy] = Vector3.Zero;&lt;br /&gt;                    for (int ii = 0; ii &lt; 8; ii++) normalMap[ix, iy] += v38[ii] * vScale;&lt;br /&gt;                    normalMap[ix, iy].Normalize();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            // smooth&lt;br /&gt;            Vector3[] s = new Vector3[8];&lt;br /&gt;            int pas = 4;&lt;br /&gt;            for (int iS = 0; iS &lt; pas; iS++)&lt;br /&gt;            {&lt;br /&gt;                for (int iy = 1; iy &lt; outY - 2; iy++)&lt;br /&gt;                {&lt;br /&gt;                    for (int ix = 1; ix &lt; outY - 2; ix++)&lt;br /&gt;                    {&lt;br /&gt;                        if (normalMap[ix, iy] == Vector3.Backward) continue;&lt;br /&gt;                        s[0] = normalMap[ix - 1, iy - 1];&lt;br /&gt;                        s[1] = normalMap[ix, iy];&lt;br /&gt;                        s[2] = normalMap[ix + 1, iy - 1];&lt;br /&gt;                        s[3] = normalMap[ix - 1, iy];&lt;br /&gt;                        s[4] = normalMap[ix + 1, iy];&lt;br /&gt;                        s[5] = normalMap[ix - 1, iy + 1];&lt;br /&gt;                        s[6] = normalMap[ix, iy + 1];&lt;br /&gt;                        s[7] = normalMap[ix + 1, iy + 1];&lt;br /&gt;                        normalMap[ix, iy] = Vector3.Zero;&lt;br /&gt;                        for (int ii = 0; ii &lt; s.Length; ii++)&lt;br /&gt;                            normalMap[ix, iy] += s[ii];&lt;br /&gt;                        normalMap[ix, iy].Normalize();&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            // color&lt;br /&gt;            int i = 0;&lt;br /&gt;            for (int iy = 0; iy &lt; outY; iy++)&lt;br /&gt;            {&lt;br /&gt;                for (int ix = 0; ix &lt; outX; ix++)&lt;br /&gt;                {&lt;br /&gt;                    normalMap[ix, iy] *= new Vector3(16f, 16f, 1f);&lt;br /&gt;                    normalMap[ix, iy].Normalize();&lt;br /&gt;                    outColor[i] = new Color(new Color(normalMap[ix, iy] * 0.5f + vAddPack), heightMap[ix, iy]);&lt;br /&gt;                    i++;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            // texture&lt;br /&gt;            outTex.SetData&lt;Color&gt;(outColor);&lt;br /&gt;            outTex.Save(@"normalMap.tga", ImageFileFormat.Tga);&lt;br /&gt;            return outTex;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;картинка normal map&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 256px;" src="http://2.bp.blogspot.com/_XDL74WV16Ms/SjvpGjK-XDI/AAAAAAAAACo/oKeVwqByKn8/s400/BumpMapping1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5349125281162353714" /&gt;&lt;color&gt;&lt;color&gt;&lt;br /&gt;результат Bump mapping'а&lt;br /&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 311px;" src="http://3.bp.blogspot.com/_XDL74WV16Ms/SjvoPsQTwlI/AAAAAAAAACg/FOK_0jZxRjE/s400/BumpMapping0.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5349124338707841618" /&gt;&lt;/div&gt;&lt;/color&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-5150822731337833101?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/5150822731337833101/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/calculation-deep-normal-map.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5150822731337833101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5150822731337833101'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/calculation-deep-normal-map.html' title='Calculation deep normal map'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XDL74WV16Ms/SjvpGjK-XDI/AAAAAAAAACo/oKeVwqByKn8/s72-c/BumpMapping1.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8304815331273974508</id><published>2009-06-15T17:58:00.000+04:00</published><updated>2009-06-15T18:43:26.231+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calculation'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Calculation normal map for “Bump mapping” &amp; “Parallax Mapping”</title><content type='html'>Расчет normal map для“Bump mapping” и “Parallax Mapping”&lt;br /&gt;&lt;br /&gt;Было время, когда разбирался с реализацией Bump и Parallax Mapping.&lt;br /&gt;В статьях которые я находил, помнится очень раздражали высказывания типа:&lt;br /&gt;"... Для расчета карт нормалей существуют специальные программы. На сайте nVidia для разработчиков есть плагин к PhotoShop'у. Все они действуют по одному и тому же принципу. В них задается карта высот, которая представляет собой черно-белое изображение, на котором более светлые пятна соответствует более высоким местам ..."(из оригинала).&lt;br /&gt;Это не хорошо и не плохо. Просто нужна была конкретика.&lt;br /&gt;&lt;br /&gt;Что нам может дать собственный расчет? Он избавит нас от необходимости включения в проект предварительно рассчитанных normal map текстур. И тем самым сократить размер дистрибутива. Так же во время расчета, проигравшись с коэффициентами, можно добиться различных результатов.&lt;br /&gt;&lt;br /&gt;Потому, дабы сэкономить Вам время, привожу свой пример для XNA GS.&lt;br /&gt;&lt;p&gt;        private Texture2D GenNormalMamp(Texture2D inTex)&lt;br /&gt;        {&lt;br /&gt;            int x = inTex.Width;&lt;br /&gt;            int y = inTex.Height;&lt;br /&gt;            int l = x * y;&lt;br /&gt;            Texture2D   outTex  = new Texture2D(graphics.GraphicsDevice, x, y);&lt;br /&gt;            Color[]     color   = new Color[l];&lt;br /&gt;            float[]     height  = new float[l];&lt;br /&gt;            inTex.GetData&lt;color&gt;(color);&lt;br /&gt;            for (int i = 0; i &lt; l; i++)&lt;br /&gt;            {&lt;br /&gt;                Vector3 v3 = color[i].ToVector3();&lt;br /&gt;                height[i] = (v3.X + v3.Y + v3.Z) / 3;&lt;br /&gt;            }&lt;br /&gt;            float[]     delHeight = new float[8];&lt;br /&gt;            Vector3[]   v38 = new Vector3[8];&lt;br /&gt;            for (int iy = 0; iy &lt; y; iy++)&lt;br /&gt;            {&lt;br /&gt;                for (int ix = 0; ix &lt; x; ix++)&lt;br /&gt;                {&lt;br /&gt;                    if (iy == 0 || iy == y - 1 || ix == 0 || ix == x - 1)&lt;br /&gt;                    {&lt;br /&gt;                        color[iy * x + ix] = new Color(0.5f, 0.5f, 1f, 1f);&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                    delHeight[0] = height[iy * x + ix] - height[(iy - 1)    * x + ix - 1];&lt;br /&gt;                    delHeight[1] = height[iy * x + ix] - height[(iy - 1)    * x + ix    ];&lt;br /&gt;                    delHeight[2] = height[iy * x + ix] - height[(iy - 1)    * x + ix + 1];&lt;br /&gt;                    delHeight[3] = height[iy * x + ix] - height[iy          * x + ix - 1];&lt;br /&gt;                    delHeight[4] = height[iy * x + ix] - height[iy          * x + ix + 1];&lt;br /&gt;                    delHeight[5] = height[iy * x + ix] - height[(iy + 1)    * x + ix - 1];&lt;br /&gt;                    delHeight[6] = height[iy * x + ix] - height[(iy + 1)    * x + ix    ];&lt;br /&gt;                    delHeight[7] = height[iy * x + ix] - height[(iy + 1)    * x + ix + 1];&lt;br /&gt;                    v38[0] = new Vector3(-delHeight[0], -delHeight[0],  1f);&lt;br /&gt;                    v38[1] = new Vector3(0f,            -delHeight[1],  1f);&lt;br /&gt;                    v38[2] = new Vector3(delHeight[2],  -delHeight[2],  1f);&lt;br /&gt;                    v38[3] = new Vector3(-delHeight[3], 0f,             1f);&lt;br /&gt;                    v38[4] = new Vector3(delHeight[4],  0f,             1f);&lt;br /&gt;                    v38[5] = new Vector3(-delHeight[5], delHeight[5],   1f);&lt;br /&gt;                    v38[6] = new Vector3(0f,            delHeight[6],   1f);&lt;br /&gt;                    v38[7] = new Vector3(delHeight[7],  delHeight[7],   1f);&lt;br /&gt;                    Vector3 vS = new Vector3();&lt;br /&gt;                    for (int s = 0; s &lt; 8; s++) vS += v38[s];&lt;br /&gt;                    Vector3 v = vS;&lt;br /&gt;                    v.X = v.X * 0.5f + 0.5f;&lt;br /&gt;                    v.Y = v.Y * 0.5f + 0.5f;&lt;br /&gt;                    color[iy * x + ix] = new Color(v);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            outTex.SetData&lt;color&gt;(color);&lt;br /&gt;            return outTex;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;color&gt;&lt;br /&gt;&lt;p&gt;&lt;color&gt;Берем стандартную текстуру из приложения к Microsoft DirectX SDK:&lt;br /&gt;&lt;/color&gt;&lt;/p&gt;&lt;color&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_XDL74WV16Ms/SjZWbt3xiFI/AAAAAAAAACQ/53L3e26n3yM/s400/Cube4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5347556641719027794" /&gt;&lt;br /&gt;И получаем:&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_XDL74WV16Ms/SjZWoQyeYPI/AAAAAAAAACY/6dNKEWJLQxc/s400/Cube4+normalmap.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5347556857250472178" /&gt;&lt;color&gt;&lt;color&gt;&lt;br /&gt;Если не поленюсь, чуть позже, приведу примеры реализации “Bump mapping” &amp;amp; “Parallax Mapping” в XNA.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/color&gt;&lt;/color&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8304815331273974508?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8304815331273974508/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/calculation-normal-map-for-bump-mapping.html#comment-form' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8304815331273974508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8304815331273974508'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/calculation-normal-map-for-bump-mapping.html' title='Calculation normal map for “Bump mapping” &amp; “Parallax Mapping”'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XDL74WV16Ms/SjZWbt3xiFI/AAAAAAAAACQ/53L3e26n3yM/s72-c/Cube4.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-5069350688378797725</id><published>2009-06-15T16:24:00.000+04:00</published><updated>2009-06-15T17:22:47.149+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Effect “Edge Detect”</title><content type='html'>Последнее время, в форумах, часто упоминается данный эффект. И для тех, кто не знает решил рассказать и приложить рабочий пример на XNA.&lt;br /&gt;&lt;br /&gt;Суть в следующем. Рендеринг выполняется в два прохода, потому для этого нам понадобятся два файла эффектов PositionNormal.fx и EdgeDetect.fx с различными техниками.&lt;br /&gt;&lt;br /&gt;I. Как вы уже догадались первой техникой мы будем рисовать normal map.&lt;br /&gt;&lt;br /&gt;Т.е. в эффекте PositionNormal.fx вместо цвета будем сохранять данные о нормали к данной точке. Но в следствии того, что каждый компонент цвета может хранить число из интервала {0, 1}, а нормали могут иметь отрицательные компоненты, то перед сохранением нормаль упакуем старым добрым способом: &lt;br /&gt;Out.Normal = mul(normal, 0.5f) + 0.5f;&lt;br /&gt;&lt;br /&gt;1) Очищаем экран в цвет Color(0.5f, 0.5f, 0f, 1f), на самом деле это не цвет а так же упокованная нормаль (0f, 0f, -1f, 1f).&lt;br /&gt;&lt;br /&gt;2) Рисуем сцену первый раз при помощи PositionNormal.fx&lt;br /&gt;(Текст эффекта)&lt;br /&gt;float4x4 matWorld   : WORLD;&lt;br /&gt;float4x4 matWVP   : WORLDVIEWPROJECTION; &lt;br /&gt;struct VS_INPUT &lt;br /&gt;{&lt;br /&gt;   float4 Position  : POSITION0;&lt;br /&gt;   float3 Normal  : NORMAL0;&lt;br /&gt;};&lt;br /&gt;struct VS_OUTPUT &lt;br /&gt;{&lt;br /&gt;   float4 Position  : POSITION0;&lt;br /&gt;   float3 Normal  : COLOR0;&lt;br /&gt;};&lt;br /&gt;VS_OUTPUT vs_main( VS_INPUT In )&lt;br /&gt;{&lt;br /&gt;   VS_OUTPUT Out = ( VS_OUTPUT ) 0;&lt;br /&gt;   Out.Position  = mul( In.Position, matWVP );&lt;br /&gt;   float3 normal = normalize(mul(In.Normal, matWorld)); &lt;br /&gt;   Out.Normal  = mul(normal, 0.5f) + 0.5f;&lt;br /&gt;   return Out;&lt;br /&gt;}&lt;br /&gt;struct PS_INPUT &lt;br /&gt;{&lt;br /&gt;   float3 Normal  : COLOR0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;float4 ps_main(PS_INPUT In) : COLOR0&lt;br /&gt;{   &lt;br /&gt; return float4(In.Normal, 1.0f);&lt;br /&gt;}&lt;br /&gt;technique PositionNormal&lt;br /&gt;{&lt;br /&gt;   pass Pass_0&lt;br /&gt;   {&lt;br /&gt;      VertexShader = compile vs_3_0 vs_main();&lt;br /&gt;      PixelShader = compile ps_3_0 ps_main();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;все просто, стоит только заострить внимание на двух строчках:&lt;br /&gt;...&lt;br /&gt;Out.Normal = mul(normal, 0.5f) + 0.5f;&lt;br /&gt;...&lt;br /&gt;return float4(In.Normal, 1.0f);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;3) Нарисованную сцену сохраняем в текстуру&lt;br /&gt;&lt;br /&gt;II. Анализируя полученную normal map, выводим контуры объектов сцены.&lt;br /&gt;&lt;br /&gt;У меня есть несколько вариаций техник для этого эффекта.&lt;br /&gt;Различаются они сложностью геометрии сцены и подходами сравнения нормалей соседних пикселей.&lt;br /&gt;Своем пример я не стал усложнять и рассмотрел случай, когда фигура на сцене имеет гладкие грани (по всей плоскости грани, нормали имеют одинаковое значение).&lt;br /&gt;Рисуем при помощи EdgeDetect.fx&lt;br /&gt;(Текст эффекта)&lt;br /&gt;&lt;br /&gt;float dx;&lt;br /&gt;float dy;&lt;br /&gt;texture ScreenTexture; &lt;br /&gt;sampler ScreenS = sampler_state&lt;br /&gt;{&lt;br /&gt; Texture = &lt;screentexture&gt;; &lt;br /&gt;};&lt;br /&gt;float4 PS(float2 texCoord: TEXCOORD0) : COLOR&lt;br /&gt;{&lt;br /&gt; float4 normal  = tex2D(ScreenS, texCoord); &lt;br /&gt; float4 normalLeft = tex2D(ScreenS, float2(texCoord.x - dx, texCoord.y));&lt;br /&gt; float4 normalRight = tex2D(ScreenS, float2(texCoord.x + dx, texCoord.y));&lt;br /&gt; float4 normalUp  = tex2D(ScreenS, float2(texCoord.x, texCoord.y - dy));&lt;br /&gt; float4 normalDown = tex2D(ScreenS, float2(texCoord.x, texCoord.y + dy));&lt;br /&gt; &lt;br /&gt; float4 normalSum = mul(normalLeft + normalRight + normalUp + normalDown, 0.25f);&lt;br /&gt; &lt;br /&gt; if(normal.x == normalSum.x &amp;amp;&amp;amp; normal.y == normalSum.y &amp;amp;&amp;amp; normal.z == normalSum.z)&lt;br /&gt;  return normal;&lt;br /&gt; else&lt;br /&gt;  return float4(1.0f, 1.0f, 1.0f ,1.0f);  // цвет контура&lt;br /&gt;}&lt;br /&gt;technique EdgeDetect&lt;br /&gt;{&lt;br /&gt; pass P0&lt;br /&gt; {&lt;br /&gt;  PixelShader = compile ps_3_0 PS();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;где:&lt;br /&gt;dx, dy - задают толщину линии контура.&lt;br /&gt;&lt;br /&gt;В этом примере я не стал распаковывать сравниваемые нормали normal и normalSum.&lt;br /&gt;Тут этого не требовалось, и мы не будем перегружать пиксельный шейдер.&lt;br /&gt;Распаковка типа:&lt;br /&gt;normal = (normal - 0.5f) * 2.0f;&lt;br /&gt;Может потребоваться тогда, когда Вам нужно будет анализировать normal map с отображенными объектами, поверхности которых изогнуты.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;В примере кроме контура объекта выводятся цветные грани, не пугайтесь, это для наглядности я отобразил нормали.&lt;/p&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 387px;" src="http://1.bp.blogspot.com/_XDL74WV16Ms/SjZDjBmgooI/AAAAAAAAACI/jDp6hxQhAK4/s400/edgeDetect0.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5347535876553482882" /&gt;&lt;/p&gt;&lt;screentexture&gt;&lt;screentexture&gt;&lt;p&gt;Скачать пример можно &lt;a href="http://www.xnadev.ru/downloads.php?page_id=29"&gt;тут&lt;/a&gt; (для скачивания требуется регистрация на &lt;a href="http://www.xnadev.ru"&gt;xnadev.ru&lt;/a&gt;). &lt;/p&gt;&lt;p&gt;На реализацию эффекта вдохновило &lt;a href="http://www.asd.gr/~navis/ASD-Rapture.zip"&gt;демо&lt;/a&gt;, группы ASD.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/screentexture&gt;&lt;/screentexture&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-5069350688378797725?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/5069350688378797725/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/effect-edge-detect.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5069350688378797725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5069350688378797725'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/06/effect-edge-detect.html' title='Effect “Edge Detect”'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XDL74WV16Ms/SjZDjBmgooI/AAAAAAAAACI/jDp6hxQhAK4/s72-c/edgeDetect0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-5904088667762806264</id><published>2009-05-21T00:12:00.000+04:00</published><updated>2009-05-21T22:30:31.325+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='кри'/><title type='text'>КРИ 2009 послесловие</title><content type='html'>Альтернативное  название статьи: «Как мы стали КРИшнаитами»&lt;br /&gt;&lt;br /&gt;Началось с того, что называется «попали с корабля на бал». Только с самолета, забросили в номер вещи и спустились в зал выставки.&lt;br /&gt;&lt;br /&gt;Мы не ставили высокий приоритет задаче посещения докладов, тем более, что знали – будет снимать «первый игровой»! Стало быть, позже можно будет скачать и комфортно посмотреть дома. Потому некоторое время осматривались, а после пошли знакомиться и общаться с представителями компаний и проектов, представленных в павильоне выставочного комплекса. Не особенно много времени уделяя издателям, процесс растянулся на все три дня.&lt;br /&gt;&lt;br /&gt;Первое серьезное общение произошло с Intel’ом. Очень заинтересовал представленный ими «Graphics Performance Analyzers». Нам были продемонстрированы основные функциональные возможности и режимы анализа. Поговорили о сравнении с похожей DirectX утилитой PIX. Скажу так, я бы очень хотел понаблюдать за соревнованием «GPA против PIX», если таковое случится, и в итоге воспользоваться наилучшим результатом!&lt;br /&gt;Так же поговорили про ежегодные конкурсы проводимые Intel’ом. Признаться я о многом читал ранее, но был уверен, что конкурсы ориентированы либо на графическое железо Intel (видео), либо на то, что приложения должны быть написаны исключительно на С++. Это оказалось не так, ни каких ограничений, NET Framework только приветствуется. Жаль то, что недавно отменили денежные вознаграждения. Но если не забыли – это же Intel. А это означает, что ни кто не отменял много вкусных железяк, вперемешку с кремниевыми пластинами! Так же мне более подробно рассказали про систему оценки специалистов, аналог Microsoft MVP, заключающуюся в присвоении цветных поясов означающих степень умений. Все это очень интересно, в ближайшее время почитаю их сайт.&lt;br /&gt;По ходу разговора Intel’ы, нас щедро просто завалили подарками. Особенно порадовали бубны:&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_XDL74WV16Ms/ShR3ELVhxBI/AAAAAAAAABY/QkyD1gZ8NQ8/s400/бубны.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5338022371987145746" /&gt;&lt;br /&gt;Просто мега зачет!&lt;br /&gt;&lt;br /&gt;Далее прошлись по выставке проектов. Общения было много. На самом деле интересного оказалось гораздо меньше. Неплохо выглядели несколько онлайновых разработок. Это «EARTH2» и «Graft of Gods». Если ребятам хватит сил довести проекты до конца и выдержать акцент оригинальности то «линейка» и ей подобные погибнут.&lt;br /&gt;&lt;br /&gt;Особое внимание хочу обратить внимание на продукт «Folio verso» творческого объединения «SINE CAUSA». Это просто нечто. Нет тут не идет разговор о навороченном 3d и шейдерных спецэффектах. Ребята просто выступали в отдельной весовой категории и соревноваться им было не с кем, по причине отсутствия аналогов.&lt;br /&gt;Поясню, ребята профессиональные фотографы. И судя по их работе, фотографы от бога. Но так как мы говорим о фотографии, это не означает, что в игре нам предлагается статичная картинка. Вовсе нет. Только во время короткой демонстрации я насчитал пять оригинальный фишек-находок, которые очень порадовали глаз, удивили и заинтриговали. У меня, как и у любого другого человека было сложившееся мнение о фотографах и их возможностях, но эти ребята просто порвали стереотипы. И отличились именно в игровом жанре.&lt;br /&gt;Жанр игры можно зауши притянуть к детективному. Почему за уши? Потому что я не знаю, как точно такой жанр называется. Так же имеется интригующий запутанный сюжет, ряд интересных персонажей, глубокая психологическая и скорее всего ближе к развязке сюжета философская подоплека.&lt;br /&gt;&lt;br /&gt;Далее познакомились, разговорились и нашли много общего с ребятами из «Kraken Games».&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_XDL74WV16Ms/ShR3adBuUkI/AAAAAAAAABg/HOUOXN75Wvs/s400/Kraken+Games.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5338022754693042754" /&gt;&lt;br /&gt;Общего потому, что представленный проект - платформер «WARSIDE», реализован на C++OpenGL. Как ни как в рамках этих технологий прошло мое детство. И хоть я уже ни когда не вернусь к ним, всегда есть что вспомнить. Потому было о чем поговорить, посмеяться над характерными данным технологиям сложностями. В разговоре оказалось, что в их команде есть C# кодер, что еще больше оживило беседу. Подняли вопрос о логике работы «сборщика мусора» общеязыковой среды CLR и о том как строить приложения эффективно использующие память.&lt;br /&gt;&lt;br /&gt;До самых больших проектов, дабы как и со всеми обстоятельно пообщаться, смогли пробиться только на третий день.&lt;br /&gt;«U-WARS» компания «BIART STUDIO» - очень зрелищный action. «Gears of War» уходит на пенсию. Буду ждать первых бенчмарков. Как раз будет повод погонять свой gf280. Демонстрация показанная на большом экране понравилась.&lt;br /&gt;&lt;br /&gt;И на последок я оставил «Зов Припяти» от «GSC GAME WORLD».&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_XDL74WV16Ms/ShR4HPaRdLI/AAAAAAAAABo/0EKHT-4XDXk/s400/KRI2009+сталкер.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5338023524132025522" /&gt;&lt;br /&gt;С этими ребятами мы общались дольше всех. В первую очередь обсудили изменения в плане построения развития сюжета и расположения ключевых точек в локациях, механизма изнашивания и заклинивания оружия. Так же нам рассказали массу интересных и веселых моментов возникавших при отладке ИИ со времен первой части. Но как оказалось мало кто знает, и мы тоже, что уже не однократно по Украине и России проводились военизированные игры по сталкерской тематике. Ели говорить коротко, то один из полигонов имел площадь 60 кв.км, у военных арендовали БТР’ы, присутствовали все виды нечисти и все группировки. Больше информации вы найдете на тематических сайтах. Я же в ближайшее время планирую поискать видео. От себя хочу заметить – люди всех возрастов объединенные сталкерством отдыхать умеют! Что не могу сказать о себе. Видимо нужно брать пример и учиться.&lt;br /&gt;&lt;br /&gt;Как наверно и всегда было много ярких девушек:&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_XDL74WV16Ms/ShR4ZktOutI/AAAAAAAAABw/mSFxGrZcZDg/s400/девченки.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5338023839086328530" /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_XDL74WV16Ms/ShR4dlhstsI/AAAAAAAAAB4/D5Mot9Rxl6U/s400/девченки2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5338023908025874114" /&gt;&lt;br /&gt;&lt;br /&gt; На последок расскажу о своем докладе. Скажу честно собой не доволен. Волновался чуть больше чем того стоило. Конкретно не вложился по времени cо своим обзором инструментария XNA GS 3.0 в свои 20 минут, да и сложно было сказать в таких условиях больше. И как в последствии сказал Евгений Марченков: «Дим, если бы я тебя не остановил, ты расска;зывал бы и час». И меня не оправдывает то, что на протяжении последних лет больше всего времени я уделяю общению с интерфейсом Visual Studio. Работать есть над чем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-5904088667762806264?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/5904088667762806264/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/05/2009_20.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5904088667762806264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/5904088667762806264'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/05/2009_20.html' title='КРИ 2009 послесловие'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XDL74WV16Ms/ShR3ELVhxBI/AAAAAAAAABY/QkyD1gZ8NQ8/s72-c/бубны.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3794490644205959426.post-8733465440996977522</id><published>2009-05-14T17:45:00.000+04:00</published><updated>2009-05-21T22:31:05.293+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='кри'/><title type='text'>КРИ 2009</title><content type='html'>&lt;span&gt;КРИ - Конференция Разработчиков компьютерных Игр пройдет с 15 по 17 мая.&lt;br /&gt;подробности:&lt;a href="http://www.blogger.com/post-edit.g?blogID=3794490644205959426&amp;postID=8733465440996977522"&gt; kriconf.ru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Все выступления КРИ-2009 будут записываться телеканалом«Первый Игровой» (Gameplay TV) и позже будут доступны на официальном сайте конференции в стандартном и высоком разрешениях.&lt;br /&gt;подробности: &lt;a href="http://www.dtf.ru/news/read.php?id=55462"&gt;dtf.ru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;От себя добавлю, буду выступать во второй день, доклад в котором я приму участие называется -&lt;br /&gt;&lt;i&gt;&lt;span&gt;"Практика разработки игр на XNA Game Studio 3.0 под PC и XBOX 360"&lt;/span&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Поясню несколько опорных моментов, по поводу того, что впоследствии будет мною сказано:&lt;br /&gt;- Во первых, все мои слова будут отражать характер моей, индивидуальной точки зрения. Описывать мое личное отношение к XNA, мои мысли.&lt;br /&gt;- Во вторых не стоит питать иллюзий по поводу того, что я каким то волшебным образом за столь короткий отведенных промежуток времени смогу описать всю техническую картину, реализованную в XNA GS и соответственно прокомментировать с точки зрения своего опыта.&lt;br /&gt;&lt;br /&gt;С удовольствием отвечу на возникшие впоследствии вопросы в рамках тематического ресурса &lt;a href="http://www.xnadev.ru/"&gt;XNAdev.ru&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3794490644205959426-8733465440996977522?l=dtimofeev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dtimofeev.blogspot.com/feeds/8733465440996977522/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dtimofeev.blogspot.com/2009/05/2009.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8733465440996977522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3794490644205959426/posts/default/8733465440996977522'/><link rel='alternate' type='text/html' href='http://dtimofeev.blogspot.com/2009/05/2009.html' title='КРИ 2009'/><author><name>Dmitry Timofeev (general)</name><uri>http://www.blogger.com/profile/05545583070070386907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_XDL74WV16Ms/Sfcu_Qt7RPI/AAAAAAAAAA4/P2D17d8ze1Y/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry></feed>
