问题标签 [sktextureatlas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 在游戏中为多个级别拆分 SKTextureAtlas 的最佳方法是什么?
目前我有一个 SKTextureAtlas 太大而无法快速加载。它包含我游戏中所有敌人的纹理。我想拆分图集,以便游戏仅加载特定级别所需的纹理。但是,一些敌人出现在多个级别。我应该如何拆分地图集?我不希望为每个级别创建一个图集,因为我必须为重复的敌人复制图像文件,并且当有很多级别时会变得很烦人。有没有更优雅的方法?
c# - 如何在 Xamarin.iOS(C# 中)中预加载纹理图集(SKTextureAtlas)?
谁能给我看一个在 Xamarin.iOS 框架中用 C# 编写的可以预加载纹理图集的小代码示例?
Xamarin 网站有这个页面:
https://developer.xamarin.com/api/type/MonoTouch.SpriteKit.SKTextureAtlas/
在那个网页上,他们列出了许多预加载纹理图集的方法。但是,我只对这两种特定方法感兴趣:
PreloadTextures(SKTextureAtlas[], NSAction)
PreloadTexturesAsync(SKTextureAtlas[])
我想这两种方法都适用于我的游戏。不幸的是,我不知道如何在 Xamarin.iOS 框架中的 C# 中正确调用它们。
虽然网络上有很多用于预加载纹理图集的代码示例,但这些示例是用 Objective-C 编写的,不幸的是,我还不知道如何将 Objective-C 代码转换为 C# 代码。
因此,如果您能告诉我如何使用我上面提到的 2 种方法在预加载纹理图集的 Xamarin.iOS 框架中用 C# 编写一些小代码示例,我将不胜感激。
非常感谢。
ios - 如何减小 Xamarin.iOS 中内置的 iOS 游戏和应用的大小?
苹果开发者指南的链接是:
在该链接上,他们有“提交应用程序以供应用程序审查”部分,其中包含以下消息:
“异常大的构建文件通常是在编译后的二进制文件中存储数据(例如图像)而不是作为应用程序包中的资源的结果。如果您要将图像或大型数据集编译到二进制文件中,最好将此数据拆分为由您的应用程序动态加载的资源。 ”
我的游戏使用的 PNG 图像的总大小约为 130 Mb。当我编译并将游戏加载到我的 iPad 上进行测试时,我可以看到游戏的总大小约为 190 MB,如 iPad 上所示。
我已经将 PNG 图像放在 Xamarin 工作室的文件夹“资源”中,我的代码在编译和构建游戏之前将这些图像构建到纹理图集中。
因此,根据 Apple 在上述消息中的建议“最好将此数据拆分为由您的应用程序动态加载的资源”,我的问题如下:
(1) 我是否可以通过“将图像放入另一个可以由我的游戏动态加载的资源”来进一步减小我的游戏大小?(或者在这种情况下“App Thinning”会有所帮助吗?)
(2) 如果上述问题 (1) 的答案是“是”,请告诉我该怎么做?或者您能否向我发送一个指向 Xamarin 网站的链接,该网站向我们展示了如何做到这一点?
非常感谢。
swift - 如何将在 assets.xassets 中创建的 Sprite Atlas 的纹理格式更改为 RGBA4444
所以这是我的第一个应用程序,我被卡住了,将近一周我找不到解决方案。我为不同的角色创建了很多动画,发现我的游戏的内存使用量约为 200 mb。在我不担心这个之前,我认为在我压缩我的 png 纹理之后,这个大小也会减小。但那并没有发生。所以我开始搜索我能做些什么,发现将纹理格式从默认的 RGBA8888 更改为 RGBA4444 可以将内存使用量减少近一半。
我找到了一个答案Sprite Kit Texture Atlas: Define Image Format (RGBA4444, RGB565, ...),它说您可以从 Build Settings > Output Texture Atlas Format 更改输出格式。但这对我不起作用,因为我的 Atlases 是在 assets.xassets 文件夹中创建的。“构建设置 > 输出纹理图集格式”设置仅在您在项目文件夹而不是 assets.xassets 文件夹中创建图集时存在。
所以我的下一步是在 TexturePacker 中手动更改纹理格式。我这样做了,但问题是当我将这些新纹理添加回 assets.xassets 文件夹时,即使它们的质量很低,但它们仍然具有与 RGBA8888 格式的纹理相同的内存使用情况。
如果 Sprite Atlas 位于 assets.xassets 文件夹中,我已经阅读了很多资源,但没有找到有关如何更改输出纹理图集格式的任何信息。
所以此时我不知道该怎么做,我的问题是 - 如何将我的 Sprite Atlases 在 assets.xassets 文件夹中的纹理格式更改为 RGBA4444?提前致谢。
objective-c - 使用 XCODE 8.0 的 SKTextureAtlas preloadWithCompletionHandler 中的内存泄漏
我希望有人能帮我找到这个问题的答案。几周前我向苹果提交了一份错误报告(28684035),但他们还没有回复我的报告。苹果论坛也没有帮助。我的游戏正在开发中,它有时会在预加载时崩溃,而我所做的只是调用方法 SKTextureAtlas preloadWithCompletionHandler。
请参阅下面的详细信息。如果您对问题有任何疑问,请随时发布。
总结:我创建了一个测试项目,简单的在touchUpAtPoint中添加了如下代码:
SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"GlobalMap"];
}];
我查看了仪器,每当调用此方法时,它都会显示内存泄漏。它最终崩溃。我发现这个漏洞是因为在我正在进行的游戏项目中,我在游戏开始时预加载了我的几个地图集。当我将代码更新到 XCODE 8.0 并将我的 iPhone 更新到 IOS 10.0 时,它开始崩溃
重现步骤:
- 创建一个测试项目
- 在项目中添加地图集
- 添加 preloadWithCompletionHandler 代码。
- 运行应用程序并监控 Instruments 中的内存分配和泄漏
- 触摸屏幕几次(甚至一次 - 你会看到一些泄漏)
版本:iOS 10.0.2 配置:iPhone 6
ios - XCode8 TextureAtlas 编译器没有产生
我在 XCode8 的 Swift 3.0 项目中添加了新的particle.sks 文件。我使用 XCode 编辑器创建了部分文件。我已经有很多粒子(在 XCode7 中完成)。突然之间,我的应用程序无法编译,因为:
我不明白出了什么问题。我已经删除了衍生数据并清理了产品。似乎没有任何效果。这个错误描述对你来说意味着更多吗?你能帮忙解决这个问题吗?
ios - 清除 SKTextureAtlas 时 SpriteKit 性能大幅下降
清除缓存的SKTextureAtlas
.
简而言之,在游戏开始之前,我预加载了SKTextureAtlas
withtextureAtlas.preload(completionHandler:)
并在完成处理程序中将对图集的引用存储在私有属性中,以便将其保存在内存中以供以后使用。
一段时间后,不再需要这个纹理图集,我想摆脱它,以保持干净健康的记忆。
问题
我遇到的问题是,当我清除纹理图集时(通过将持有对图集的引用的属性设置为nil
),性能会在几秒钟内急剧下降。我的意思是从恒定的 60fps 到 40fps。
请注意,此时绝对没有其他对该图集的引用。
有趣:第 1 部分
仅在 iOS 10 上发生。在 iOS 9 上完美运行,即使在更旧的设备上也是如此。
有趣:第 2 部分
仅当图集.spriteatlas
以.xcassets
. 但如果地图集.atlas
是.xcassets
.
我知道我可以继续使用.atlas
而不是.spriteatlas
,但.spriteatlas
支持开箱即用的应用程序细化,但.atlas
事实并非如此。
有趣:第 3 部分
如果图集具有少量小纹理,则清除工作正常。这表明可能存在与图集总大小相关的内部问题。但为什么?
动机
为这个问题找到解决方案/解决方法的动机是批处理绑定/绘制调用。使用相同纹理的子节点都在一个绘制通道中渲染,这当然会大大提高性能。
有了这个问题,我基本上被迫创建多个图集,这反过来会导致多个绘制调用,从而影响整体性能。
任何帮助将不胜感激。
更新
我已经尝试实现@Knight0fDragon 建议的解决方案,它建议缓存SKTexture
sSKTextureAtlas
而不是SKTextureAtlas
自身,但遗憾的是,这在我的情况下不起作用。
我在最初的问题中忘记提到的是,这个问题大多数时候都会发生,但并非总是如此。每次尝试约 5 次,我都能让它正常工作。
解决方案
由于在被错误地标记为重复后我无法重新打开我的问题,我将在这里发布我找到的解决方案。
问题是在后台运行的动画。这个动画是这样设置的
它运行在UIImageView
. 这个图像视图位于最终呈现另一个包含游戏场景的视图控制器的视图控制器中。
这两个视图控制器之间的转换是自定义的,由于我忘记在自定义转换动画器中添加调用,因此没有调用视图控制器生命周期方法(beginAppearanceTransition
, ),这正是我有启动/停止所有逻辑的地方动画。因此动画一直在后台运行。endAppearanceTransition
viewWillAppear:
viewWillDisappear
也就是说,即使动画在后台运行,它也不应该干扰一些完全不相关的事情,比如清除缓存的图集。
注意:有问题的动画的图像视图中的图像没有在有问题的纹理图集中定义。
ios - SpriteKit:预加载 SKTextureAtlas 时性能下降
我在预加载时遇到了性能问题SKTextureAtlas
:
通过性能打击,我的意思是 FPS 在短时间内下降到约 50。
我用Time Profiler
in对其进行了测试,Instruments
并验证了这项工作确实是在工作线程上完成的,如文档中所述。
下图显示了Time Profiler
由预加载图集引起的尖峰捕获。如您所见,据我所知,大部分峰值是由 2 个工作线程引起的,它们似乎都在加载图像数据。但是,这不应该对主线程恕我直言造成性能影响。
注 1:.spriteatlas
我预加载的不是那么大:4 个资产,大约。1000x1000
尺寸。
注 2:我正在使用 iPhone 6、iOS 10、Xcode 8 进行测试。
注3:无其他实质性工作同时进行;CPU 一直徘徊在 30% 左右。GPU 也是如此。
注意 4:在需要来自该图集的任何纹理之前请求图集预加载,因此它应该有足够的时间来预加载。
非常感谢任何帮助/方向!
更新
发生预加载的完整代码块:
更新 2
我创建了一个空项目,只有 atlas 预加载块。性能下降仍然存在。我已经尝试过多个地图集,即使只有一个资产的地图集。
在这个空的新项目中,我也尝试了@Sez 的建议(见下文),但在这种情况下,甚至没有调用完成块,这似乎是SKTextureAtlas
课堂上的另一个错误。(?!)
更新 3
我尝试删除.spriteatlas
并创建.atlas
具有相同纹理的,并且(几乎)没有性能影响。但是,.atlas
不支持切片,这就是我想首先使用.spriteatlas
的原因。
swift3 - SKTextureAtlas 可以从“我的”包而不是“主机”包加载包吗?
我正在开发 SWIFT3/SpriteKit 屏幕保护程序,并且屏幕保护程序正常工作,但我无法加载纹理,因为当我执行以下操作时:
SKTextureAtlas 正在寻找主捆绑包中的“传单”,当它在内部运行时screensaverengine.app
,它不是纹理所在的捆绑包。
在我旧的基于 obj-c 的屏幕保护程序中,我必须执行以下操作才能从包中加载图像:
在我走在运行时加载图像和创建纹理的路线之前,我想利用 Stackoverflow 系列寻求帮助......想法?
ios - 纹理图集中的纹理在场景中的 Xcode 中可用,但在正在运行的应用程序中不可用
使用 Xcode 8,我的项目中有一个纹理图集,其中包含一堆图像。在场景编辑器中,我可以选择一个精灵,然后在该精灵的纹理字段中单击并获取项目中所有纹理(图像)的列表,包括纹理图集中的那些。我从纹理图集中选择纹理。运行应用程序时,我没有得到精灵的纹理。我得到一个大红色 X。
我知道我可以以编程方式从图集中获取纹理并将其分配给精灵。我想知道为什么对精灵的 Xcode (IB) 分配在 Xcode (IB) 内部有效,但在正在运行的应用程序中无效。我应该能够将 Xcode 内部纹理图集中的纹理分配给精灵。
如果我从不在图集中的普通图形图像中分配纹理,它就可以工作。