似乎这些解决方案都没有消除与将图像渲染到屏幕上相关的延迟(无论是来自.png还是使用CG)。
有一个28x16的网格块,每个16x16像素,在游戏中的某些点,由于状态的变化,大约有一半需要更改图像。将每个块作为主视图的子视图会导致滞后,其中一半需要单独更改其图像(从.png或使用CG)。
我尝试了一个“map”视图,其drawRect:方法是:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
// width and height are defined as the width and height of the grid (28x16 for iPhone)
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
// states[] is an enum instance variable that holds the states of each block in the map (state determines image)
if (states[(x * height) + y] == PXBlockStateEmpty) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:0.5].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5].CGColor);
CGContextAddRect(context, CGRectMake(x * 16, y * 16, 16, 16));
CGContextDrawPath(context, kCGPathFillStroke);
} else if (states[(x * height) + y] == PXBlockStateSolid || states[(x * height) + y] == PXBlockStateSolidEdge) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:102.0/255.0 alpha:0.9].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5].CGColor);
CGContextAddRect(context, CGRectMake(x * 16, y * 16, 16, 16));
CGContextDrawPath(context, kCGPathFillStroke);
} else if (states[(x * height) + y] == PXBlockStateBuilding) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:0.5].CGColor);
CGContextFillRect(context, CGRectMake(x * 16, y * 16, 16, 16));
}
}
}
所以我的解决方案是在地图上调用setNeedsDisplayInRect:传递状态改变的块的帧(16x16 rect)。我是否正在使用setNeedsDisplayInRect:错误,或者这只是一种效率低下的方法吗?
当许多电路板充满不同的图像时,两个选项(一个子视图与数百个子视图)都会滞后游戏,而第二个解决方案特别是在任何块的图像需要更新时都会滞后。
有什么想法吗?谢谢你的帮助!
答案 0 :(得分:1)
调用setNeedsDisplayInRect:影响drawRect的参数:但是与setneedsDisplay相同。矩形drawRect:receive是所有脏矩形的并集。如果您只绘制与该矩形相交的内容,而保持其他内容不变,则可能会看到速度提升。从上面的代码片段判断,每次都会绘制每个图块。由于它是一个联合,您可能还会单独跟踪脏磁贴并仅绘制脏磁贴。在这种情况下,为各个图块调用CGContextClearRect而不是清除整个上下文,除非它们都是脏的。
CGContextAddRect将矩形添加到将要绘制的路径。由于您在每个循环中绘制路径而不开始新路径,因此在循环进行时重绘区域。使用CGContextFillRect和CGContextStrokeRect而不是路径可能会更快。
使每个图块成为一个单独的UIView会产生比整体绘图更多的开销。一旦解决了问题,你应该能够从这种方法中获得更好的速度。