如何将任何 *.jpg图像嵌入Win32可执行文件中并在运行时使用它

How to embed any *.jpg image inside win32 executable and use it at run time

本文关键字:可执行文件 运行时 Win32 任何 jpg 图像      更新时间:2023-10-16

我正在做一个纯opengl和名为Space Voyager的项目。问题是,在运行期间,PROGRAME调用功能以加载所有图像,所有播放器必须在加载屏幕上等待2分钟大约2分钟!!!!其中一些图像像16 MB文件,否则平均为1 MB。总共有20张图像。我需要在凝视水平之前加载所有图像。

现在,我正在使用土壤在游戏中加载图像。土壤具有从内存中加载图像的功能。

我的解决方案是将所有图像嵌入游戏的 *.exe文件中,并在运行时使用它,以节省将所有图像加载到游戏中的时间。

我几乎迷失了如何将JPG图像嵌入可执行文件和
在运行时使用它作为未签名的char* imagePointer ?????

我的解决方案是将所有图像嵌入游戏的 *.exe文件中并在运行时使用它,以节省将所有图像加载到游戏中的时间。

您认为这会解决问题?存储设备上的数据标签什么都没关系。计算机系统的努力是不变的。是否将资源放在单独的文件中到计算机上都没有关系。

某些图像类似于16 MB文件,否则平均为1 MB。总共有20张图像。我需要在凝视水平之前加载所有图像。

这不是很多数据。20张图像平均为20mib,平均为20mib。即使是缓慢的HDD旋转生锈磁盘也可以轻松传递10MIB/s。如今,一个更普遍的数字是廉价的HDD大约50mib至80mib/s。无论您的瓶颈都在哪里,不是我/o。

还请记住,如果将原始文件嵌入可执行文件中,则强迫系统通过I/O将更多数据插入更多数据;在可执行文件中压缩图像仍然需要您解压缩。鉴于大多数情况下,您是i/o绑定的,而不是在存储中具有压缩图像的CPU绑定。

更新

您的问题是:

soil_flag_power_of_two

您要土壤重新列出每个图像,以下一个更大的大小。纹理。自从OpenGL-2出来以来(当今您很难找到不支持OpenGL-2的GPU),该约束已被提升。

另一个耗时的操作是产生mipmaps(soil_flag_mipmaps),因为这需要为每个图像生成整个图像金字塔。现在,您通常想要拥有的MIPMapping。如果您有上下文> = OpenGL-3,则可以使用MIPMAP生成器内置的OpenGL。另外,您还要求土壤为您生成纹理ID,但您也自己生成ID。使用任何一个,但不要同时使用。

这会导致您的代码中的以下建议更改:

while( GL_NO_ERROR != glGetError() ); // flush OpenGL errors;
GLint gl_version;
glGetIntegerv(GL_MAJOR_VERSION, &gl_version);
if( GL_NO_ERROR != glGetError() ) {
    // GL_MAJOR_VERSION enum supported only since OpenGL-3
    gl_version = 1;
    while( GL_NO_ERROR != glGetError() ); // flush OpenGL errors;
}
bool const gl3_or_later = 3 <= gl_version;
tex_id = SOIL_load_OGL_texture(
        fileNameConstant,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        gl3_or_later ? 0 : SOIL_FLAG_MIPMAPS );
if( gl3_or_later ) {
    glBindTexture(GL_TEXTURE_2D, tex_id);
    glGenerateTextureMipmap(GL_TEXTURE_2D);
    glTexParameteri(
        GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER,
        GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(
        GL_TEXTURE_2D,
        GL_TEXTURE_MAX_LEVEL,
        1000);
}
相关文章: