четверг, июля 26, 2007

Страничка Криса Хекера

Крис Хекер (Chris Hecker) - про свою должность пишет, что он Technology Fellow, Maxis/Electronic Arts. Работает над Spore.

На его страничке много чего интересного, меня в первую очередь заинтересовал его доклад How To Animate a Character You've Never Seen Before. Это слайды и аудиозапись с GDC'07. Жалко, что нет видео. Он явно много жестикулирует, демки какие-то показывает. Вот этого всего не видно.



Формат для свой странички он выбрал странный. Это wiki. Но там можно получать обновления по RSS и e-mail, то есть от блога практически не отличается.

Ссылки по теме
Уилл Райт об игре Spore

среда, июля 25, 2007

Текстурирование Google Earth

На блоге RealityPrime Ави Бар-Зив (Avi Bar-Zeev) публикует серию постов под названием How Google Earth [Really] Works. Ави участвовал в разработке Google Earth на начальном этапе. Тогда это еще не имело отношение к Гуглу, называлось Earthviewer и было потом Гуглом куплено.
Первый пост был как раз о текстурировании. Их подход к текстурированию называется Universal Texture и защищен патентом. Ави как раз занимался реализацией Universal Texture. В его посте приведена ссылка на статью, подробно описывающую работу этого подхода. Он рассказывает о текстурировании очень подробно, останавливаясь на таких базовых вещах как билинейная фильтрация и мипмэппинг. Я это все опущу, если не знаете что это такое - я привела ссылки, да и самого Ави можно почитать. У меня здесь будет что-то вроде краткого пересказа статьи The Clipmap: A Virtual Mipmap, на которую ссылается Ави.

Вкратце отрисовка земного шара на клиенте выглядит так: надо нарисовать кусок земной поверхности и положить на него текстуру Земли, снятую со спутника.
Итоговая текстура у них получилась размером 40 млн на 20 млн текселов. Плюс мипмэп уровни, стандартные, по степеням двойки. Как уже можно догадаться размер получается большой. На самом деле примерно 11 петабайт. Много, короче. А это все надо передать по сети клиенту. И наложить на машине пользователя на кусок земного шара, а в оперативную память такое не влезет. Обычное решение в таком случае - текстуру порезать на куски, хранить не целиком, а кусками, и уже с ними работать. Тут, правда, всплывают проблемы с совмещением этих кусков, появляются ограничения на геометрию. Разработчики решили, что эти проблемы им не нужны, что у них Свой Путь и они ничего резать на куски не будут. А будут хранить всю текстуру целиком, а на клиента передавать только то подмножество, которое клиенту в данный момент нужно. В итоге получается, что клиенту нужно где-то 35 мегабайт. Тут все зависит от качества текстуры, его ведь можно варьировать, Ави пишет, что достаточно 17 мегабайт.

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

Чтобы фпс был плавным, загрузка текстуры на клиента происходит маленькими тоненькими кусочками. По максимуму стараются подгрузить до того как этот кусок понадобится. Если опоздали - то сразу после того как он понадобился.

В The Clipmap: A Virtual Mipmap это все описано подробно и загрузочно, с наглядными схемами.

По ходу своего рассказа Ави высказывает интересную идею - скрестить Google Earth и Second Life (Кстати, исходники клиента Second Life открыты, их можно посмотреть прямо сейчас).

Ссылки по теме:
Ланс Виллиамс изобрел мипмэппинг в 1983 году и описал его в работе Pyramidal parametrics.

понедельник, июля 16, 2007

На этой неделе планирую работы на блоге

В течение этой недели собираюсь разобраться с давно накопившимися проблемами. Середина лета, поток читателей схлынул, самое время. Я постараюсь сделать все быстро и аккуратно, но все же мои действия чреваты мелкими глюками. Не пугайтесь, если что.

Чего буду делать. Во-первых, разбираться с шаблоном. На Блоггере появились какие-то новые возможности управления шаблоном, буду с ними разбираться. Внешний вид блога останется прежним.
Во-вторых, надо проставить категории к старым сообщениям, наконец. Я долго с этим тянула, потому что не хотела в очередной раз рушить трансляцию в ЖЖ. Но чего с этим делать я так не придумала, а держаться нету больше сил. При любой правке старых сообщений идет обновление фида. Это нормально... Но синдикация в ЖЖ воспринимает это как новое сообщение и вываливает его всем подписчикам во френдленту. Управлять трансляцией я не могу никак. А старые посты я правлю довольно-таки часто. Исправляю опечатки, дописываю апдейты... Сейчас вот категории надо проставить. Поэтому, если старые сообщения в фиде будут вас беспокоить, отключитесь от синдикации моего блога на недельку. И я прошу все же пользоваться другими способами чтения фида, по возможности.

пятница, июля 13, 2007

Безопасность в С++

