我有一个用于 GameOfLife 练习的自定义 UIView .. 我的棋盘尺寸足够大,处理它会限制 “帧率”。 (目前在我的模拟器中,这开始在屏幕的 60fps 以下以大约 100*100 开始)
我已经保留了一组我需要在每个步骤中计算的单元格。
但现在我想把这个设置分成几个部分,然后对每个部分进行线程。我该怎么做?
我需要知道的事情:
- 首先是:如何将 Set 分成 n 个部分?
- 如何确定我受益于多少线程?
- 我可以使用
DispatchQueue.global(qos: .userInitiated)
还是我应该使用一些池功能?
最佳答案
您可以利用 iOS、SceneKit 和 Metal 中内置的底层 GPU 架构来提高帧速率和缓冲性能。而不是仅仅依靠 CPU。
很难用所提供的有限信息回答这个相当广泛的问题,但是我可以把你推向正确的方向......在我看来你正在使用单线程渲染强制执行在 CPU 上序列化.底层 CPU 和 GPU 架构可以协同工作以自动并行运行线程,同时仍然是线程安全和同步的,但达到这一点的学习曲线相当高,但不要气馁,因为简单的更改可以大大提高代码的性能。
"I'd like to divide that set up into parts and thread each part. How can I do this ?"
了解 Metal 和 Metal Command Queue 或 MTLCommandQueue 会很有帮助,同时使用 gpu 和 cpu 可以显着提高性能。互联网上有很多很棒的教程可以比我在这里更好、更详细地解释它。简而言之,您可以使用命令缓冲区对整个场景进行编码或自动在线程之间分配工作。
"how do I determine how many threads I benefit from ?"
Metal 可以“自动”控制运行命令所需的线程数,因此不需要“手动”分配和取消分配线程。根据负载和执行情况,金属和 CPU 协同工作,根据需要将工作分配给尽可能多的线程以按时完成工作。
"can I use DispatchQueue.global(qos: .userInitiated) ?"
Grand Central Dispatch通常不用于图形,一般来说,GCD 在主 CPU 线程之外使用,以在与图形无关的多核硬件上运行并发代码。 GCD 不使用 GPU 和 Metal 来运行代码,除非它明确调用该代码。同样,有很多 GCD 教程可用,但这些教程可能无法像金属命令队列那样显着提高应用程序的性能。如果没有相关代码,就很难分析性能问题或推荐有效的解决方案。
有很多 Game of Life example on GitHub用 swift 写的。我建议您查看这些论文,看看其他人是如何做的,按照他们所说的通过示例学习。
观看WWDC Metal for Game Developers来自 Apple 的视频,这将使您对金属的性能有一个大致的了解,但如果没有对它的稳定的底层理解,您可能无法立即实现它的功能。
有个好ray wenderlich metal tutorial可以让您开始有效地使用 Metal 和 SceneKit。
关于swift - 如何用线程分而治之,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461555/