c++快板绘图精灵(即使没有任何循环)减慢图像速度

C++ Allegro Drawing Sprites (even without any loop) Slows Graphics Down

本文关键字:循环 任何 速度 图像 绘图 精灵 c++      更新时间:2023-10-16

我正在用c++开发一款使用Allegro的2D平台游戏。然而,有一个问题。在游戏中,角色拥有橡皮子弹,当子弹发射时,子弹会永远从墙上反射出来。角色有能力发射30发子弹,然而,子弹数越多,图像变得越慢。尽管我没有使用任何循环来绘制任何子弹的运动,但游戏不可避免地减慢了速度。下面是移动项目符号的函数:

void Character :: moveBullets(void){
if(bullet_turn != bullet_count){
    bullet_chain[bullet_turn++]->move();        
else
    bullet_turn = 0;}

函数move():

rectfill(buffer, getX(), getY(), getX() + bullet_image[direction]->h, getY() + bullet_image[direction]->w, 0);
//update direction 
acquire_screen();
draw_sprite(buffer, bullet_image[direction], x, y);
blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
release_screen();

}

我该怎么办?当绘制许多精灵时,快板是否总是放慢速度?

如果我正确理解你的代码,你是复制整个屏幕从你的缓冲区到屏幕上的每一个子弹。这真是你想要的吗?

另外,您确定应该使用acquire_screen()吗?acqure_bitmap

的文档https://www.allegro.cc/manual/4/api/bitmap-objects/acquire_bitmap

说它在某些情况下会导致速度变慢。

根据acquire_screen调用的acquire_bitmap文档,您应该尽量减少调用的次数。通常,这意味着在更新过程开始时调用这个,然后在释放锁之前执行所有绘图的

…大多数绘图函数在绘制视频位图之前需要锁定它。但是这样做是非常慢的,所以如果你在主重绘函数开始时只获取一次屏幕,然后调用多个需要锁定位图的绘制操作,并且只在完成时释放它,你将获得更好的性能。

从当前的示例代码中无法判断,但我怀疑moveBullets被多次调用。