- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我制作了一个非常简单的 iOS 游戏,其中有多个对象在屏幕上滚动并检查沿途是否发生碰撞。目前要移动它们,我有一个 NSTimer,它每 0.01 秒左右触发一次并将帧移动 2 个像素。然后它会检查玩家的位置以寻找相交的帧并采取相应的行动。
这非常有效,我在自己的设备上使用它没有任何问题,但是我注意到,当屏幕上有超过 20 个对象在旧设备上同时移动时,有时会出现延迟(例如iPad 3,例如)。
分析应用后,似乎有大约 70% 的 CPU 分配给了这个线程。这是正常的吗?如果我将每个对象添加到单个固定 View 上的 CALayer 并更新该层上的位置,而不是让 25-30 个单独的 UIImageView 在屏幕上同时移动,是否会减少 CPU 的负载?或者有更好的方法吗?
我想我会先问一下,然后再麻烦将我的所有代码转换为使用图层。有没有人有过在旧设备上编写这样的游戏而没有任何延迟的经验?
我想支持尽可能多的设备,但较旧的设备似乎很难运行(我觉得这很奇怪,因为与我制作的其他游戏相比,这款游戏非常简单)。
Deployment Target: 5.0
iPad Device iOS: 7.0.6
iPhone 5 Device iOS: 7.0.6
XCode Version: 5.0.2
这是在触发计时器时运行的代码。 CView
基本上是一个带有一些额外的 int/bool 属性的 UIImageView。
for(CView* c in self.view.subviews)
{
if(![c isKindOfClass: [CView class]])
{
continue;
}
[c setFrame:[CRect rect:c.frame withNewY:c.frame.origin.y+2]];
if(fabsf(c.frame.origin.y + c.frame.size.height - (player.frame.origin.y+player.frame.size.height)) <= player.frame.size.height)
{
if([player collideWith:c.x])
[self gameOver];
}
else if((c.frame.origin.y + c.frame.size.height) > (player.frame.origin.y + player.frame.size.height) && c.passed == NO)
{
c.passed = YES;
score++;
}
if(c.frame.origin.y > [CRect height])
{
[self removeView:c];
}
}
if(score != score2)
[scoreLabel setText:[NSString stringWithFormat:@"%d",score]];
score2 = score;
reps++;
if(reps < 0)
return;
NSArray* formation = [formations objectAtIndex:(int)[Global randomFloatBetween:0 andLarge:11.99]];
float max = 0;
for(int i = 0; i < formation.count; i++)
{
if([[formation objectAtIndex:i] intValue] == -1)
continue;
if([[formation objectAtIndex:i] floatValue] > max)
max = [[formation objectAtIndex:i] floatValue];
float x = [CRect centerX:(player.laneWidth*5)+(player.lineWidth*4)] + ((i) * (player.xWidth+player.lineWidth)) + player.margin;
float y = -101 + ([[formation objectAtIndex:i] floatValue] * (-130));
CView* c = [[CView alloc] initWithFrame:CGRectMake(x, y, 49, 101)];
[c setX:i+1];
[c setImage:[images objectAtIndex:(int)[Global randomFloatBetween:0 andLarge:images.count-0.01]]];
[self.view insertSubview:c belowSubview:adBanner];
}
reps = (-101 * (max+1)) - 202;
reps /= 1.75;
这是否与我以这种方式创建 CViews
并在它们离开屏幕时使它们无效有关?如果我要使用一个固定的数字并重新使用旧的 CViews
(只需将它们放在屏幕的另一端并在它们完成交叉时重新运行它们)是否会提高性能?我不知道 ARC 多久收集一次垃圾。
最佳答案
您应该考虑使用现有的游戏引擎,例如 cocos-2d,或者花时间使用通用模式和最佳实践来改进您自己的引擎。如果您决定使用现有引擎,除了阅读他们的文档并在遇到困难时询问具体问题外,没有什么可说的了。不要问有关使用什么引擎的问题。这类问题不适合 Stack Overflow。
如果您继续使用自己的引擎,那么我仍然建议您研究 cocos-2d 和 Sprite Kit 的文档和编程指南。这将帮助您构建自己的引擎。例如,这是 Sprite Kit 编程指南中解释游戏循环的图片。
如果您有兴趣使用 Core Animation 编写游戏引擎,那么我建议您阅读 this series of blog posts by Matt Gallagher .它已经有几年历史了,但应该仍然很重要。
当您按照这些步骤构建您的游戏引擎时
然后您可以开始测量不同步骤的性能和内存效率,并继续处理最重的部分,直到达到可接受的性能。
也许值得在 View 移出屏幕时重用它们,也许您的碰撞检测过于昂贵并且应该进行优化,也许移动到图层是值得的。您必须先进行衡量,才能知道将时间和精力花在哪里。
但是,我会告诉您,您应该放弃 NSTimer 并为游戏循环使用单个 CADisplayLink 以保持更新与显示同步。
作为旁注:
I don't know how often ARC collects garbage.
这句话让我很担心。说明你还没有了解ARC是什么以及它是如何工作的。 ARC 不是垃圾收集器。我建议您回头再看一下 Objective-C 中的内存管理
关于ios - 使用 UIImageViews 和框架或 CALayers 或其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288595/
这个fn是吗: function isplainobj ( obj ) { return Object.prototype.toString.call( obj ) === "[object
我尝试创建一个我没有经验的小 bash 脚本。我尝试做类似的事情: #!/bin/bash statut="na" if [ $proc = 0 ]; then statut = "close
我想重写 HighLine 的几个方法来自定义我的控制台,目前我的代码如下所示: cmd = ask("#{@prompt_label} #{@prompt_separator} ",
鉴于下面的 HTML,我尝试使用 jQuery 来匹配所有具有类“foo”的跨度的列表项,并且该跨度应包含文本“relevant”。 Some text relevant Some more
我拥有一个 5 美元 20GB SSD Digital Ocean Droplet,它几乎用完了 Docker 镜像和容器的空间。 有没有办法购买一个卷,将其连接到服务器并安全地将所有 Docker
我有这样的表: id name number result stuff stuff stuff stuff 我只想将 class = "red" 添加到
我需要计算两点之间的距离,但不是以常规方式。我需要知道“东西距离”+“南北距离”。我想这比常规的“乌鸦飞翔”计算更简单,但我仍然不知道如何做到这一点。 我想使用 MySQL 查询来执行此操作,并且最好
#include #include #include typedef struct dict_pair { void *key; void *value; struct dict_p
为什么当我尝试通过 将 char[] word 写入控制台时会发生这种奇怪的事情 Console.WriteLine(word); 我得到了一个正确的结果,但是当我写的时候 Console.Write
一个简单的例子: class C{} class B{ @Inject C c; void doSomething(){ System.out.println(c);
我想做某事,但不确定如何描述它。我有这门课 public class Company { private List _persons; private Person GetPersonByNa
我正在尝试实现我自己的 qDebug()样式调试输出流,这基本上是我目前所拥有的: struct debug { #if defined(DEBUG) template std::os
所以我正在为我的应用程序编写一个搜索功能,代码如下: - (void) selectObject: (NSString *)notes{ [axKnotes removeAllObjects]
我想在 Rust 中匹配一种复杂的继承式东西: struct Entity { pub kind: EntityKind, } pub enum EntityKind { Player
我是 SQL 新手。这没有返回任何结果...... SELECT media.id as mediaid, media.title as mediatitle, media.description
在微型 SDCard 上写入 Android things 图像并将该卡插入 Raspberry Pi 3 Model B 并打开电源,启动时显示“Auto config Please wait”然后
这是一个常见的但是文本出现在框的右侧,不是极右但几乎是这样 h3: ................................................ .................
#include #include #include #include #include int main(int argc, string argv[]) { if(argc >
所以我试图让一些东西相互堆叠。首先,查看工作链接会有所帮助,您会看到问题所在: http://brownbox.net.au/clients/matchlessphotography/ 现在我需要使用
我想在禁用 javascript 时在我的网站顶部显示一条消息(就像在 SO 上一样),但在谷歌浏览器上不起作用 最佳答案 看起来是这样。 您可以使用 javascript 隐藏“noscript”消
我是一名优秀的程序员,十分优秀!