Вообщем написание библиотеки MotionX на текущий момент закончено. Проект на sf.net зарегистрирован. В ближайшие выходные буду комментировать интерфейсы в формате doxygen и генерировать документацию. Настрою системы сборки, к текущей Scons добавлю CMake. Проведу серию тестов, что бы выявить стабильность системы, утечки памяти и прочие ошибки. И если всё будет благополучно, то выложу первый релиз на sf.net.
Кстати, оказалось, что xmmintrin.h это не только MS-specific, оно есть и под GCC на x86 платформе. А значит и под линуксом библиотека сможет использовать SSE.
Я вчера запустил анимацию 50 персонажей, с 50-ти костями на каждом. С SSE фпс было в районе 700, а без SSE - 30.
То есть SSE даёт, в моём случае, более чем двадцати кратное увеличение производительности! Я сам такого не ожидал.
Так что польза от этой технологии иногда может быть весьма ощутимой.
Хотя отключить применение SSE всегда можно флагами компиляции.
Showing posts with label motionx. Show all posts
Showing posts with label motionx. Show all posts
Tuesday, February 12, 2008
Sunday, February 03, 2008
рефакторинг в motionx
Продолжаю делать мощный рефакторинг в библиотеке MotionX. Сегоня сделал inplace загрузку анимаций. Получилось неплохо, особенно если сравнить со старым вариантом.
Было:
Стало:
В результате вместо N+1 аллокаций памяти на один файл анимации, получил всего лишь 2.
Где N - количество кадров. Учитывая то, что анимации могут занимать весьма ощутимое количество памяти, это неплохой выигрышь. Причём тут куда важнее не скорость загрузки, хотя и она сильно возрасла, а то, что память меньше фрагментируется таким образом.
Было:
template<>
motionx::FrameSetCPtr Create<motionx::FrameSet>(const std::string& file)
{
motionx::FrameSetPtr anim(new motionx::FrameSet);
std::ifstream in;
in.open(file.c_str(), std::ios_base::in | std::ios_base::binary);
if (io::get<int>(in) != anim_file_magic_number)
throw motionx::bad_resource("Wrong file type.", file);
if (io::get<int>(in) != anim_file_version)
throw motionx::bad_resource("Wrong file version.", file);
int frames_count = io::get<int>(in);
int frame_size = io::get<int>(in);
for (int i = 0; i < frames_count; ++i)
{
float time = io::get<float>(in);
motionx::Frame frame;
frame.resize(frame_size);
frame.Pivot = io::get<mtl::rigid_tm>(in);
std::generate(frame.begin(), frame.end(), boost::bind(io::get<mtl::rigid_tm>, boost::ref(in)));
anim->AddFrame(frame, time);
}
return anim;
}Syhi-подсветка кода
motionx::FrameSetCPtr Create<motionx::FrameSet>(const std::string& file)
{
motionx::FrameSetPtr anim(new motionx::FrameSet);
std::ifstream in;
in.open(file.c_str(), std::ios_base::in | std::ios_base::binary);
if (io::get<int>(in) != anim_file_magic_number)
throw motionx::bad_resource("Wrong file type.", file);
if (io::get<int>(in) != anim_file_version)
throw motionx::bad_resource("Wrong file version.", file);
int frames_count = io::get<int>(in);
int frame_size = io::get<int>(in);
for (int i = 0; i < frames_count; ++i)
{
float time = io::get<float>(in);
motionx::Frame frame;
frame.resize(frame_size);
frame.Pivot = io::get<mtl::rigid_tm>(in);
std::generate(frame.begin(), frame.end(), boost::bind(io::get<mtl::rigid_tm>, boost::ref(in)));
anim->AddFrame(frame, time);
}
return anim;
}Syhi-подсветка кода
Стало:
Animation* LoadBinaryAnimation(MotionXLib* lib, const char* filename)
{
IFileSystem* fs = lib->FileSystem();
AutoFileHandle f = (fs->Open(filename, "r+b"), fs);
if (!f)
{
OnError(IOError(filename));
return;
}
size_t fileSize = fs->Size(f);
int magicNumber = 0;
int version = 0;
fs->Read(f, (char*)&magicNumber, 4);
fs->Read(f, (char*)&version, 4);
if (magicNumber != anim_file_magic_number || version != anim_file_version)
{
OnError(BadResource(filename));
return;
}
InplaceAnimation* animData = AllocateMemory(fileSize - 8);
fs->Read(f, animData, fileSize - 8);
return new Animation(animData);
}Syhi-подсветка кода
{
IFileSystem* fs = lib->FileSystem();
AutoFileHandle f = (fs->Open(filename, "r+b"), fs);
if (!f)
{
OnError(IOError(filename));
return;
}
size_t fileSize = fs->Size(f);
int magicNumber = 0;
int version = 0;
fs->Read(f, (char*)&magicNumber, 4);
fs->Read(f, (char*)&version, 4);
if (magicNumber != anim_file_magic_number || version != anim_file_version)
{
OnError(BadResource(filename));
return;
}
InplaceAnimation* animData = AllocateMemory(fileSize - 8);
fs->Read(f, animData, fileSize - 8);
return new Animation(animData);
}Syhi-подсветка кода
В результате вместо N+1 аллокаций памяти на один файл анимации, получил всего лишь 2.
Где N - количество кадров. Учитывая то, что анимации могут занимать весьма ощутимое количество памяти, это неплохой выигрышь. Причём тут куда важнее не скорость загрузки, хотя и она сильно возрасла, а то, что память меньше фрагментируется таким образом.
Subscribe to:
Posts (Atom)