我是C ++和SDL的初学者,我在一些教程之后慢慢写一个小游戏来学习一些概念。
我遇到了问题:我的渲染似乎真的慢。 我使用PerformanceCounters来计算我的循环,无论是否有渲染功能。没有它,我每帧得到0~2毫秒;当我添加渲染时,每帧最多可达65毫秒。
有人能告诉我渲染功能有什么问题吗?
SDL_Texture *texture;
...
// gets called by the main loop
void render(int x_offset, int y_offset)
{
if (texture)
{
SDL_DestroyTexture(texture);
}
texture = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
texture_w,
texture_h);
if (SDL_LockTexture(texture, NULL, &pixel_memory, &pitch) < 0) {
printf("Oops! %s\n", SDL_GetError());
}
Uint32 *pixel;
Uint8 *row = (Uint8 *) pixel_memory;
for (int j = 0; j < texture_h; ++j) {
pixel = (Uint32 *)((Uint8 *) pixel_memory + j * pitch);
for (int i = 0; i < texture_w; ++i) {
Uint8 alpha = 255;
Uint8 red = 172;
Uint8 green = 0;
Uint8 blue = 255;
*pixel++ = ((alpha << 24) | (red << 16) | (green << 8) | (blue));
}
}
SDL_UnlockTexture(texture);
}
答案 0 :(得分:5)
它可能很慢,因为你在每一帧都在破坏和创建纹理,锁定纹理/上传像素数据并不是非常快,但我怀疑它是这里的瓶颈。我强烈建议在进入主循环之前分配纹理一次,并在渲染过程中重新使用它,然后在程序退出之前将其销毁。
答案 1 :(得分:5)
SDL2基于硬件渲染。由于您使用GPU打乒乓球,因此即使使用流式传输标记也不会很快进行纹理处理。
除了在每个帧中创建和销毁纹理外,您应该考虑在重绘之前简单地清理它。
另一种选择是使用表面。你用表面做你的东西,然后把它作为纹理绘制。我不确定增益是否会很大但我认为它仍然比每帧的破坏,创建,锁定和解锁纹理更好。
查看您的代码,我知道它只是一个测试,尽管您可以尝试使用SDL基元渲染到纹理。
最后,在测试期间请记住,您的驱动程序可能会强制执行垂直同步,这可能会导致虚假的糟糕性能。
答案 2 :(得分:2)
可能没什么。锁定纹理以进行直接像素访问很慢。有可能,你可以在渲染功能中做很多额外的事情,而不会看到任何进一步的速度下降。
如果想要更快的渲染,则需要更高级别的功能。