C++: A Cautionary Tale, or, 1 Hour Of Your Black Hat Trip is Spoken For - Томас Пташек рассказывает почему язык С++ небезопасен. Критикует следующие моменты.

Исключения. Есть такая точка зрения, что исключения есть зло. По этому поводу еще как-то Джоэл Спольски высказывался. Пташек рассказывает о следующем: после выброса исключения останавливается выполнение всех функций по цепочке до места выброса исключения. И в этих функциях могут остаться невалидные уже указатели.

delete. В С++ есть выражение delete и есть delete[]. И их очень легко перепутать. У меня есть старый пост про работу delete'ов Что делает выражение вида delete p. Пташек дает ссылку на Attacking delete and delete [] in C++, где гораздо подробнее рассказывается о работе delete'ов, со схемами использования ошибок программистов для всяких злобных дел.

STL. Итераторы, например, вектора становятся невалидными после изменения этого вектора.

Это не все, у Пташека написано больше и подробнее. Все эти проблемы решаются, все знают как их решать. Чтобы не было неприятностей с исключениями есть RAII, потом нужно вызывать правильный вариант delete и быть повнимательнее с итераторами... Но люди, они ошибаются.

Цитата из поста Пташека:
"Я - специалист по безопасности, которому платят, чтобы проискивать исходники самых крупных и известных C++ продуктов и, проблема в том, что я продолжаю находить ошибки. Просто знать как надо делать недостаточно."

вторник, июля 10, 2007

Объявление функции или экземпляра класса?

Интересная проблема из переписки. Есть код вида:


class CFoo
{
public:
CFoo(int i)
{
cout<<"CFoo::CFoo(int i)"<<endl;
}

CFoo()
{
cout<<"CFoo::CFoo()"<<endl;
}

void Print()
{
cout<<"CFoo::Print"<<endl;
}
};


int main(int argc, char* argv[])
{
CFoo foo1(1);
foo1.Print();

CFoo foo2;
foo2.Print();

CFoo foo3();
foo3.Print(); //ошибка
}


Этот код не будет откомпилирован. На foo3.Print() компилятор скажет что-то вроде.

error: request for member `Print' in `foo3', which is of non-class
type `CFoo ()()'

Тут все дело в том, что объявление вида
T f();
распознается компилятором не как объявление экземпляра класса, а как объявление функции. (Стандарт, 8.5/8).
То есть CFoo foo3(); - это функция без параметров, возвращающая CFoo.

Чтобы таки объявить экземпляр класса надо сделать так
T f = T();

или так

T f;

Ссылки по теме:
comp.lang.c++.moderated - ambiguity resolution between function declaration and object declaration

пятница, июля 06, 2007

Герб Саттер будет вести колонку в DDJ по параллелизму

Герб Саттер начал вести колонку в DDJ, посвященную параллелизму. Первая статья уже вышла, называется The Pillars of Concurrency. Посвящена тому, что когда люди говорят о параллелизме, то зачастую имеют в виду разные вещи. То есть как раз тому, с чем возникли проблемы в комментариях к посту Google, PeakStream и RapidMind.
Герб Саттер грозится, что, возможно, книжку выпустит по результатам этих статей...

понедельник, июля 02, 2007

Рутковска против команды Пташека

У Not a kernel guy прочитала. Джоанна Рутковска, специалист в области безопасности, написала некий руткит, который назвала Blue Pill (это из "Матрицы" название). Этот руткит позволяет получить полный контроль над Вистой, при этом его обнаружить никак нельзя. Вернее, это Джоанна утверждает, что обнаружить его никак нельзя. Есть люди, которые считают, что очень даже можно и они готовы это доказать. Их всего четверо, на них ссылаются как на "команду Пташека", потому что Томас Пташек у них вроде как за главного. Они предложили установить Blue Pill на один из двух компьютеров. Команда Пташека напишет детектор, который обнаружит на какой из них установлен Blue Pill. Джоанна вроде как этот вызов приняла, но с оговорками. Некоторые оговорки нормальные - она хочет, чтобы в эксперименте участвовали не две машины, а пять. Это справедливо, чтобы эксперимент был показательным двух машин мало, там угадать легко. Но кроме этого она хочет много денег. В итоге она сейчас с командой Пташека препирается. Чем дело кончится непонятно, но народ оживился, ибо мероприятие может получиться веселое.

Напоследок куча ссылок:
Rutkowska Faces 'Blue Pill' Rootkit Challenge - обсуждение происходящего на Слэшдоте

invisible things - блог стартапа Джоанны. Пока только она туда и пишет


Rutkowska on Cheating Physical Memory Acquisition: Details


Joanna’s Shocking Confession: There Exists Some Amount Of Money For Which I Would Agree To See BluePill Detected By Lawson, Ferrie, Dai Zovi and Ptacek.


Five Hackers Who Left a Mark on 2006