Cocoa 消除用于创建纹理的GCD资源争用

Cocoa 消除用于创建纹理的GCD资源争用,cocoa,sprite-kit,uikit,grand-central-dispatch,cifilter,Cocoa,Sprite Kit,Uikit,Grand Central Dispatch,Cifilter,我正在为四名玩家制作一款SpriteKit网络游戏。我必须使用GCD调度队列,因为我使用的是Game.xcsets捆绑包中唯一的图像资源集合,如果我不使用GCD,网络将被阻止,并导致游戏暂停和崩溃。GCD队列使这成为一个无问题,但我遇到的另一个问题是: 假设我创建了一个有四名玩家的游戏,他们都连接到一个被选为服务器的玩家。在iPad2上创建复杂的纹理和动画帧大约需要10秒,在iPadPro 12上大约需要2-3秒 如果他们都使用一个使用相同资源组的相似角色,我必须加载一个角色,让GCD完成他,然

我正在为四名玩家制作一款SpriteKit网络游戏。我必须使用GCD调度队列,因为我使用的是Game.xcsets捆绑包中唯一的图像资源集合,如果我不使用GCD,网络将被阻止,并导致游戏暂停和崩溃。GCD队列使这成为一个无问题,但我遇到的另一个问题是:

假设我创建了一个有四名玩家的游戏,他们都连接到一个被选为服务器的玩家。在iPad2上创建复杂的纹理和动画帧大约需要10秒,在iPadPro 12上大约需要2-3秒

如果他们都使用一个使用相同资源组的相似角色,我必须加载一个角色,让GCD完成他,然后加载玩家2的角色,让GCD完成,然后加载玩家3和4,同时等待GCD完全完成每个角色b的纹理和动画帧的构建在继续下一步之前

我不能说“每个人,这里是你需要制作和创建的所有角色,因为CIFilters抛出了一个错误的EXEC,因为其他角色通常使用某个角色想要使用的图像之一,即资源争用(对于资源包中的图像?该死!)

我的问题是:

有没有办法将这些资源标记为只读,供许多人免费使用?或者在我使用CIFilters时发布某种“副本”,以便将资源发布给其他人使用

唯一愚蠢的方法是为每个玩家的创建时间创建一组图像资源,以纠正这一问题并使GCD进入超速状态

// So "guy_rightArm_step0.png" becomes:

guy0_rightArm_step0.png
guy1_rightArm_step0.png
guy2_rightArm_step0.png
guy3_rightArm_step0.png
guy4_rightArm_step0.png
并将它们放在游戏中的正确位置。xcsets(每个玩家都有自己的,如果需要的话),即我必须创建五批图像资源(因为对于其他4个玩家,只有服务器选项)

这样,当我发出服务器msg时,会说build p1的char、p2的char、p3的char、p4的char,GCD使用本地存储的每个字符的图像组在其他客户端设备上进行操作


对我来说这听起来很疯狂,但这是唯一一种没有资源争用和在没有CIFilter映像崩溃的情况下创建角色的方法。

哦,是的,这些都是存储在每个设备上的相同映像,只是名称不同而已。所以GCD不会在CIFiltering期间为它们争吵…我添加了额外的图像,但这并没有解决任何问题,至少在iPad 2上,这件事崩溃得很厉害,除非我给它时间运行它的课程…你的应用程序崩溃的原因是因为你在处理图像时耗尽了所有的内存。在使用同一个输入映像时没有“争用”,只是不要编写消耗所有内存的代码。在循环周围放置自动释放块,并确保在尝试奇怪的解决方法之前清理资源。谢谢,这完全是真的,我一直在谈论iPad2内存有多少(512MB),对于动画帧,图像处理在6-7张图像上进行了3次。哦,是的,这些都是存储在每个设备上的相同图像,只是名称不同。所以GCD不会在CIFiltering期间为它们争吵…我添加了额外的图像,但这并没有解决任何问题,至少在iPad 2上,这件事崩溃得很厉害,除非我给它时间运行它的课程…你的应用程序崩溃的原因是因为你在处理图像时耗尽了所有的内存。在使用同一个输入映像时没有“争用”,只是不要编写消耗所有内存的代码。在循环周围放置自动释放块,并确保在尝试奇怪的解决方法之前清理资源。谢谢,这完全是真的,我一直在谈论iPad2 RAM有多小(512MB),并且动画帧的图像处理是在6-7张图像上进行的3次。