问题标签 [texture-atlas]

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.

0 投票
1 回答
1818 浏览

texture-atlas - DirectX 12 是否消除了对纹理图集的需求?

我记得当我看到关于 DirectX 12 的最初讨论时,我认为它消除了对纹理图集的需要。但是,现在我正在浏览文档,这似乎不是一个明显的结论。

我见过的一个可以替代它的功能是 HLSL 中资源数组的动态非统一索引:

另一个潜在的功能是ExecuteIndirect,它将仍然是一堆单独的绘图和资源更改调用编码到缓冲区,并在单个 CPU 调用中一次将其提交给 GPU。

这两个都将解决纹理图集的限制(无法在图集区域上使用边界模式,有问​​题的 mipmapping),但我想知道性能特征或预期是否类似于纹理图集,或者该技术是否仍然合理。

我也很想知道答案是否适用于 Mantle、Vulkan 和 Metal。

0 投票
1 回答
145 浏览

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# 编写一些小代码示例,我将不胜感激。

非常感谢。

0 投票
1 回答
1273 浏览

ios - 如何减小 Xamarin.iOS 中内置的 iOS 游戏和应用的大小?

苹果开发者指南的链接是:

https://developer.apple.com/library/prerelease/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/SubmittingTheApp.html

在该链接上,他们有“提交应用程序以供应用程序审查”部分,其中包含以下消息:

异常大的构建文件通常是在编译后的二进制文件中存储数据(例如图像)而不是作为应用程序包中的资源的结果。如果您要将图像或大型数据集编译到二进制文件中,最好将此数据拆分为由您的应用程序动态加载的资源。

我的游戏使用的 PNG 图像的总大小约为 130 Mb。当我编译并将游戏加载到我的 iPad 上进行测试时,我可以看到游戏的总大小约为 190 MB,如 iPad 上所示。

我已经将 PNG 图像放在 Xamarin 工作室的文件夹“资源”中,我的代码在编译和构建游戏之前将这些图像构建到纹理图集中。

因此,根据 Apple 在上述消息中的建议“最好将此数据拆分为由您的应用程序动态加载的资源”,我的问题如下:

(1) 我是否可以通过“将图像放入另一个可以由我的游戏动态加载的资源”来进一步减小我的游戏大小?(或者在这种情况下“App Thinning”会有所帮助吗?)

(2) 如果上述问题 (1) 的答案是“是”,请告诉我该怎么做?或者您能否向我发送一个指向 Xamarin 网站的链接,该网站向我们展示了如何做到这一点?

非常感谢。

0 投票
0 回答
923 浏览

image - 如何实现纹理图集着色器?

我想知道如何将着色器与纹理图集一起使用。有谁知道我怎样才能只绘制图像的一部分?

目前看来 :

图像1


所需视图:

图2


着色器源代码:

0 投票
1 回答
3975 浏览

c# - 如何在unity3d中创建3d对象的纹理图集

我正在开发一个 3D 游戏,它在一个场景中有很多游戏对象。所以我正在努力减少 draw call。我在我的静态游戏对象上使用了网格组合。但是我的播放器不是静态的,我不能在它上面使用网格组合。我的播放器只不过是一些使用标准着色器的立方体和不同部分上的一些不同颜色材料的组合。所以我猜,我可以在我的播放器上使用纹理图集来减少 darw 调用。但我不知道该怎么做。

我的工作理论对吗?如果我是对的,请帮助我进行图谱,如果我错了,请指出我的错。提前致谢。

0 投票
0 回答
279 浏览

performance - mipmaps 如何影响 2D sprites 上的静态批处理

我正在优化我的 2D 手机游戏。整个游戏中有很多POT 大小的精灵,我已经填充了它们Packing Tag以启用批处理并选中了它们的Generate Mip Maps复选框。所有这些精灵在游戏中都有统一的比例,其中大部分是 (1,1,1)。

我打算做的是尽量减少游戏中的批次数量。

我想弄清楚的是 mipmaps 如何影响 2D 游戏中的批次数?

这是我尝试过的:

我用不同但统一的比例多次复制了两个精灵,并报告了批次数。

圆圈启用了 POT 大小和 mipmap;正方形不是,它只是一个精灵;两者都有相同的包装标签,因此它们位于不同的地图集中。

选中或取消选中Static这些游戏对象也不会改变任何东西。

a在此处输入图像描述 绘制两个不同精灵时的 3 个批次

在此处输入图像描述 绘制两个不同的精灵但位置略有不同的 7 批次

在此处输入图像描述 仅绘制一个 mipmap sprite 时 1 批

