gpt4 book ai didi

c# - Unity iOS 应用程序图像缓存问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:04:04 25 4
gpt4 key购买 nike

我已经接管了一个应用程序的开发,该应用程序是完整的,没有一个需要互联网连接才能加载图像的错误,因为尽管尝试这样做,但它不会从缓存中访问它们。

任何人都可以帮我弄清楚下面出了什么问题吗?

public class SpriteCache : Singleton<SpriteCache>
{
Dictionary<string, Sprite> _cache = new Dictionary<string, Sprite>();

public void LoadSprite(string url, Action<Sprite> callback)
{
StartCoroutine(LoadSpriteCoroutine(url, callback));
}

public IEnumerator LoadSpriteCoroutine(string url, Action<Sprite> callback)
{
if (_cache.ContainsKey(url))
{
callback(_cache[url]);
yield break;
}

var www = new WWW(url);

while (!www.isDone)
{
yield return www;
}

if (!string.IsNullOrEmpty(www.error))
{
Debug.LogErrorFormat("Tried to obtain texture at '{0}' but received error '{1}'", url, www.error);
yield break;
}

var texture = www.texture;
if (texture == null)
{
Debug.LogErrorFormat("No texture found at '{0}'!", url);
yield break;
}

var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(texture.width / 2, texture.height / 2));
_cache[url] = sprite;
callback(sprite);
}

编辑:

进一步解释以澄清

var www = new WWW(url)

这会抓取存储在服务器上的图像,据我所知,在一次抓取图像后,这应该将项目放入缓存中以备后用。

我已经尝试使用以下更新的方法来查看是否可以解决问题。

var www = WWW.LoadFromCacheOrDownload(url, 1)

这导致它无法以任何方式工作,并且从不更改占位符中的图像。

“LoadSpriteCoroutine”中的第一个 if 语句应该通过检查是否存在 url 的键来捕获 Sprite 是否已存在于“_cache”字典中,该键应该在第一个运行实例之后和 internet连接

从 _cache 加载图像,如果它在那里:

if (_cache.ContainsKey(url))
{
callback(_cache[url]);
yield break;
}

如果图像以前不在缓存中,则将图像添加到缓存中:

var sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(texture.width / 2, texture.height / 2));
_cache[url] = sprite;

最佳答案

所以我想出了一个解决办法,

所有其他将图像保存到缓存的方法对于 iOS 似乎都失败了,我删除了所有以前的“_cache”内容。

这个保存功能对我有用:

//if file doesn't exist then save it for fututre reference
if (!File.Exists(_FileLocation + texName))
{
byte[] bytes;

if (Path.GetExtension(texName) == ".png")
{
bytes = texture.EncodeToPNG();
}
else
{
bytes = texture.EncodeToJPG();
}
File.WriteAllBytes(Application.persistentDataPath + texName, bytes);
}

该部分位于“回调( Sprite )”之后。

保存项目的检查位于旧的“if(_cache.ContainsKey(url))”部分

 texName = Path.GetFileName(texName);

if (File.Exists( _FileLocation + texName))
{
url = _FileLocation + "/"+ texName;
}

请注意,“LoadSpriteCoroutine”现在在其调用中采用额外的字符串参数“texName”,这只是 url 的缩短实例,然后将其剪切为文件名和扩展名。如果它找到匹配项,则它会将 url 替换为持久文件路径 + 文件名以在本地获取它,而不是像往常一样通过网络获取。

_FileLocation定义如下

string _FileLocation;

public void Start()
{
_FileLocation = Application.persistentDataPath;
}

在该方法中引用它的原因是为了节省通过应用程序调用地址的性能,并且如果您正在使用跨平台解决方案,则可能需要更改用于保存的数据路径,因此您可以检测是否或 case 语句更改 _FileLocation 以满足您的需要。

关于c# - Unity iOS 应用程序图像缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49115571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com