allegro 5线程影响帧速率

时间:2014-08-25 01:42:01

标签: c++ multithreading allegro5

我正在使用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 个答案:

答案 0 :(得分:1)

在没有显示器的线程上加载时,您将获得内存位图。

在Allegro 5.0上,一旦活动线程显示,就可以al_clone_bitmap()。在5.1上,您可以使用al_convert_bitmap()al_convert_bitmaps()