Поток allegro 5, влияющий на частоту кадров
Я делаю игру, используя Visual Studio C++ и Allegro 5. Чтобы создать загрузочную анимацию, я решил создать поток, используя al_create_thread, загрузить все свои изображения и звуки вместе с ним, а затем уничтожить его после того, как все загрузится. Таким образом, я могу использовать цикл while для воспроизведения анимации, пока поток загружает все. К сожалению, после переключения на этот метод моя частота кадров падает как сумасшедшая и в основном делает игру непригодной для игры, и если я вместо этого загружаю все в свою основную функцию, частота кадров возвращается к нормальной, но у меня не может быть анимации загрузки. Я не понимаю, почему поток вызывает проблемы, если я уничтожаю его после того, как это сделано.
Вот моя функция потока:
static void*loading_thread(ALLEGRO_THREAD*load, void*data)
{
al_init_image_addon();
al_init_primitives_addon();
al_install_audio();
al_init_acodec_addon();
al_reserve_samples(20);
machinegun = al_load_sample("machine gun.ogg");
machinegun_instance = al_create_sample_instance(machinegun);
al_set_sample_instance_playmode(machinegun_instance, ALLEGRO_PLAYMODE_LOOP);
al_set_sample_instance_gain(machinegun_instance, 2);
al_attach_sample_instance_to_mixer(machinegun_instance, al_get_default_mixer());
zombie_moan = al_load_sample("zombie moan.ogg");
zombie_attack = al_load_sample("zombie attack.ogg");
jab = al_load_sample("jab.ogg");
all_nightmare_long = al_load_sample("All Nightmare Long.ogg");
all_nightmare_long_instance = al_create_sample_instance(all_nightmare_long);
al_set_sample_instance_playmode(all_nightmare_long_instance, ALLEGRO_PLAYMODE_LOOP);
al_attach_sample_instance_to_mixer(all_nightmare_long_instance,al_get_default_mixer());
playerImage = al_load_bitmap("soldier.bmp");
al_convert_mask_to_alpha(playerImage, al_map_rgb(110, 80, 52));
player->Init(playerImage);
objects.push_back(player);
zombieImage = al_load_bitmap("zombie3.bmp");
al_convert_mask_to_alpha(zombieImage, al_map_rgb(106, 76, 48));
done_loading = true;
return NULL;
}
Вот код в моем main, который использует функцию потока (цикл while является просто заполнителем для моей анимации):
loading = al_create_thread(loading_thread, NULL);
al_start_thread(loading);
while(!done_loading)
{
al_draw_textf(font18, al_map_rgb(255,255,255), WIDTH / 2, HEIGHT / 2, ALLEGRO_ALIGN_CENTRE, "Loading... %i", a);
a++;
al_flip_display();
al_clear_to_color(al_map_rgb(0,0,0));
}
al_destroy_thread(loading);
1 ответ
При загрузке в потоке без дисплея вы получите растровые изображения памяти.
На Allegro 5.0 вы можете тогда al_clone_bitmap()
когда активным потоком является тот, с дисплеем. На 5.1 вы можете использовать al_convert_bitmap()
или же al_convert_bitmaps()
,