【发布时间】:2013-09-06 15:46:14
【问题描述】:
我正在使用 SDL2 编写一个在每一帧都显示 tilemap 的游戏,但是性能太慢了。我写了一个小程序来隔离问题。考虑“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),没有给游戏逻辑留下空间。另外,我正在一台速度非常快的计算机上运行它。
我很确定我使用了错误的策略,但我不确定什么是正确的。也许创建一个大纹理并减少更新频率是可行的方法,但我找不到任何关于如何将一个纹理复制到另一个纹理的文档。
那么,我该如何提高 tilemap 的性能呢?
【问题讨论】:
-
您能否在
SDL_RenderPresent之前添加一个性能指标,以了解您之前是否在此浪费了时间。 -
我不知道 SDL2,但渲染可能受到 vsync 的限制?你试过在全屏模式下运行吗?
-
据我所知,这些标志可以被视频驱动程序覆盖。也许
SDL_GetRendererInfo对你有帮助。 -
你知道你是用显卡还是只用你的CPU(后面是用opengl吗?)
-
测试 VSYNC 是否被代码、GFX 卡/驱动程序或其他东西锁定的最佳方法是仅绘制单个图块。为此,您应该获得超过 100+ fps 的速度。如果它保持在 60,那么您可以确定 VSYNC 已开启。