Sprite Kit:大量带有 Bit Blitting 的 sprite(1000+)

2024-02-22

我正在尝试使用 SpriteKit 创建一个场景,其中包含数千个精灵(~500 - 2000)。每个精灵只是一个 1x1 的白色像素 - 甚至不需要为它们使用纹理。

立即将这么多精灵直接添加到场景中是不可能的(或者至少我这么认为)。在 iPhone 6 上,我最终添加了大约 200 个精灵,然后系统由于内存而结束了添加过程,并且其余精灵没有添加。

我找到了一个聪明的解决方案,称为位块传输 http://www.sdkboy.com/2014/01/spritekit-bit-blitting-by-drawing-to-a-texture-for-performance-optimization/其中所有精灵都添加到一个节点,然后将其“转换”为纹理textureFromNode:方法,然后从该纹理创建一个单个精灵,该精灵最终将添加到屏幕上。它工作得很好,我能够以很高的 fps 一次性创建超过 10000 个精灵。

我的问题是我之后无法移动这些精灵(=更改位置)。无论我做什么,纹理始终保持不变。我缺少什么?

My Code:

override func didMoveToView(view: SKView) {
    self.generateRandomSprites()
}

func generateRandomSprites() {

    let texture = SKTexture(imageNamed: "whitePixel")

    self.canvasNode = SKNode()

    log("started generating all sprites")

    for var i = 0;i < 1000;i++ {

        let width = self.scene!.frame.size.width
        let height = self.scene!.frame.size.height

        let x: CGFloat = CGFloat(arc4random_uniform(UInt32(width)))
        let y: CGFloat = CGFloat(arc4random_uniform(UInt32(height)))

        let cell = SKSpriteNode(texture: texture)
        cell.position = CGPointMake(x, y)

        self.arrCells.append(cell)
        self.canvasNode.addChild(cell)
    }

    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite = SKSpriteNode(texture: self.canvasTexture, size: self.frame.size)
    self.canvasSprite.anchorPoint = ccp(0,0)

    self.addChild(self.canvasSprite)
}


override func update(currentTime: CFTimeInterval) {
    for oneCell in self.arrCells {
        oneCell.position = CGPointMake(oneCell.position.x + 1, oneCell.position.y)
    }

    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite.texture = self.canvasTexture
} 

应用程序的屏幕截图(这是静态的,没有任何反应):


这不是答案,而是我尝试过的事情的集合。

我真的对这段代码很好奇。我尝试了一下,但没有成功。我更改了更新方法,将点放在随机位置并且它有效:

所以我有一个问题。为什么代码不能从当前位置更新,或者这是一个转移注意力的事情?

override func update(currentTime: CFTimeInterval) {

    let width = self.scene!.frame.size.width
    let height = self.scene!.frame.size.height

    for oneCell in self.canvasNode.children as! [SKSpriteNode] {

        let x: CGFloat = CGFloat(arc4random_uniform(UInt32(width)))
        let y: CGFloat = CGFloat(arc4random_uniform(UInt32(height)))

        oneCell.position = CGPointMake(x, y)
    }

    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite.texture = self.canvasTexture

}

好吧,我一直在玩这个,这很有效,只需获取一个随机值并将其添加到该位置......

override func update(currentTime: CFTimeInterval) {

    let width = self.scene!.frame.size.width
    let height = self.scene!.frame.size.height

    for oneCell in self.canvasNode.children as! [SKSpriteNode] {

        let x2: CGFloat = CGFloat(arc4random_uniform(UInt32(10)))
        let y2: CGFloat = CGFloat(arc4random_uniform(UInt32(10)))
        let x:CGFloat = oneCell.position.x - x2
        let y:CGFloat = oneCell.position.y - y2
        let point = CGPointMake(x, y)

        oneCell.position = point
    }

    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite.texture = self.canvasTexture

}

现在我认为这与编译器有关,因为这是有效的:

