Tôi đang sử dụng SDL2 để viết một trò chơi hiển thị sơ đồ trang ở mọi khung hình, nhưng hiệu suất quá chậm. Tôi đã viết một chương trình nhỏ để cô lập vấn đề. Hãy xem xét rằng "temp.bmp" là một hình ảnh 16x16.Sơ đồ trang web SDL2 - quá chậm
#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);
}
}
Chạy chương trình, tôi thấy mất khoảng 16ms để hiển thị khung. Đây là chính xác 60 FPS (1000/60), mà không có chỗ cho logic trò chơi. Ngoài ra, tôi đang chạy nó trong một máy tính khá nhanh.
Tôi khá chắc chắn rằng tôi đang sử dụng chiến lược sai, nhưng tôi không chắc điều gì là đúng. Có lẽ tạo ra một kết cấu lớn và cập nhật nó ít thường xuyên hơn sẽ là con đường để đi, nhưng tôi không thể tìm thấy bất kỳ tài liệu hướng dẫn về cách sao chép một kết cấu khác.
Vì vậy, làm cách nào để cải thiện hiệu suất sơ đồ trang web?
bạn có thể thêm một mesure hiệu suất trước khi 'SDL_RenderPresent'to biết nếu bạn mất thời gian của bạn có trước đây. – dzada
Tôi không biết SDL2, nhưng có thể hiển thị đang bị giới hạn bởi vsync? Bạn đã thử chạy ở chế độ toàn màn hình chưa? – user694733
@dzada Phần lớn thời gian được dành cho SDL_RenderPresent. Khoảng 2 ms trước và sau 14 giây. –