0

我正在使用 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 是否总是放慢速度?

4

2 回答 2

2

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

另外,你确定你应该使用acquire_screen()吗?获取位图的文档

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

说它在某些情况下会导致减速。

于 2013-05-26T12:54:43.650 回答
1

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

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

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

于 2013-05-26T12:52:19.080 回答