Мое решение состоит в том, чтобы встроить все изображения в *.exe файл игры и использовать его во время выполнения, чтобы сэкономить время на загрузку всех изображений в игре.
Как вы полагаете, это поможет? Неважно, какая метка имеет данные на устройстве хранения. Усилия для компьютерной системы неизменны. Не имеет значения, размещаете ли вы ресурсы в отдельном файле, для компьютера это не имеет никакого значения.
Некоторые изображения имеют размер 16 МБ, в то время как в среднем 1 МБ. Всего около 20 изображений. Мне нужно загрузить все изображения, прежде чем смотреть уровень.
Это не так много данных. 20 изображений со средним размером 1 МБ, это в среднем 20 МБ. Даже медленные жесткие диски с вращающейся ржавчиной могут легко обеспечить скорость 10 МБ/с. Гораздо более распространенная цифра составляет от 50 МБ до 80 МБ / с для дешевых жестких дисков в наши дни. Где бы ни было ваше узкое место, это не ввод-вывод.
Также имейте в виду, что если вы встроили файлы RAW в исполняемый файл, вы вынуждаете систему передавать больше данных через ввод-вывод; сжатие изображений в исполняемом файле по-прежнему требует распаковки. Учитывая тот факт, что большую часть времени вы привязаны к вводу-выводу, а не к процессору, сжатые изображения в хранилище желательны.
ОБНОВИТЬ
Ваша проблема заключается в следующем:
SOIL_FLAG_POWER_OF_TWO
Вы просите почву изменить масштаб каждого изображения до следующего большего размера, который является степенью 2. До OpenGL-2 это нужно было сделать, поскольку OpenGL-1 принимал только изображения размера степени 2 для текстур. С тех пор, как вышел OpenGL-2 (а в наши дни вам будет трудно найти GPU, который не поддерживает OpenGL-2), это ограничение было снято.
Еще одна трудоемкая операция — генерация мип-карт (SOIL_FLAG_MIPMAPS), поскольку для этого требовалось генерировать целую пирамиду изображений для каждого изображения. Теперь мипмаппинг — это то, что вы обычно хотите иметь. Если у вас есть контекст ›=OpenGL-3, вы можете использовать встроенный в OpenGL генератор mipmap. Кроме того, вы просите SOIL сгенерировать для вас идентификаторы текстур, но сами создаете идентификаторы. Используйте любой из них, но не используйте оба.
Это приводит к следующим предлагаемым изменениям в вашем коде:
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);
}
person
datenwolf
schedule
07.05.2015