我有一个显示在屏幕上的像素数组。 为此,我使用了一个 SDL_Texture 对象,该对象使用 SDL_UpdateTexture 进行更新,如下所示:
SDL_UpdateTexture(frame_buffer_texture, nullptr, &frame_buffer_pixels, screen_res_x);
在文档中它说第三个参数是指向像素数组的指针,但是它没有指定是否复制像素。
像这样在 SDL_UpdateTexutre 之后使用具有超出范围的像素的局部变量是否可以:
void function()
{
uint32_t pixels[screen_res_x * screen_res_y] = { /* pixel data here */ }
SDL_UpdateTexture(texture, nullptr, &pixels, screen_res_x);
}
或者我必须像这样为堆栈上的像素分配内存:
void function()
{
delete pixels; // Delete old pixels
pixels = new uint32_t[screen_res_x * screen_res_y];
// Set pixels values here..
SDL_UpdateTexture(texture, nullptr, pixels, screen_res_x);
}
不确定这是否重要,但这是我将纹理渲染到屏幕的方式:
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
SDL_RenderPresent(renderer);
这是它的创建方式:
SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, screen_res_x * screen_res_y)
SDL_UpdateTexture
的作用完全取决于渲染器,但作为参考,OpenGL 渲染器 调用 glTexSubImage2D 并且 软件渲染器 执行 memcpy。
我是否必须像这样为堆栈上的像素分配内存
new
在heap 上分配。像uint32_t pixels[screen_res_x * screen_res_y]
这样的数组被分配在栈上。但要回答你的实际问题:不,你不需要在调用SDL_UpdateTexture
后保持像素数据存活,所以你不需要进行动态分配(在堆上)。
但是,我要补充一点,如果您计划分配
uint32_t
屏幕大小的数组,无论如何您可能都希望进行动态分配。假设 uint32_t
是 4 个字节并且您的屏幕尺寸是 1920x1080,那就是 1920*1080*4 = 8294400
字节要分配。典型的堆栈大小可以从几 KB 到几 MB 不等,因此您可以轻松地尝试分配超出堆栈允许的空间。