Недавно я пытался разработать 2D-игру в стиле Terraria, используя SFML и c ++. Все работает отлично, ожидайте случайного поколения местности. В настоящее время у меня есть цикл for, который назначает позицию и текстуру массиву спрайтов (например, int grass [150]), которые затем выводятся на экран с помощью цикла for. Ландшафт генерирует и выглядит хорошо, но каждый раз, когда моя программа зацикливается, на экран выводятся несколько массивов спрайтов. Это вызывает некоторые серьезные проблемы с производительностью, потому что в настоящее время около 1400 спрайтов (только часть от количества, которое я хочу, когда игра закончится) рисуется каждый раз, когда моя программа зацикливается.
Итак, мой вопрос к вам, как мне сделать так, чтобы моя местность создавалась эффективно? Есть ли способ очистить только часть спрайтов на экране за раз или очистить только спрайт, когда он модифицирован? Есть ли лучший способ создания ландшафта, кроме использования нескольких массивов спрайтов?
Я думаю, что в вашем вопросе есть несколько недоразумений, но вот несколько моментов, на которые вы должны обратить внимание:
Как отмечали другие, рисуйте только плитки местности, которые на самом деле на экране. Вам не нужно рисовать весь мир в каждом кадре.
Если ваш мир не изменится (или не сильно изменится, кроме действий игрока), вы можете попытаться отрендерить его раз и навсегда и кэшировать этот рендеринг в текстуру, которую вы бы отобразили (с хорошим смещением, соответствующим значению in — игровая позиция игрока). Больше не нужно перебирать тайлы и массивы. Взгляни на RenderTexture
. Конечно, если ваш игрок может копать или делать какие-либо изменения в мире, вы не можете использовать эту текстуру вечно, но это может быть хорошей идеей делать это после каждого изменения, так как изменения происходят не так часто по сравнению с рендерингом, поэтому Я думаю, вы все еще можете извлечь выгоду из этого.
Вы упомянули множество спрайтов. Я надеюсь, что у вас нет экземпляра sf::Sprite
для каждой плитки травы, каждой плитки камня и т. д.? В случае, если вы делаете, есть только один спрайт каждой плитки, и используйте ее, чтобы нарисовать каждую плитку ее типа, просто изменив ее координаты и перетянув к цели рендеринга. Но я, возможно, неправильно понял ваш вопрос.
Попробуйте нарисовать меньше плиток, нет необходимости рисовать каждую плитку в мире, так как большинство из них не видны.
Нарисуйте только количество плиток, которые могут быть видны на экране за один раз, плюс немного больше, например, если на экране можно разместить только плитки размером 7х4, рисуйте около 9х6.
Это поможет сократить время, затрачиваемое на рисование невидимых плиток.