Как мне справиться с отсутствующими ресурсами?

13

Ваша игра ожидает загрузки определенного ресурса, но он не найден. Как справиться с ситуацией? Например:

Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found
Mesh* car             = LoadMesh("Car.obj");      // returns NULL; 3D mesh not found

Он мог быть случайно удален пользователем, поврежден или написан с ошибкой во время разработки.

Некоторые потенциальные ответы:

  • Утверждения (в идеале только во время разработки)
  • Выйти из игры изящно
  • Брось исключение и попробуй его обработать.

Какой способ лучше?

concept3d
источник
Один из способов сделать это - проверить, не повреждены ли данные игры. Если нет, автоматически загрузите недостающие данные. ошибка> попросить пользователя подтвердить данные> загрузить. Вам, очевидно, нужно создать небольшой инструмент для этого.
Сидар
@ Сидар Мне нравится то, что вы сказали, больше, чем ответ с наибольшим количеством голосов, может быть, вы сможете лучше объяснить, что вы пытаетесь сказать
concept3d
Гадость ошибок в том, что иногда она просто ломает игру, и люди не могут в нее поиграть / запустить ее. Например, в Steam, если ваша игра не работает должным образом, вы можете проверить данные игры. Когда что-то кажется поврежденным / отсутствующим / измененным, Steam автоматически повторно загрузит эти файлы. Я не знаю точно, как они это делают. Но они, очевидно, сверяют это с некоторыми данными. Возможно хэш-коды? Я действительно не знаю. Но у вас всегда должен быть стандартный ресурс для замены (просто текстура с надписью «ошибка» или что-то в этом роде)
Сидар
@ Сидар, почему бы не отформатировать его в ответе?
concept3d
Потому что я не знаю точно, как это работает, и не хочу быть дезинформирующим об этом. Поэтому я не могу дать вам правильный ответ.
Сидар

Ответы:

19

Многие игры имеют общий «материал ошибок» и «сетку ошибок», которые действительно очевидны. Сопоставьте это с предупреждением в журналах, конечно.

Роберт Фрейзер
источник
Полностью согласен с этим постом. Однако вы можете захотеть делать разные вещи в выпуске / распределенной сборке.
Jonkel
Для сборок релизов можно было бы подумать о проверке доступных файлов с использованием хеширования для загрузки отсутствующих или недействительных файлов. Тем не менее, во время разработки лучше всего отображать черно-пурпурную текстуру шахматной доски, чтобы привлечь ваше внимание. Для моделей можно использовать огромную модель ОШИБКИ, которая должна быть очевидной.
Кристиан Ивичевич
Это имеет смысл для текстур. не так много для 3D-моделей. Что если большинство 3D-моделей отсутствуют? Игра будет выглядеть забавно, хотя в первую очередь она должна быть играбельной. Что если вы вычислите свою структуру пространственных данных на основе геометрических свойств 3D-моделей, что должно произойти. Я с этим только в простых обстоятельствах как пропущенная текстура. Но я думаю, что проверка полноты данных - лучший подход для коммерческих игр.
concept3d
1
@ concept3d - я знаю, по крайней мере, у движка Source есть большая, очевидная сетка ошибок (я иногда видел ее в тестовом клиенте Dota 2, когда они добавляли героев). Я согласен, что если отсутствуют большие данные уровня, вероятно, лучше просто ошибиться, особенно в сборке релиза, но для целей отладки иметь большой знак вопроса, танцующий вокруг, не так уж плохо.
Роберт Фрейзер
6

Если у вас разные ресурсы разрешения одной и той же текстуры , вы можете попытаться спасти ситуацию, используя другое разрешение.

Texture* grassTexture;
try {
    grassTexture = LoadTexture("Grass.png");
} catch (WhateverExcaption e) {
    grassTexture = LoadTexture("Grass_512.png");
}

Если даже это не удастся, может быть, пора залог.

Даниил
источник
2
Вы можете добавить переключатель к улову, чтобы в Dev вы всегда отображали отсутствующий меш / текст, но при публикации он сначала попытался бы восстановить и, возможно, имел бы менее очевидную отсутствующую текстуру.
DampeS8N