jjzjj

ios - 将图片存入内存NSArray或者SKAction

coder 2024-01-24 原文

我不完全理解 sprite kit 动画中的最佳选择; 1)苹果在“冒险”的例子中使用了这种方法,他们将动画作为图片存储在内存中 nsarray :

static NSArray *sSharedTouchAnimationFrames = nil;
- (NSArray *)touchAnimationFrames {
    return sSharedTouchAnimationFrames;
}

- (void)runAnimation
{
    if (self.isAnimated) {
        [self resolveRequestedAnimation];
    }
}

- (void)resolveRequestedAnimation
{
    /* Determine the animation we want to play. */
    NSString *animationKey = nil;
    NSArray *animationFrames = nil;
    VZAnimationState animationState = self.requestedAnimation;

    switch (animationState) {

        default:
        case VZAnimationStateTouch:
            animationKey = @"anim_touch";
            animationFrames = [self touchAnimationFrames];
            break;

        case VZAnimationStateUntouch:
            animationKey = @"anim_untouch";
            animationFrames = [self untouchAnimationFrames];
            break;
    }

    if (animationKey) {
        [self fireAnimationForState:animationState usingTextures:animationFrames withKey:animationKey];
    }

    self.requestedAnimation = VZAnimationStateIdle;
}

- (void)fireAnimationForState:(VZAnimationState)animationState usingTextures:(NSArray *)frames withKey:(NSString *)key
{
    SKAction *animAction = [self actionForKey:key];
    if (animAction || [frames count] < 1) {
        return; /* we already have a running animation or there aren't any frames to animate */
    }

    [self runAction:[SKAction sequence:@[
                                         [SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO],
                                        /* [SKAction runBlock:^{
        [self animationHasCompleted:animationState];
    }]*/]] withKey:key];
}

我很欣赏这种方法,但我无法理解。将 SKAction 存储在内存中不是更好的选择并且总是这样使用动画吗?

[self runAction:action];

无需总是创建新的 SKAction;

[SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO]

最佳答案

NSArray 中存储 SKTextures 是用于动画的推荐方法。我不能说我发现 SpriteKit 的文档也缺乏关于这个主题的内容,因为 SKAction 有方法 animateWithTextures

您确实可以拥有一个 SKAction,它具有由给定 NSArray 定义的给定动画,并且可能将它们存储在 NSMutableDictionary 中键的动画名称。然而,我在上面看到的这种方法在它们的 fireAnimationState 方法中只有一次 animateTextures 代码行,您可以将参数传递给它,例如 animationStatekey

我认为您需要对他们的方法进行更多的表面研究,才能确定他们选择走这条路的原因。您可以看到 animationState 在动画完成后被使用并且可能触发了其他事情。

[self runAction:action] 确实很简单,但是也很容易看出它不是以任何方式管理 animationState 或 key,我不得不假设他们决定他们的游戏需要这样做.

另请记住,他们的方法可能具有更高的层次,在给定的玩家类中,它会调用一种灵活的方法来为给定的游戏实体制作动画并执行除更改动画之外的其他操作。所以在他们的高级编码中,他们可能会做更像这样的事情:

[自运行Animation:@"jump"];

甚至

[自跳];

并且因为他们设计了一个低级系统来管理动画状态并为给定的管理设计添加键,所以他们永远不必编写您指出的长行代码,除非您在上面看到的那种方法中有一次。

我发现存储帧的 NSArray 而不是存储在 SKAction 中有用的几个原因是因为有时我想操纵动画或以不同的速度运行动画。但是您可能需要也可能不需要操纵动画的这些方面。

关于ios - 将图片存入内存NSArray或者SKAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439162/

有关ios - 将图片存入内存NSArray或者SKAction的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  4. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  10. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

随机推荐