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


13

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

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

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

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

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

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


Один из способов сделать это - проверить, не повреждены ли данные игры. Если нет, автоматически загрузите недостающие данные. ошибка> попросить пользователя подтвердить данные> загрузить. Вам, очевидно, нужно создать небольшой инструмент для этого.
— Сидар

@ Сидар Мне нравится то, что вы сказали, больше, чем ответ с наибольшим количеством голосов, может быть, вы сможете лучше объяснить, что вы пытаетесь сказать
— 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.