Было:
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 - количество кадров. Учитывая то, что анимации могут занимать весьма ощутимое количество памяти, это неплохой выигрышь. Причём тут куда важнее не скорость загрузки, хотя и она сильно возрасла, а то, что память меньше фрагментируется таким образом.
1 comment:
так релиз-то вообще будет или нет? :) вообще какие планы после выхода?
Post a Comment