我正在使用Metal创建一个iOS应用。在我的应用程序中,我有可以通过触摸设备的显示器来操纵的粒子。每个粒子都有一个x和y(以及z和w,但这些并不重要)并且每个触摸手指都有“重力井”(z == 1表示触摸有效)。每次调用drawRect
(Particles.swift
的子类)MTKView
时,每个粒子都会更新 - 这发生在我的Particle.metal
文件中。
如果两根手指触摸显示屏,则会在两个触摸点之间创建一条不可见的线条。足够接近该线的每个粒子都垂直于线移动。不幸的是,我怀疑这种操作(或计算它)导致旧设备(如iPhone 5s,有时甚至是iPhone 6)的CPU过载,导致整个屏幕闪烁(iPhone 6)甚至删除屏幕上的所有粒子(iPhone 5s)。
以下是我的粒子的双指操纵的当前算法:pastebin link。首先,我计算了我的粒子和“不可见线”之间的距离。如果距离低于某个值,则操纵粒子的位置。这是针对屏幕上可见的每个粒子完成的。
我想知道是否有人可以提出任何优化/简化提示。
非常感谢!
答案 0 :(得分:2)
您是否考虑过使用单独的计算着色器沿该线绘制线性渐变并使用该纹理来控制粒子的方向?我有一个项目ParticleCam,它使用实时相机输入的亮度值来吸引粒子朝向图像的较亮区域。如果您将该着色器传递给线性渐变的图像,则可以实现您所追求的效果。