SCNParticles 性能最高的图像格式?

Posted

技术标签:

【中文标题】SCNParticles 性能最高的图像格式?【英文标题】:Most performant image format for SCNParticles? 【发布时间】:2015-11-27 08:58:43 【问题描述】:

我一直在 Photoshop 中使用带有 Alpha 的 24 位 .png,并且刚刚尝试了一个在 OpenGL ES 上运行良好的 .psd,但 Metal 没有看到 Alpha 通道。

SceneKit 中粒子性能绝对最高的纹理格式是什么?

如果需要,这是一张供测试的表格。

它看起来是白色的...右键单击并在空白处另存为。这是一套 alpha 重型戒指。如果你眯着眼睛看屏幕,你可能几乎看不出来:

夸张的用例:

https://www.dropbox.com/s/vu4dvfl0aj3f50o/circless.mov?dl=0

// 加分点,任何人都可以猜出视频中左右环的区别。

【问题讨论】:

谢谢你让我觉得我的屏幕需要清洁了......而“性能”是一个狡猾的词:你想要最快、最丰富的功能还是别的什么? 最快。但是我已经添加了纹理,因此您可以查看它是否以任何建议的格式变得粗糙。显然,目标始终是速度和质量的混合体,但提供的纹理有望作为质量考虑的某种基准。还刚刚使用示例用例视频进行了编辑。 【参考方案1】:

使用灰度/alpha PNG,而不是 RGBA。由于它使用每像素 16 位 (8+8) 而不是 32 (8+8+8+8),因此初始纹理加载会更快,并且它可能(取决于 GPU)使用更少的内存。但是,在渲染时,您不会看到太大的速度差异,因为无论纹理格式是什么,它仍会被绘制到完整的 RGB(A) 渲染缓冲区。

还有 PVRTC,它可以让您降低每像素 2–4 位,但我尝试在您的图像上使用Imagine’s tool,即使是最高质量的设置也会导致一堆如下所示的伪影:

长话短说:使用灰度+alpha PNG,您可以轻松地从 Photoshop 导出。如果您的粒子系统正在损害您的帧速率,请减少粒子的数量和/或大小——在这种情况下,您可以在源纹理图集中将几个粒子图像叠加在一起,如果您选择足够不同的尺寸,这可能不会太明显。

【讨论】:

所以除了加载和压缩之外,在设备上一次纹理之间没有性能差异,因为 ios GPU 总是使它成为完全相同类型的 RGB(A)? 据我所知,是的。 @Confused 如果您确实尝试使用 PVRTC,我建议在从 Alpha==0 到 Alpha!=0 的区域中,您尽量限制颜色变化。例如,该纹理有很多 RGB=0xFFFFFF 的区域,具有不同的 A>0 但是一旦 Alpha 达到 0,RGB 似乎会跳转到#EFEFEF。像这样的每一个变化都代表了更多信息,压缩机必须尝试将其压缩到有限的可用空间中。如果您使用的是 (SrcA, 1-SrcA) 混合,则无论如何您都不会看到 #EFs,因此请替换为 #FFs。 FWIW,IMG 的 PVRTextool 对这类事情有很好的查看器。 我认为不同的纹理位深度不会对绘制它们的速率产生明显影响——正如我所说,它们被绘制成完整的 RGB(A ) 缓冲。您可以通过将 SCNView 使用的缓冲区更改为 RGB565(16 位)而不是 RGBA(32 位)来稍微提高速度,但这会以牺牲一些视觉质量为代价。 SCNView 不提供这样做的方法,因此您需要设置 CAEAGLLayer 或 GLKView 以绘制到(金属only supports RGBA),然后设置其drawableProperties 或@987654326 @ 分别使用kEAGLColorFormatRGB565GLKViewDrawableColorFormatRGB565。然后,使用SCNRenderer 将您的场景渲染到其中。

以上是关于SCNParticles 性能最高的图像格式?的主要内容,如果未能解决你的问题,请参考以下文章

高质量图像缩放库[关闭]

如何从四个或更多灰度图像中识别出激活最高的像素并保存为最终的热图?

png文件是啥格式?

D3D处理2D图像: NV12格式及其转换

WPF中的图像处理简介

怎么提高png图象的质量?