c++快板绘图精灵(即使没有任何循环)减慢图像速度
C++ Allegro Drawing Sprites (even without any loop) Slows Graphics Down
我正在用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
被多次调用。
相关文章:
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 螺旋矩阵在最后一个"for"循环中中断,不显示任何内容
- 简单的 for() 循环基准测试在任何循环绑定下花费相同的时间
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- 在未满足条件时的任何时刻结束一个段循环
- 为什么循环迭代不打印任何东西?
- 布雷森汉姆线抽屉在渲染任何内容之前经过一定循环后崩溃
- 在循环体内宣布变量有任何缺点
- 如果找不到解决方案,我如何留下递归循环,而不会打印任何东西
- 循环时嵌套有任何问题
- 循环,直到没有遇到 std::vector 的任何元素
- 是否有任何函数可用于在 c++ 编程中传输流程,以替代 while 或 do while 循环
- C 循环虽然不等于任何两个值
- 如果任何条件是错误的,如何从for循环中返回false
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- 使用 for 循环反转数组不执行任何操作
- 这段代码如何在没有任何循环语句或'goto'或递归的情况下循环?
- 如果存在任何循环关系,我应该假设弱指针使用吗?
- OpenMP:嵌套的 for 循环,执行时间几乎没有任何差异
- 是否有任何预处理器指令控制循环展开