我应该如何处理丢失的资源?


13

您的游戏预期会加载某种资产,但找不到。情况应如何处理?例如:

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

在开发过程中,它可能已被用户意外删除,损坏或拼写错误。

一些潜在的回应:

  • 断言(理想情况下仅在开发期间)
  • 优雅退出游戏
  • 引发异常并尝试处理它。

哪种方法最好?


一种方法是验证游戏数据是否仍然完整。如果没有自动重新下载丢失的数据。错误>要求用户验证数据>下载。您显然需要为此创建一个小工具。
2013年

@Sidar我最喜欢您说的内容,而不是投票最多的答案,也许您可​​以更好地解释您要说的是什么
concept3d 2013年

错误的丑陋之处在于,有时它只会破坏游戏,而人们无法玩游戏/无法启动游戏。例如,在Steam中,如果您的游戏无法正常运行,则可以验证游戏数据。当某些东西似乎损坏/丢失/更改时,Steam会自动重新下载这些文件。我不知道他们是怎么做到的。但是他们显然会对照一些数据进行检查。也许是哈希码?我真的不知道 但是您应该始终拥有标准的替换资产(只是在其上标有“错误”之类的纹理)
Sidar

@Sidar为什么不很好地格式化答案?
concept3d

因为我不知道它是如何工作的,也不想误导它。所以我不能给你一个正确的答案。
2013年

Answers:


19

许多游戏都有一个很明显的通用“错误材料”和“错误网格”。当然,将其与日志中的警告配对。


完全同意这篇文章。但是,您可能想在发布/分布式构建中执行其他操作。
琼克尔

对于发行版,可以考虑使用散列来下载丢失或无效文件的方法来验证可用文件。但是,在开发过程中,绝对是显示黑色和洋红色棋盘格纹理吸引您注意的最佳方法。对于模型,可以使用巨大的ERROR模型,这应该是显而易见的。
Christian Ivicevic

这对于纹理是有意义的。对于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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.