Я использую SDL2 для написания игры, которая отображает тайловую карту в каждом кадре, но производительность слишком низкая. Я написал небольшую программу, чтобы изолировать проблему. Учтите, что «temp.bmp» — это изображение размером 16x16.
#include <stdio.h>
#include "SDL2/SDL.h"
#include "SDL2/SDL_timer.h"
#include "SDL2/SDL_image.h"
int main()
{
SDL_Window* win;
SDL_Renderer* ren;
int x, y;
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(800, 600, 0, &win, &ren);
SDL_Surface* sf = IMG_Load("temp.bmp");
SDL_Texture* tx = SDL_CreateTextureFromSurface(ren, sf);
for(;;) {
Uint32 t = SDL_GetTicks();
for(x=0; x<800; x+=16) {
for(y=0; y<600; y+=16) {
SDL_Rect src = { 0, 0, 16, 16 };
SDL_Rect dst = { x, y, 16, 16 };
SDL_RenderCopy(ren, tx, &src, &dst);
}
}
SDL_RenderPresent(ren);
printf("%ld ms\n", SDL_GetTicks() - t);
}
}
Запустив программу, я вижу, что для рендеринга кадра требуется около 16 мс. Это ровно 60 FPS (1000/60), что не оставляет места для игровой логики. Кроме того, я запускаю его на довольно быстром компьютере.
Я почти уверен, что использую неправильную стратегию, но я не уверен, какая из них правильная. Возможно, было бы лучше создать большую текстуру и реже обновлять ее, но я не смог найти никакой документации о том, как копировать одну текстуру поверх другой.
Итак, как я могу улучшить производительность карты тайлов?
SDL_RenderPresent
, чтобы знать, потеряете ли вы время там или раньше. - person dzada   schedule 03.09.2013SDL_GetRendererInfo
поможет вам. - person user694733   schedule 03.09.2013