在此处输入图像描述 仅绘制一个非 mipmap 精灵时的 1 个批次。游戏对象的位置与第一个测试用例相同,有 7 个批次

0 投票
1 回答
1295 浏览

c++ - 在 Texture Array 中绘制 Texture2D 图集

如何通过 GLSL 采样器仅绘制存储在纹理数组中的 Texture2D Atlas 的一部分?例如,我有纹理图集,我会将它们(与其他相同大小的图集)放在 Texture2D 数组中。(glTexSubImage3D)

在此处输入图像描述

那么,在这种情况下,我的采样器应该是什么样子?

https://www.opengl.org/wiki/Array_Texture

https://www.opengl.org/wiki/Sampler_(GLSL)

我只找到了一些例子,如何从数组中选择和应用整个纹理,但如果在我们的数组中存储纹理图集,则没有任何关系。

0 投票
3 回答
648 浏览

ios - XCode8 TextureAtlas 编译器没有产生

我在 XCode8 的 Swift 3.0 项目中添加了新的particle.sks 文件。我使用 XCode 编辑器创建了部分文件。我已经有很多粒子(在 XCode7 中完成)。突然之间,我的应用程序无法编译,因为:

我不明白出了什么问题。我已经删除了衍生数据并清理了产品。似乎没有任何效果。这个错误描述对你来说意味着更多吗?你能帮忙解决这个问题吗?

0 投票
0 回答
42 浏览

ios - 清除 SKTextureAtlas 时 SpriteKit 性能大幅下降

清除缓存的SKTextureAtlas.

简而言之,在游戏开始之前,我预加载了SKTextureAtlaswithtextureAtlas.preload(completionHandler:)并在完成处理程序中将对图集的引用存储在私有属性中,以便将其保存在内存中以供以后使用。

一段时间后,不再需要这个纹理图集,我想摆脱它,以保持干净健康的记忆。

问题

我遇到的问题是,当我清除纹理图集时(通过将持有对图集的引用的属性设置为nil),性能会在几秒钟内急剧下降。我的意思是从恒定的 60fps 到 40fps。

请注意,此时绝对没有其他对该图集的引用。


有趣:第 1 部分

仅在 iOS 10 上发生。在 iOS 9 上完美运行,即使在更旧的设备上也是如此。

有趣:第 2 部分

仅当图集.spriteatlas.xcassets. 但如果地图集.atlas.xcassets.

我知道我可以继续使用.atlas 而不是.spriteatlas,但.spriteatlas支持开箱即用的应用程序细化,但.atlas事实并非如此。

有趣:第 3 部分

如果图集具有少量小纹理,则清除工作正常。这表明可能存在与图集总大小相关的内部问题。但为什么?

动机

为这个问题找到解决方案/解决方法的动机是批处理绑定/绘制调用。使用相同纹理的子节点都在一个绘制通道中渲染,这当然会大大提高性能。

有了这个问题,我基本上被迫创建多个图集,这反过来会导致多个绘制调用,从而影响整体性能。

任何帮助将不胜感激。


更新

我已经尝试实现@Knight0fDragon 建议的解决方案,它建议缓存SKTexturesSKTextureAtlas而不是SKTextureAtlas自身,但遗憾的是,这在我的情况下不起作用。

我在最初的问题中忘记提到的是,这个问题大多数时候都会发生,但并非总是如此。每次尝试约 5 次,我都能让它正常工作。


解决方案

由于在被错误地标记为重复后我无法重新打开我的问题,我将在这里发布我找到的解决方案。

问题是在后台运行的动画。这个动画是这样设置的

它运行在UIImageView. 这个图像视图位于最终呈现另一个包含游戏场景的视图控制器的视图控制器中。

这两个视图控制器之间的转换是自定义的,由于我忘记在自定义转换动画器中添加调用,因此没有调用视图控制器生命周期方法(beginAppearanceTransition, ),这正是我有启动/停止所有逻辑的地方动画。因此动画一直在后台运行。endAppearanceTransitionviewWillAppear:viewWillDisappear

也就是说,即使动画在后台运行,它也不应该干扰一些完全不相关的事情,比如清除缓存的图集。

注意:有问题的动画的图像视图中的图像没有在有问题的纹理图集中定义。

0 投票
3 回答
295 浏览

libgdx - 从纹理图集创建精灵

在我的 libGdx 项目中,我使用 createSprite() 从纹理图集创建了一个精灵。我想将精灵实现为旋转。我该怎么做?这是我的代码:

内部渲染():

此代码不起作用。请告诉我我做错了什么。