我现在正在使用NES模拟器,我无法弄清楚如何渲染像素。我使用3维数组来保存每个像素的RGB值。对于256 x 224屏幕大小,数组定义如下所示:
byte screenData[224][256][3];
例如,[0][0][0]
保持蓝色值,[0][0][1]
保持绿色值,[0][0][2]
保持屏幕位置[0][0]
处像素的红色值。
当vblank标志变高时,我需要渲染屏幕。当SDL去渲染屏幕时,screenData数组将充满每个像素的RGB值。我能够找到一个名为SDL_CreateRGBSurfaceFrom
的函数,看起来它可能适用于我想要做的事情。但是,我见过的所有例子都使用1维数组作为RGB值而不是3维数组。
渲染像素的最佳方式是什么?如果函数允许我以某种方式调整表面大小,那么我也不会使用256 x 224窗口大小。
答案 0 :(得分:3)
您需要将数据存储为一维char
数组:
int channels = 3; // for a RGB image
char* pixels = new char[img_width * img_height * channels];
// populate pixels with real data ...
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)pixels,
img_width,
img_height,
channels * 8, // bits per pixel = 24
img_width * channels, // pitch
0x0000FF, // red mask
0x00FF00, // green mask
0xFF0000, // blue mask
0); // alpha mask (none)
答案 1 :(得分:0)
在2.0中,使用SDL_Texture
+ SDL_TEXTUREACCESS_STREAMING
+ SDL_RenderCopy
,它比SDL_RenderPoint
更快。
请参阅:
相关:Why do I get bad performance with SDL2 and SDL_RenderCopy inside a double for loop over all pixels?