快板5线程影响帧率

allegro 5 thread affecting framerate

本文关键字:帧率 影响 线程 快板      更新时间:2023-10-16

我正在使用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);

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

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