- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在预加载 SKTextureAtlas
时遇到了性能问题:
let textureAtlas = SKTextureAtlas(named: atlasName)
textureAtlas.preload(completionHandler: {
...
})
我所说的性能下降是指 FPS 在短时间内下降到大约 50。
我在 Instruments
中使用 Time Profiler
对其进行了测试,并验证了这项工作确实是在工作线程上完成的,如 documentation 中所述.
下图显示了 Time Profiler
捕获的尖峰,这是由预加载图集引起的。如您所见,大部分峰值是由 2 个工作线程引起的,据我所知,它们似乎都在加载图像数据。但是,恕我直言,这不会对主线程造成性能影响。
注意 1:我预加载的 .spriteatlas
不是那么大:4 个 Assets ,大约。 1000x1000
大小。
注意 2:我正在使用 iPhone 6、iOS 10、Xcode 8 进行测试。
注3:没有其他同时进行的实质性工作; CPU 一直徘徊在 30% 左右。 GPU 也是如此。
注意 4:在需要来自该图集的任何纹理之前请求图集预加载,因此它应该有足够的时间来预加载。
非常感谢任何帮助/指导!
更新
完成预加载的代码块:
let updateGroup = DispatchGroup()
for assetDefinition in assetContainmentDefinitions {
let assetName = assetDefinition.assetName
// Check if asset is not needed anymore and clear the cache with it
if progress >= assetDefinition.range.to {
if cachedAssets[assetName] != nil {
cachedAssets[assetName] = nil
}
}
// Check if asset is needed and if it's not already loading then preload and cache it
else if progress >= assetDefinition.range.from {
if currentlyLoadingAssets.contains(assetName) == false &&
cachedAssets[assetName] == nil {
currentlyLoadingAssets.append(assetName)
// Enter dispatch group
updateGroup.enter()
switch assetDefinition.assetType {
case .textureAtlas:
let textureAtlas = SKTextureAtlas(named: assetName)
textureAtlas.preload(completionHandler: {
DispatchQueue.main.async { [weak self] in
self?.cachedAssets[assetName] = textureAtlas
self?.currentlyLoadingAssets.remove(object: assetName)
// Leave dispatch group after preload is done
updateGroup.leave()
}
})
case .texture:
let texture = SKTexture(imageNamed: assetName)
texture.preload(completionHandler: {
DispatchQueue.main.async { [weak self] in
self?.cachedAssets[assetName] = texture
self?.currentlyLoadingAssets.remove(object: assetName)
// Leave dispatch group after preload is done
updateGroup.leave()
}
})
}
}
}
}
// Call completion after the dispatch group is fully completed
if let completion = completion {
updateGroup.notify(queue: DispatchQueue.main, execute: completion)
}
更新 2
我创建了一个空项目,其中只有 atlas preload block 。性能下降仍然发生。我尝试过使用多个 map 集,即使是只有一个 Assets 的 map 集。
我也在这个空的新项目中尝试了@Sez 的建议(见下文),但在那种情况下甚至没有调用完成 block ,这似乎是 SKTextureAtlas
中的另一个错误> 类。 (?!)
let atlas = SKTextureAtlas(dictionary: ["texture1": UIImage(named: "texture1")!])
atlas.preload(completionHandler: { [weak self] in
print("COMPLETION BLOCK NOT CALLED")
self?.cachedAtlas = atlas
})
更新 3
我尝试删除 .spriteatlas
并创建具有相同纹理的 .atlas
并且(几乎)没有性能影响。但是,.atlas
不支持切片,这就是我首先要使用 .spriteatlas
的原因。
最佳答案
有issues plaguing SKTextureAtlas (Apple Dev 论坛帖子)。
尝试使用 SKTextureAtlas:withDictionary:
提供 [String:UIImage]
字典创建纹理图集,method described on another StackOverflow post看看是否有帮助。
更新:如果你想要那个preload of the SKTexture发生在后台线程中,我会专门编写它而不是依赖于 preload
便利函数。
let atlas: SKTextureAtlas
let myImages: [String: UIImage] = getImages()
let globalQueue = DispatchQueue.global()
globalQueue.async {
let atlas = SKTextureAtlas(withDictionary:myImages)
for (k,v) in myImages {
let tex = atlas.textureNamed(k)
print(tex.size()) // force load
}
DispatchQueue.main.async {
completionHandler(atlas)
}
}
关于 app slicing ,只要您将 Assets 放在 Assets 目录中,它们就应该被切片。将构建上传到 iTunesConnect 后,您可以看到反射(reflect)这一情况的 App Store 大小报告。
我有一段录制的直播视频,其中展示了这个导入过程。抱歉,它有点长(超过 2 小时),但这里的链接直接指向导入 Sprite 表的那一刻。
https://youtu.be/Ic9Wnux8vd8?t=1h17m
按照我在这里展示的方式进行操作,您会得到一个带有切片图像的 Sprite 图集。我的脚本(我在剪辑的前面演示过)是 on my GitHub如果你想要的话。
关于ios - SpriteKit : performance hit while preloading SKTextureAtlas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40834615/
是否有令人信服的理由在 mturk 上为 HIT 建立外部网站?也就是说,如果任务是通过页面上的 javascript 运行的,为什么不简单地将其粘贴到 mturk 上的源代码中并在那里运行,通过其
在 Amazon Mechanical Turk 上,我在 HIT 中添加了一个指向外部网页的链接,工作人员将在其中执行实际的 HIT。但是,我想对工作人员隐藏该链接,直到他们接受 HIT。 可以通过
我面临的问题是 SCNView.hitTest 不检测对我在 cpu 上动态修改的几何体的命中。 这是概述:我有一个使用 SCNGeometry 的节点从 MTLBuffer 创建顶点数: func
我有一个观察者配置如下: { "trigger": { "schedule": { "interval": "5s" } }, "input" : {
我又遇到了一个正则表达式问题 - 我需要测试一个字符串是否出现模式 - 它可以隐藏在字符串中的某个位置 - 就在前面,前面但前面有一个空格,中间的某个地方或在结束,也许在末尾后面跟着一个空格。 我认为
我又遇到了一个正则表达式问题 - 我需要测试一个字符串是否出现模式 - 它可以隐藏在字符串中的某个位置 - 就在前面,前面但前面有一个空格,中间的某个地方或在结束,也许在末尾后面跟着一个空格。 我认为
我们正在开发我们网站的全新移动版本,它是一个使用 Sencha Touch 2(Ext JS、JavaScript)编写的 HTML5 网站。 我们在主网站上使用 Google Analytics,我
我想写一个这样的sql: "Update tablename SET hits = hits + 1 WHERE id = $id" 在zf2中,我们使用了TableGateway,我写的代码: $t
我使用 golang elastic 5 API 在 ElasticSearch 中运行查询。我使用 searchResult.TotalHits() 检查命中数,它给了我一个很大的数字(超过 100
我正在 Amazon Mturk 开展一个项目。我使用 Python Boto API。 boto.connection.create_HIT() 方法返回一个 ResultSet 对象,我试图从中获
最近我在使用 rails 项目,并使用 simplecov 生成了代码覆盖率报告。 ,我在下面得到了一份不错的报告。我知道这是一个简单的问题(我搜索了很多次但没有得到任何正确的解释) can anyo
相当复杂...我有两个表,t1 包含有关特定对象的描述信息,第二个表 t2 包含用于解码 t1 中对象的信息。 我将尝试提供一个简单的示例: ---- t1 (Name, Type, Size, Co
我们通过 Amazon Mechanical Turk 提供供两名玩家使用的基于网络的游戏。对于每场比赛,我们需要两名玩家同时进入,或最多相隔 1 分钟。我们注意到,在我们发布 HIT 后的前几分
我对 Elasticsearch 相当陌生,我一直在尝试对我的数据进行搜索,并且总是让点击部分为空。即使在数据上传和索引之后也会发生这种情况。我的映射如下: { "mappings":{
我目前正在关注 David Roonqvist 的 3D Graphics with SceneKit 一书。 第 5 章涉及 HitTest ,实现它没有问题,但只涉及他对鼠标事件的测试。 现在,我
对于外部问题,当工作人员在预览模式下查看 HIT 时,发送的 URL 类似于: /mturk?assignmentId=ASSIGNMENT_ID_NOT_AVAILABLE&hitId=3FSEU3
我正在 Agda 中试验同伦类型理论。我使用 HIT 来定义整数: {-# OPTIONS --cubical --safe #-} open import Cubical.Foundations.P
我正在实现一个网站,招募的 MTurk worker 将在该网站上执行任务。我计划使用 MTurk 任务招聘 worker ,我会将他们重定向到外部网站以进行实际工作。我有以下与此计划有关的问题。 这
当我使用以下搜索(/posts/_search)时,我的hits.total为1400: {"query": {"query_string": {"query": "Bitcoin"}}} 当我使用以
我有这样的有效负载,所有文档中都会出现相同的有效负载,但每个文档中每个标签的权重都不同。 { "tags": [ { "tag": "tag1", "weight"
我是一名优秀的程序员,十分优秀!