0

I am doing a project in pure OpenGL and FREEGLUT named Space Voyager. Problem is that during run time when programe calls a function to load all the images player has to wait around 2 minutes on loading screen!!!! 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.

Now I am using SOIL for loading the images in my game. SOIL has a function to load images from memory SOIL_load_OGL_texture_load_from_memory( unsigned char *image_in_RAM ,...).

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.

I am pretty much lost as how to exactly embed the jpg images in executable and
use it at run time as unsigned char* imagePointer ?????

4

1 回答 1

1

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

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

有些图像像 16 MB 的文件,否则平均为 1 MB。总共有大约20张图像。我需要在启动关卡之前加载所有图像。

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

还要记住,如果您将文件 RAW 嵌入到可执行文件中,您将强制系统通过 I/O 推送更多数据;在可执行文件中压缩图像仍然需要您解压缩。鉴于大多数情况下,您需要在存储中存储压缩图像,而不是 CPU 限制。

更新

你的问题是这样的:

SOIL_FLAG_POWER_OF_TWO

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

另一个耗时的操作是生成 mipmap (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);
}
于 2015-05-07T14:00:18.350 回答