понедельник, июня 18, 2012

Интервью Алексея Пахунова на OpenQuality.ru

Хорошее интервью и название правильное: Нужно дело делать, а не языком трепаться

В послужном списке Алексея Пахунова, известного как «Not a kernel guy», более семи лет работы в трех подразделениях Microsoft (Office, OSD и MSR), участие в двух крупных проектах (Axapta и Windows) и нескольких мелких. Текущее место работы – Google. Низкоуровневая разработка, “серьезность” разработчика, тестирование Windows и Chrome, “шерифы” в Google, TDD “по-взрослому”, время-качество-деньги, импровизация как причина авралов – вот некоторые темы нашей беседы.

понедельник, июня 11, 2012

Обзор исходников Doom3

Некоторое время назад исходники Doom3 были выложены в открытый доступ. Но в исходниках без доков разбираться довольно тяжело. Так вот, Фабьен Санглар написал по ним обзор со схемами, картинками, видео. Также он позадавал вопросы Кармаку по исходникам. Если вы мечтаете писать игры, но не знаете с чего начать, то Фабьен сделал вам прекрасный подарок.

Несколько фактов оттуда:

  • Впервые в истории id Software код написан на С++, а не на С
  • В коде широко используются абстракция данных и полиморфизм
  • Темплейты используются только для низкоуровневого кода
  • По мнению Фабьена это вторая по качеству кодобаза от id Software после Doom iPhone
  • Благодаря инкапсуляции код легко читать
  • Дни оптимизации ассемблерного кода на низком уровне прошли
Бонус: Кармак рассказывает о своих экспериментах с очками виртуальной реальности и о проблемах с задержкой отрисовки. Carmack Being Carmack: A Dozen Minutes With One of Video Game’s Smartest People

понедельник, июня 04, 2012

Статья Hash Functions for C++ Unordered Containers

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


cannot convert from 'const Name' to 'size_t'
Это крайне невразумительное сообщение об ошибке означает, что вы должны определить хэш-функцию для своего класса, чтобы можно было его использовать с данным контейнером.
О том как это сделать есть хорошая подробная статья Hash Functions for C++ Unordered Containers.
Пример оттуда с самым простым способом определить хэш-функцию


//
// This program uses a simple user-defined function
// to provide a hash function for use in unordered_map
//
// Compile this example with Visual Studio 2010
// or g++ 4.5 using -std=c++0x
//
#include <iostream>
#include <unordered_map>
#include <string>
#include <functional>

using namespace std;

typedef pair<string,string> Name;

size_t name_hash( const Name & name )
{
    return hash<string>()(name.first) ^ hash<string>()(name.second);
}

int main(int argc, char* argv[])
{
 unordered_map<Name,int,decltype(&name_hash)> ids(100, name_hash );
 ids[Name("Mark", "Nelson")] = 40561;
 ids[Name("Andrew","Binstock")] = 40562;
 for ( auto ii = ids.begin() ; ii != ids.end() ; ii++ )
     cout << ii->first.first
          << " "
          << ii->first.second
          << " : "
          << ii->second
          << endl;
 return 0;
}