override func update(currentTime: CFTimeInterval) {

    let width = self.scene!.frame.size.width
    let height = self.scene!.frame.size.height


    var x3:CGFloat = 10.0
    var y3:CGFloat = 10.0
    for oneCell in self.canvasNode.children as! [SKSpriteNode] {

        let x:CGFloat = oneCell.position.x - x3
        let y:CGFloat = oneCell.position.y - y3
        let point = CGPointMake(x, y)

        oneCell.position = point
        x3 += 0.01
    }


    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite.texture = self.canvasTexture

}

更多调查,有趣的是,如果您使用值 1.3 并运行代码,您可以看到点移动一次。 (http://llvm.org/docs/LangRef.html#simple-constants http://llvm.org/docs/LangRef.html#simple-constants)

override func update(currentTime: CFTimeInterval) {

    let width = self.scene!.frame.size.width
    let height = self.scene!.frame.size.height

    for oneCell in self.canvasNode.children as! [SKSpriteNode] {

        let x:CGFloat = oneCell.position.x - 1.3
        let y:CGFloat = oneCell.position.y - 1.3
        let point = CGPointMake(x, y)

        oneCell.position = point
    }

    self.canvasTexture = self.view!.textureFromNode(self.canvasNode)
    self.canvasSprite.texture = self.canvasTexture

}

像 50.3333333333 这样的数字显示出明显的震动,但随后似乎停止了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sprite Kit:大量带有 Bit Blitting 的 sprite(1000+) 的相关文章

  • iOS 上 Safari 中的 shift 键

    有没有办法在javascript中判断手机键盘上是否按下了shift键 并将其与大写锁定 按两次shift键 区分开来 一些事实 首先 让我们看一下有关 iOS 键盘的一些事实 我假设您已经知道了 当您进入键盘模式时 shift键始终处于激
  • iOS后台获取时间限制崩溃

    我已经设置了背景获取 使用大纲NSScreencast 第 92 集 http nsscreencast com episodes 92 background fetch BOOL application UIApplication app
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • Swift:如何让游戏中的角色只有落地后才能跳跃?

    我正在开发一款游戏 我的角色可以从一个陆地跳到另一个陆地 我已经把所有事情都做好了 除了我剩下的问题是 如果你继续点击屏幕 他可以永远跳跃 我希望他必须先落地才能再次跳跃 import SpriteKit import GameplayKi
  • 如何本地化 iOS 故事板

    我有一个包含一些视图的 iPhone 故事板 例如 导航项标题名为News 应翻译为其他语言 当我向故事板添加新的本地化版本时 它会为新语言创建当前故事板的副本 在这里我可以更改导航项的标题 但对我来说它似乎不太有用 如果我的故事板包含 1
  • 更改目录时 Gitlab CI 运行程序作业失败退出状态 1

    我正在使用我的个人机器作为使用 Fastlane 的 iOS 项目的运行程序 这主要是因为共享运行器没有为 iOS 设置 因为它们没有安装 Xcode 更改目录时我的作业立即失败 它是一个 shell 运行程序 根本没有其他自定义配置 有什
  • Swift:Tableview 在导航栏下方滚动但在状态栏上方滚动?

    我使用以下技巧隐藏了导航栏的阴影 self navigationController navigationBar setBackgroundImage UIImage for default self navigationControlle
  • Swift Siesta 访问响应原始数据

    我的 API 中有一个返回 PDF 文件内容的方法 如何在成功回调中获取响应的原始数据 所有午睡响应均以原始数据开始 以基础类型的形式Data 然后运行变压器管道 http bustoutsolutions github io siesta
  • 如何在导航栏上添加 UIView?

    我需要覆盖UINavigationBar with UIView像这儿 除了使用带有按钮返回的自定义 UIView 作为导航栏之外 还有其他方法可以做到这一点吗 您可以将子视图添加到应用程序的基本视图 UIApplication share
  • iOS - 在相机上放置自定义叠加层(垂直对齐)。顶部黑条的大小

    我正在寻找以下问题的编程解决方案 我想在相机 iOS 上绘制自定义叠加层 我希望它位于相机输出视图的垂直中央 我已经完成了相对于屏幕而不是相机图片居中绘制自定义视图 为此 我需要获得顶部黑条的大小 我怎么才能得到它 顶部和底部栏的大小不相等
  • SDK 和 iOS 部署目标。

    我使用最新的 SDK 4 1 构建项目并设置 iOS 部署目标 3 0 如果我使用4 0 sdk的某些方法 我可以在真正的iPhone 3 0上运行我的项目吗 您只能在 OS 3 设备上运行您的项目 如果有条件地编码围绕您想要使用的 OS
  • UIScrollView 与 UITabBarController 切断

    我有一个 UIScrollView 我将其放置在视图中 界面生成器文档 xib m h 但是 UIScrollView 的下半部分被剪切 并且由于我有一个 UITabBarController 而没有显示其下半部分 我在 appdelega
  • Swift PageControl 当前页面上更大的点

    我试图将当前页面的点缩放为大于未 选择 的点 我正在使用滚动视图委托来确定哪个页面是当前的 目前 点的大小没有变化 我将如何实现这一目标 func scrollViewDidEndDecelerating scrollView UIScro
  • 如何将nsmutable数组添加到sqlite数据库表中

    如何将nsmutablearray添加到sqlite数据库表中 有人可以帮我编码吗 您可以使用 for int i 0 i lt mutArray count i NSString string mutArray objectAtIndex
  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于
  • Facebook 登录打开错误的应用程序

    我正在尝试使用 facebook 实现应用程序的登录 但每次我尝试登录时 它都建议打开错误的应用程序 我尝试了一些在这里找到的东西 但没有成功 在 Facebook 的开发者页面上我添加了一个后缀 我的 plist 如下 有谁知道发生了什么
  • 如何在 SwiftUI 中延迟动画?

    我想为两个文本字段设置动画 第二个字段有延迟 但它不起作用 没有延迟 它们同时从位置 100 动画到 0 这是代码 State private var offset CGFloat 100 State private var offset2
  • 带有自定义字体的 UILabel 错误呈现

    在我的 iPhone 应用程序中 我为所有 UILabel 设置了自定义字体 更准确地说 我对 UILabel 进行了子类化 重写了一个方法 在该方法中设置了自定义字体 然后将 IB 中的所有标签设置为该自定义类 现在的问题是 所有文本都渲
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客

随机推荐

  • Javascript 困境:创建荧光笔工具……快完成了

    我正在开发一个小 JS 插件 我希望它的功能与真正的荧光笔完全一样 取一个标准的 html 文本 div 带有子元素 用鼠标选择文本 并在鼠标松开时保持突出显示不变 看起来相当简单 对吧 这是我到目前为止所拥有的 http efflux u
  • NewtonSoft.Json 序列化和反序列化具有 IEnumerable 类型属性的类

    我正在尝试移动一些代码来使用 ASP NET MVC Web API 生成的 Json 数据而不是 SOAP Xml 我遇到了序列化和反序列化类型属性的问题 IEnumerable
  • iOS:如何获取长按手势的持续时间?

    我正在开发一款游戏 其中游戏对象的属性是通过长按对象本身来设置的 该属性的值由长按手势的持续时间决定 我正在使用 UILongPressGestureRecognizer 来实现此目的 所以它是这样的 gameObjectView addG
  • Eclipse、Scala 和 Maven - 未生成类文件

    我在 Eclipse 中将我的 scala 项目转换为使用 Maven 只需右键单击项目并配置 Maven 构建 这创建了 pom xml 添加了正确的依赖项 从 Maven 存储库中提取所需的 jar 但每当我尝试编译时 我不会请参阅 t
  • Laravel - Collection::delete 方法不存在

    我正在尝试测试 boot static deleting 方法 该方法应该在通过 Eloquent 删除模型时触发 Tinker 中的命令App User find 6 gt delete 返回 方法 Collection delete 不
  • 迭代哈希在 Python 和 Java 中返回不同的值

    我正在尝试将 python 2 7 脚本移植到 Java 它多次迭代 sha256 哈希 但最终得到不同的结果 我注意到他们第一次返回相同的结果 但从那时起它就不同了 这是 Python 实现 import hashlib def to h
  • Windows 窗体的多个滑块轨迹栏

    有谁知道如何在 WinForms 中创建带有多个滑块的跟踪栏 我想标记一个范围 另外 是否可以将滑块垂直偏移一点 我的目标是在轨迹栏上方有两个滑块 在轨迹栏下方有两个滑块 v v 您可以通过编写自己的代码来做到这一点UserControl您
  • 使用 bootstrap 主题从链接添加自定义类到 drupal-modal drupal 8

    在 Drupal 8 中 当您使用以下命令创建链接时使用引导主题class and data dialog type属性如下面的代码 a class use ajax href http drupal page front text a 您
  • 我可以在C#中反序列化包含0.0的JSON字符串吗?

    我从 Web 服务返回的 JSON 有一个整数 错误地表示为 0 0 我的反序列化代码如下所示 var serializer new JsonSerializer var ret serializer Deserialize
  • 使用 R 将多个文件从多个文件夹复制到单个文件夹

    嘿我想问如何使用R语言将多个文件夹中的多个文件复制到单个文件夹 假设有三个文件夹 桌面 文件夹 A 任务 子任务 桌面 文件夹 B 任务 子任务 桌面 folder C 任务 子任务 每个sub task文件夹中都有多个文件 我想复制 su
  • Microsoft Teams 中的 ActionTypes.MessageBack 存在问题?

    我正在使用带有 C 的 Bot Builder 3 11 版本 我有一个 ActionTypes MessageBack 类型的操作按钮 具有以下属性 cardActions Add new CardAction Type ActionTy
  • CSS !important 声明在 Outlook 2007 中不起作用

    我想创建一个锚颜色为红色的电子邮件模板 它应该是 重要的声明以避免继承其他样式值 不幸的是 它在 Outlook 2007 2010 中无法正确呈现 有人有类似的经历吗 与 Outlook 中的 important 标记支持相关的问题 我在
  • 如何同步两个View的drawable状态

    在 Android 中 我有一个 EditText 和一个位于 EditText 旁边的按钮 每当我按下一个按钮时 我都希望另一个也以相同的状态出现 我尝试将 android clickable true 放在封闭布局上 将 android
  • 对角化符号矩阵

    我需要用 python 对角化一个符号矩阵 在 Mathematica 中这可以很容易地完成 但是当使用模块时numpy linalg我遇到问题 为了具体起见 请考虑矩阵 2 x x 3 where x是一个符号变量 我想我遇到了问题 因为
  • 为 UIFont 定义宏不起作用

    我想定义一个宏来统一我的应用程序中的所有字体 define EXO REGULAR FONT size UIFont fontWithName Exo Regular size size 而不是像这样使用这个宏 myLabel font E
  • 如何在 Espresso 中的 RecyclerView 内部断言?

    我正在使用 espresso contrib 来执行操作RecyclerView 并且它应该正常工作 例如 click on first item onView withId R id recycler view perform Recyc
  • C# 生产质量线程安全内存中 LRU 缓存是否过期?

    这也许就像求棒上的月亮一样 但是是否有 C 生产质量的线程安全内存中 LRU 缓存 带过期 或者有人有最佳实践想法来实现同样的事情吗 LRU 是 最近最少使用 http en wikipedia org wiki Cache algorit
  • ListView 中每个项目的单独首选项?

    我正在创建我的第一个 Android 应用程序 或者无论如何都在尝试 但我有一个问题 我似乎找不到答案 我想允许用户为列表视图中的每个项目输入一组单独的首选项 我的 PreferenceScreen 正在工作 但它为每个项目维护相同的首选项
  • 为什么 scanf 中需要 %hd ?

    我创建了一个非常简单的程序 带有菜单 取一个值 然后将其记忆到 局部变量值 最后与 第二个选项是程序打印该值 我的问题是 为什么只有添加 h 程序才能运行 到 scanf 参数 换句话说 存在什么样的关系 scanf 和我的本地 int 值
  • Sprite Kit:大量带有 Bit Blitting 的 sprite(1000+)

    我正在尝试使用 SpriteKit 创建一个场景 其中包含数千个精灵 500 2000 每个精灵只是一个 1x1 的白色像素 甚至不需要为它们使用纹理 立即将这么多精灵直接添加到场景中是不可能的 或者至少我这么认为 在 iPhone 6 上