SDL_UpdateTexture 是否复制了原始像素?

问题描述 投票:0回答:1

我有一个显示在屏幕上的像素数组。 为此,我使用了一个 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)
                                             
c++ sdl sdl-2
1个回答
0
投票

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 不等,因此您可以轻松地尝试分配超出堆栈允许的空间。

© www.soinside.com 2019 - 2024. All rights reserved.