C++;Allegro绘制精灵(即使没有任何循环)会减慢图形速度 我正在用C++的AlelGRO开发一个2D平台游戏。然而,有一个问题。在游戏中,角色有橡皮子弹,当子弹发射时,它会永远从墙上反射。角色可以发射30发子弹,但是,子弹数量越多,图形速度越慢。虽然我没有使用任何循环来绘制任何子弹的运动,但游戏不可避免地会变慢。以下是移动项目符号的功能: void Character :: moveBullets(void){ if(bullet_turn != bullet_count){ bullet_chain[bullet_turn++]->move(); else bullet_turn = 0;}

C++;Allegro绘制精灵(即使没有任何循环)会减慢图形速度 我正在用C++的AlelGRO开发一个2D平台游戏。然而,有一个问题。在游戏中,角色有橡皮子弹,当子弹发射时,它会永远从墙上反射。角色可以发射30发子弹,但是,子弹数量越多,图形速度越慢。虽然我没有使用任何循环来绘制任何子弹的运动,但游戏不可避免地会变慢。以下是移动项目符号的功能: void Character :: moveBullets(void){ if(bullet_turn != bullet_count){ bullet_chain[bullet_turn++]->move(); else bullet_turn = 0;},c++,sprite,allegro,performance,C++,Sprite,Allegro,Performance,下面是函数move(): } 我该怎么办?当画很多精灵时,快板总是慢下来吗 根据文档,即acquire\u屏幕调用,您应该尽量减少调用次数。通常这意味着在更新过程开始时调用它,然后在释放锁之前执行所有图形 …大多数绘图函数需要在绘制视频位图之前锁定它。但是这样做非常慢,因此如果在主重画函数开始时只获取一次屏幕,然后调用需要锁定位图的多个绘图操作,并且仅在完成后才释放它,则性能会更好 无法从当前示例代码中辨别,但我怀疑正在多次调用movebollets。根据acquire\u screen调用的文

下面是函数move():

}

我该怎么办?当画很多精灵时,快板总是慢下来吗

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

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

无法从当前示例代码中辨别,但我怀疑正在多次调用
movebollets

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

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


无法从当前的示例代码中辨别,但我怀疑正在多次调用
movebollets

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

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


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

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

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


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

随着时间的推移,每个项目符号是如何更新的?您所展示的代码中没有循环,但是您是否必须随着时间的推移更新每个项目符号?每个项目符号是如何随着时间的推移而更新的?您所展示的代码中没有循环,但是您是否需要随着时间的推移更新每个项目符号?非常感谢您的回答。你们都是对的,我在为每个项目符号做blitting,我应该在缓冲区中绘制所有的图形,然后当所有项目符号位置(和字符)更新完成后,再将缓冲区blit到屏幕上一次。现在它工作得很好,没有任何减速。再次感谢!非常感谢你的回答。你们都是对的,我在为每个项目符号做blitting,我应该在缓冲区中绘制所有的图形,然后当所有项目符号位置(和字符)更新完成后,再将缓冲区blit到屏幕上一次。现在它工作得很好,没有任何减速。再次感谢!
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();