我正在使用SpriteKit开发一个小/中RTS游戏。 我想知道我的多线程方法是否正常。
一般来说,我有用户控制的单位和敌方单位。 两个单位都有一个基本的AI,敌人显然有更多的AI
让我们说如果单位停滞不前并且敌方单位接近它的攻击范围我想让一个单位自动攻击敌人。 而对于敌人来说也是如此。
我选择不向更新方法添加逻辑和距离测量,这种方法很昂贵。
我决定使用自己的更新方法制作2个线程/队列/池。 1个线程用于敌人,2个用于单位。
问题:可以/好/坏/可接受的方法吗? 我可以从中受益还是相反?
答案 0 :(得分:1)
你说
我选择不在更新方法中添加逻辑和距离测量值,这是非常昂贵的。
所以我假设您正在编写昂贵的计算,涉及要在单独的线程上执行的闭包内的距离测量。
时间t0
单位靠近敌人。您启动一个带有复杂代码的异步线程,以确定单元是否应该攻击敌人。
时间t1
然后(在主线程上)用户将单元远离敌人移动。
时间t2
最后,在t0
开始的线程完成了。决定是攻击敌人,因为在t0
时,该单位靠近敌人。但是现在单位不再靠近enemy
,所以你在屏幕上看到了错误的行为。
如果这是您游戏的可接受行为,那么我不会看到更多问题。
如果你关于单位/敌人是否应该攻击敌人/统一的逻辑完全基于2个物体之间的距离,你可以使用SpriteKit提供的物理引擎来检查碰撞。
<强>周长强>
你可以简单地创建一个圆形物理体,而不会以每个单位/敌人为中心。我们称之为Perimeter
。
您还可以设置位掩码值,以便仅在单位周界和敌方周界发生碰撞时收到通知。所以当2个单位或2个敌人的周界发生碰撞时没有通知。
现在物理引擎会在每个单位足够接近敌人时通知你。不需要多线程和非常简单的代码。