gpt4 book ai didi

objective-c - UIImage 基于图 block 的 map 移动缓慢

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:13 24 4
gpt4 key购买 nike

我有以下代码,每次触摸屏幕时都会在屏幕上绘制一堆 uiimage 瓦片(它是一个探索瓦片地牢的角色)。但是如果我快速点击, Action 会非常跳跃。为什么它运行缓慢。

谢谢。

- (void) updateView {
// lets remove all subviews and start fresh
for (UIView *subview in self.view.subviews)
[subview removeFromSuperview];

[self drawVisibleDungeon];
[self displayMonsters];

[self drawPlayer];
[self.view setNeedsDisplay];

[self.view addSubview:messageDisplay];
[self.view addSubview:miniMap];
[miniMap setNeedsDisplay];
}

- (void) processTouchAtX: (int)x AndY: (int)y
{
int tempx = 0;
int tempy = 0;

if (x > 4)
tempx++;
if (x < 4)
tempx--;
if (y > 6)
tempy++;
if (y < 6)
tempy--;

[[[self _accessHook] dungeonReference]processOneTurnWithX:tempx AndY:tempy];
[self updateView];
}

- (void) displayMonsters
{
UIImage *aImg;
int x, y;
NSString *aString;
int monCount = [[[_accessHook dungeonReference]aDungeonLevel]monsterCount];
NSMutableArray *monArray = [[[_accessHook dungeonReference]aDungeonLevel]mArray];
int player_x_loc = [[[self _accessHook] dungeonReference] thePlayer].x_location;
int player_y_loc = [[[self _accessHook] dungeonReference] thePlayer].y_location;

for (int i=0; i<monCount; i++)
{
x = [[monArray objectAtIndex: i] x_loc];
y = [[monArray objectAtIndex: i] y_loc];

if ([self LOSFrom:CGPointMake(x, y)])
if ((x >= player_x_loc-4) && (x < (player_x_loc+5)) && (y >= player_y_loc-6) && (y < (player_y_loc+6)))
{
UIImageView *imgView=[[UIImageView alloc]init];
aString = [[monArray objectAtIndex:i]monsterPicture];
aImg = [UIImage imageNamed:aString];
imgView.frame=CGRectMake((x - (player_x_loc-4))*32, (y - (player_y_loc-6))*32, 32, 32);
imgView.image = aImg;
[self.view addSubview:imgView];
[self.view bringSubviewToFront:imgView];
[imgView release];
}
}
}

最佳答案

您使用 cocos2d 的想法很好,它是一个非常好的框架,可能非常适合您可能面临的其他问题。但是……我们为什么不也讨论一下为什么您遇到这么多麻烦。

您正在为每个图 block 使用单独的 UIImageViewUIImage 很好,而且对于大多数用途来说非常高效。但是每个图 block 的完整 View 都非常昂贵。更糟糕的是,每次你调用 updateView 时,你都会拿走所有东西然后扔掉。那是非常非常昂贵的。

和第一步一样,因为它很容易修复,所以在开始时设置所有 ImageView 并将它们存储在一个数组中。然后在 displayMonsters 中,只需更改它们的位置和图像,而不是删除它们并创建新的。我怀疑这本身会显着提高您的表现。

如果您仍然需要更高的性能,您可以切换到使用 CALayer 而不是 UIImageView。您可以非常轻松地创建一个 CALayer 并将其 contents 设置为 aImg.CGImage。同样,您将使用 [view.layer addSublayer:layer] 添加一堆 CALayer 对象,就像添加 View 一样。图层只是比 View 便宜得多,因为它们不处理触摸事件之类的事情。他们只是画画。

但如果您预计需要更精美的 2D 图形,Cocos2D 没有任何问题。

关于objective-c - UIImage 基于图 block 的 map 移动缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com