我有以下代码,每次触摸屏幕时都会在屏幕上绘制一堆uiimage图块(它是一个探索图块地牢的角色)。但是如果我快速点击,那么这个动作会非常激动。为什么它表现得很迟钝。
感谢。
- (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];
}
}
}
答案 0 :(得分:1)
您使用cocos2d的想法很好,这是一个非常好的框架,可能非常适合您可能遇到的其他问题。但是......为什么我们不讨论为什么你会遇到这么多麻烦呢。
您为每个磁贴使用单独的UIImageView
。 UIImage
很好,而且对于大多数用途来说非常有效。但是每个瓷砖的完整视图都非常昂贵。更糟糕的是,每当你打电话给updateView
时,你都会把所有东西扔掉。这非常非常昂贵。
就像第一步一样,因为它很容易修复,所以在开始时设置所有图像视图并将它们存储在一个数组中。然后在displayMonsters
中,只需更改其位置和图片,而不是删除它们并创建新的位置和图像。这本身就会大大改善你的表现,我怀疑。
如果您仍需要更高的性能,可以切换为使用CALayer
而不是UIImageView
。您可以非常轻松地创建CALayer
并将其contents
设置为aImg.CGImage
。同样,您将添加一堆CALayer
个[view.layer addSublayer:layer]
个对象,就像添加视图一样。图层比视图便宜得多,因为它们不处理触摸事件等事情。他们只是画画。
但如果您预计需要更漂亮的2D图形,Cocos2D没有任何问题。
答案 1 :(得分:0)
这很慢,因为在一堆地图图块中使用UIImage会产生很多开销。最好使用OpenGL和顶点缓冲区绘制所有内容。