Я занимаюсь разработкой 2D-игры на платформе Allegro с C ++. Тем не менее, есть проблема. В игре у персонажа есть резиновые пули, и когда пуля стреляет, она отражается от стен навсегда. Персонаж имеет возможность выстрелить 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();
}
Что я должен делать? Аллегро всегда замедляется, когда рисует много спрайтов?
Если я правильно понимаю ваш код, вы копируете весь экран из буфера на экран для каждой маркировки. Это действительно то, что вы хотите?
Кроме того, вы уверены, что вы должны использовать acqu_screen ()? Документация для acqu_bitmap
https://www.allegro.cc/manual/4/api/bitmap-objects/acquire_bitmap
говорит, что это может вызвать замедление в некоторых случаях.
Согласно acquire_bitmap документация, которая acquire_screen
звонки, вы должны минимизировать количество звонков. Как правило, это будет означать вызов этого в начале процесса обновления, а затем выполнить все чертежа перед снятием блокировки.
…большинству функций рисования необходимо заблокировать растровое изображение перед его рисованием. Но делать это очень медленно, поэтому вы получите гораздо лучшую производительность, если вы получите экран только один раз в начале своей основной функции перерисовки, затем вызовете несколько операций рисования, для которых нужно заблокировать растровое изображение, и отпустите его только после завершения.
Невозможно сказать из текущего примера кода, но я подозреваю, что moveBullets
вызывается несколько раз.