草庐IT

ios - 克隆节点和性能、几何和性能; IOS场景包

coder 2024-01-18 原文

我正在使用 Scenekit 编写一个应用程序,客户希望在其中突破 IOS 中的动画限制。这个特定的应用程序要求我在屏幕上推送超过 1,500 次重绘。即使有这么多次重绘,我已将 FPS 锁定到 60,这很好,但是当我添加客户想要的所有元素时,重绘被推到 7,500 次重绘(是的,这不是错误或玩笑,这是重绘次数,尽管它几乎是我在 scenekit 中看到的大多数重绘次数的 50-80 倍)。在这个重绘级别,屏幕包含 170 万个顶点和大约 80 万个多边形。这是很多东西,而且对于这个应用程序来说,这些东西太多了,对任何人都没有用,因为现在我的 FPS 下降到 15-30FPS,这预计会超过 3K屏幕上的几何元素。到目前为止我做了什么:

  1. 我克隆了所有节点,克隆让我能够突破 Scenekit 的极限。我能够在屏幕上显示超过 1.5k 个恒定的 CAAnimations,并将超过 1.8k 个独特的几何图形放置在屏幕上的不同位置。

  2. 我通过遍历所有窗口并将它们的不透明属性设置为"is",强制应用程序中的所有窗口、 View 和屏幕不透明。

问题是这样的,我可以处理性能问题,但我在节点克隆方面遇到了问题。嗯,节点克隆有效,但问题是推到屏幕上的每个几何体必须有不同的大小,而且似乎没有办法改变每个单独克隆体的几何体。我知道我可以更改“复制”节点 (SCNNode *node = [masterNode copy];) 的几何形状,并且我知道我可以更改克隆节点的 Material 属性,但是有没有办法更改克隆节点? Apple 没有提供任何有关更改几何形状的信息,但他们确实在谈论更改 Material 。我是否假设我不能改变克隆体的几何尺寸?我可以更改克隆的变换、枢轴、旋转、动画、位置等,但几何体的大小不会改变。出于我的目的,我只需要改变圆柱体的“高度”变量,其他一切都井井有条,并且没有其他方法可以在没有节点克隆的情况下将 2k 重绘推到屏幕上,我试过了没有克隆,当声明每个几何图形和带有几何图形的节点作为它自己的唯一变量时,FPS 下降到不到 10,仅重绘 300 次。

最后,在同样的情况下,从 Scenekit 迁移到 Metal 后,我应该期望性能提高多少。我不担心数学、细节水平、设置渲染管道的耗时操作或任何其他可能出现的问题,我只是想在这里为我的问题找到最佳解决方案,而且我'我还没有使用 Metal,因为我不确定在需要多少多边形、顶点和重绘的情况下我会得到不同的结果。谢谢。

最佳答案

is there a way to change the geometry of the cloned node

我相信您可以更改烘焙几何体本身,但不能更改参数化几何体(不是 SCNCylinder)。所以你可以(改变高度):

  • 扩展节点
  • 更改转换矩阵(也进行缩放,只是一种不同的方式)
  • 添加一个几何着色器修改器,在您想要的轴上向上/向下移动点

改变实际的几何形状会破坏克隆的全部目的,所以我认为没有办法解决这个问题。

Lastly, given this same scenario, how much of a performance increase should I expect by moving from Scenekit to Metal.

很多。我所见大约为 30%,但这同样取决于您的设置。 Metal 随 iOS 9 一起提供,您无需执行任何操作即可为您的场景获取它,因此只需更新您的一台设备并在那里试用,看看是否有帮助!

出于好奇:为什么需要这么多圆柱体?你能不能欺骗它们的呈现方式?

关于ios - 克隆节点和性能、几何和性能; IOS场景包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30876214/

有关ios - 克隆节点和性能、几何和性能; IOS场景包的更多相关文章

  1. 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返回它复制的字节数,但是当我还没有下

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

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

  3. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  4. 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使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  6. 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上

  7. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  8. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  9. ruby - Grit 的克隆方法未定义? - 2

    我最近开始从事一个项目,该项目使用git进行存储并使用ruby​​作为前端。我的脚本的第一个版本使用了ruby​​-git,虽然非常简单,但还不错。当我需要对我的提交和日志做更具体的工作时,建议我转向砂砾。然而,我在早期遇到了障碍——grit似乎无法克隆远程存储库。我发现使用Repository类的所有示例都创建了一个本地存储库并搜索了我发现Grit的clone方法未定义的源代码。给了什么?这是我的第一个StackOverflow问题,在此先感谢您的帮助。 最佳答案 由于Git结构良好,Grit使用缺少的方法(Grit::Git#m

  10. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

随机推荐