C ++ Allegro Drawing Sprites(即使没有任何循环)也会降低图形速度

时间:2013-05-26 11:24:26

标签: c++ sprite allegro performance

我正在使用Allegro和C ++开发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();

}

我该怎么办?在绘制许多精灵时,Allegro总是会减速吗?

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的代码,您将整个屏幕从缓冲区复制到每个项目符号的屏幕上。这真的是你想要的吗?

另外,你确定你应该使用acquire_screen()吗? acquire_bitmap

的文档

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

表示在某些情况下会导致速度放缓。

答案 1 :(得分:1)

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

  

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

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