我有一个在窗口上绘制像素网格的函数,我使用的是sdl。
问题是,这是非常慢的!它使我的程序以10fps的速度运行,所以我使用sdl。它使我的程序以10fps的速度运行,所以我想我一定是做错了什么。
这是我使用的代码
void rayTracing(SDL &sdl) {
int nx = 1440;
int ny = 810;
for (int x = 0; x < nx; x++) {
for (int y = 0; y < ny; y++) {
float r = float(x) / float(nx);
float g = float(y) / float(ny);
float b = 0.2;
int ir = int(255.99 * r);
int ig = int(255.99 * g);
int ib = int(255.99 * b);
SDL_SetRenderDrawColor(sdl.renderer.get(), ir, ig, ib, 255);
SDL_RenderDrawPoint(sdl.renderer.get(), x, ny - y);
}
}
SDL_SetRenderDrawColor(sdl.renderer.get(), 0, 0, 0, 0);
}
也许是我使用SDL_RenderDrawPoint的方式有问题?
你最好的办法可能是创建一个单独的渲染纹理,你可以直接通过指针访问。您可以进行更改,当您完成后,您可以调用SDL纹理更新一次,它会将您的内存纹理转移到显示器上。
这是您创建SDL纹理的方法
theTexture = SDL_CreateTexture( theRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, nx, ny );
然后,您还将创建一个内存缓冲区,以绘制到
uint32_t *textureBuffer = new uint32_t[ nx * ny ];
绘制到它之后,你可以像这样一下子更新整个纹理。
SDL_UpdateTexture( theTexture , NULL, textureBuffer, nx * sizeof (uint32_t));
这时,画一个像素其实就是把各自的RGB8888颜色值写到textureBuffer数组中,有点像下面这样
textureBuffer[(yPos*nx) + xPos) = 0xFF000000 | (ir<<16) | (ib<<8) | ig;