gpt4 book ai didi

c++ - 如何在 win32 可执行文件中嵌入任何 *.jpg 图像并在运行时使用它

转载 作者:行者123 更新时间:2023-11-28 06:16:52 26 4
gpt4 key购买 nike

我正在用纯 OpenGL 和 FREEGLUT 做一个名为 Space Voyager 的项目.问题是在运行时,当程序调用一个函数来加载所有图像时,播放器必须在加载屏幕上等待大约 2 分钟!!!!有些图像像 16 MB 的文件,否则平均为 1 MB。总共有20张图片。我需要在启动关卡之前加载所有图像。

现在我正在使用 SOIL用于在我的游戏中加载图像。 SOIL 有一个从内存加载图像的函数 SOIL_load_OGL_texture_load_from_memory( unsigned char *image_in_RAM ,...).

我的解决办法是把所有的图片都嵌入到游戏的*.exe文件中,在运行时使用,这样可以节省在游戏中加载所有图片的时间。

我对如何将 jpg 图像准确地嵌入可执行文件和
在运行时将其用作 unsigned char* imagePointer ??????

最佳答案

My solution is to embed all the images in *.exe file of the game and use it at run time so as to save the time to load all the images in game.

您认为这会如何解决问题?存储设备上的数据带有什么标签并不重要。计算机系统的努力是不变的。将资源放在计算机的单独文件中都没关系,这没有任何区别。

Some of the images are like 16 MB files otherwise 1 MB in average. There are like 20 images in all. I need to load all the images before staring the level.

这不是很多数据。 20 张图片,平均 1MiB,也就是平均 20MiB。即使是旋转生锈的慢速 HDD 磁盘也可以轻松提供 10MiB/s 的速度。如今,对于便宜的 HDD,更常见的数字是 50MiB 到 80MiB/s。无论瓶颈在哪里,都不是 I/O。

另外请记住,如果您将文件 RAW 嵌入到可执行文件中,您将迫使系统通过 I/O 推送更多数据;将图像压缩到可执行文件中仍然需要您解压缩。考虑到大多数时候您受 I/O 限制而不是 CPU 限制,在存储中存储压缩图像是可取的。

更新

你的问题是这样的:

SOIL_FLAG_POWER_OF_TWO

您要求土壤将每个图像重新缩放到下一个更大的尺寸,即 2 的幂。在 OpenGL-2 之前,必须这样做,因为 OpenGL-1 只接受 2 的幂大小的图像纹理。自从 OpenGL-2 问世以来(现在您很难找到不支持 OpenGL-2 的 GPU),这个限制就被解除了。

另一个耗时的操作是生成 mipmaps (SOIL_FLAG_MIPMAPS),因为这需要为每个图像生成一个完整的图像金字塔。现在 mipmapping 是您通常想要拥有的东西。如果您有 >=OpenGL-3 的上下文,您可以使用 OpenGL 内置的 mipmap 生成器。您还要求 SOIL 为您生成纹理 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);
}

关于c++ - 如何在 win32 可执行文件中嵌入任何 *.jpg 图像并在运行时使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30101530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com