Memory iPad在设置背景图像动画时崩溃

Memory iPad在设置背景图像动画时崩溃,memory,animation,ipad,crash,png,Memory,Animation,Ipad,Crash,Png,我创建了一个带有png图像和长jpg背景的视图控制器(它的宽度是iPad-2048px的两倍)。移动png图像会使背景图像以无缝方式向左移动。有关说明性参考,请参见此图: 当我在iPad上玩它时,只要我一个接一个地移动超过3-4次,它就会崩溃。 有人知道这些车祸的原因吗?我试图检查内存泄漏,但找不到一个,尽管我不确定它是否真的没有内存泄漏。调试器发出内存过载警告,但我认为那里没有那么多内存消耗资产。有一个2048X768像素(约150 kb)的jpg背景图像和一个约90 kb的png静态图像。

我创建了一个带有png图像和长jpg背景的视图控制器(它的宽度是iPad-2048px的两倍)。移动png图像会使背景图像以无缝方式向左移动。有关说明性参考,请参见此图:

当我在iPad上玩它时,只要我一个接一个地移动超过3-4次,它就会崩溃。 有人知道这些车祸的原因吗?我试图检查内存泄漏,但找不到一个,尽管我不确定它是否真的没有内存泄漏。调试器发出内存过载警告,但我认为那里没有那么多内存消耗资产。有一个2048X768像素(约150 kb)的jpg背景图像和一个约90 kb的png静态图像。另外还有两种声音,一种大约200 kb,播放一次,另一种大约50 kb,在每个touchmoved事件上运行。 我的实现代码如下:

    #import "Page5.h"

    #define kUpdateRate (1.0 / 60.0)
    #define kRightX (1024.0)
    #define kLeftX (0.0)

    @implementation Page5
    @synthesize animationTiny, bg, kMoveX;
    @synthesize narPlayer, fxPlayer, narPath, fxPath;


    - (void)viewDidLoad {

    animationTiny.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"5-tiny-ipad-1" ofType:@"png"]];

    [super viewDidLoad];

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(flipIntervalEnded) userInfo:nil repeats:NO];
    }

- (void)narPlayPath:(NSString *)path {
        if (narPlayer!=nil) [narPlayer release];
        narPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
        narPlayer.delegate = self;
        [narPlayer play];
    }

    - (void)fxPlayPath:(NSString *)path {
        if (fxPlayer!=nil) [fxPlayer release];
        if ([tmbHDPrefs integerForKey:@"SoundFX"]==YES) {
            fxPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
            fxPlayer.delegate = self;
            if ([narPlayer isPlaying]==YES) {
                fxPlayer.volume = 0.2;
            }
            [fxPlayer play];
        }
    }


    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }

    - (void)didReceiveMemoryWarning {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];

        // Release any cached data, images, etc that aren't in use.
    }


    - (void)viewDidUnload {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }

    -(void)flipIntervalEnded {
        timer=nil;
        int trackNumber = 8;
        NSString *narrationString = [NSString stringWithFormat:@"tmbtrack%i_%i",[tmbHDPrefs integerForKey:@"Narration"],trackNumber];
        narPath = [[NSBundle mainBundle] pathForResource:narrationString ofType:@"caf"];
            [self narPlayPath:narPath];     
        narPath=nil;
    }

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [[event allTouches] anyObject];
        if ([touch view] == animationTiny) {
            if ( [timerFloat isValid]){
                [timerFloat invalidate];
                timerFloat = nil;
            }
        self.kMoveX = 30.0;
            fxPath = [[NSBundle mainBundle] pathForResource:@"fx5-water-swoosh" ofType:@"caf"];
            [self fxPlayPath:fxPath];
            fxPath = nil;   
        timerFloat = [NSTimer scheduledTimerWithTimeInterval:kUpdateRate target:self selector:@selector(scrollView) userInfo:nil repeats:YES];
        }
    }


-(void)scrollView {
        float oldX = self.bg.center.x - self.kMoveX;
        float newX = oldX;

        if (oldX < kLeftX) {
            newX = kRightX;
        }

        self.bg.center = CGPointMake(newX, self.bg.center.y);

        self.kMoveX -= 0.05;

        if (kMoveX <= 0.0) {
            kMoveX = 0.0;
        }    
    }

- (void)dealloc {
        self.animationTiny = nil;
        self.bg = nil;
        self.narPlayer = nil;
        self.fxPlayer = nil;
        self.narPath = nil;
        self.fxPath = nil;
        [super dealloc];
    }


@end
#导入“Page5.h”
#定义kUpdateRate(1.0/60.0)
#定义kRightX(1024.0)
#定义kLeftX(0.0)
@实施第5页
@合成animationTiny、bg、kMoveX;
@合成narPlayer,fxPlayer,narPath,fxPath;
-(无效)viewDidLoad{
animationTiny.image=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]路径资源:@“png”类型的“5-tiny-ipad-1”;
[超级视图下载];
计时器=[NSTimer scheduledTimerWithTimeInterval:1.0目标:自选择器:@selector(flipIntervalEnded)用户信息:无重复:否];
}
-(void)narPlayPath:(NSString*)路径{
如果(narPlayer!=nil)[narPlayer释放];
narPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path]错误:NULL];
narPlayer.delegate=self;
[玩家游戏];
}
-(void)fxPlayPath:(NSString*)路径{
如果(fxPlayer!=nil)[fxPlayer释放];
如果([tmbHDPrefs integerworkey:@“SoundFX”]==是){
fxPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path]错误:NULL];
fxPlayer.delegate=self;
如果([narPlayer isPlaying]==是){
fxPlayer.volume=0.2;
}
[fxPlayer play];
}
}
-(布尔)应自动旋转指针面定向:(UIInterfaceOrientation)interfaceOrientation{
返回(interfaceOrientation==UIInterfaceOrientationAndscapeRight);
}
-(无效)未收到记忆警告{
//如果视图没有superview,则释放该视图。
[超级记忆警告];
//释放所有未使用的缓存数据、图像等。
}
-(无效)视图卸载{
[超级视频下载];
//释放主视图的所有保留子视图。
//例如,self.myOutlet=nil;
}
-(无效)FlipIntervalented{
定时器=零;
int trackNumber=8;
NSString*旁白字符串=[NSString STRINGWITH FORMAT:@“tmbtrack%i_u%i”,[tmbHDPrefs INTEGERWORKEY:@“旁白”],轨道编号];
narPath=[[NSBundle mainBundle]路径用于资源:类型为@“caf”的叙述字符串];
[自动播放路径:narPath];
narPath=nil;
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
UITouch*touch=[[event AllTouchs]anyObject];
如果([touch view]==animationTiny){
如果([timerFloat有效]){
[timerFloat invalidate];
timerFloat=nil;
}
self.kMoveX=30.0;
fxPath=[[NSBundle mainBundle]pathForResource:@“fx5 water swoosh”类型:@“caf”];
[self-fxPlayPath:fxPath];
fxPath=nil;
timerFloat=[NSTimer scheduledTimerWithTimeInterval:kUpdateRate目标:自选择器:@selector(scrollView)userInfo:nil repeats:YES];
}
}
-(无效)滚动视图{
float oldX=self.bg.center.x-self.kMoveX;
浮动newX=oldX;
如果(oldX如果(kMoveX您实际上只加载了一次图像,但对于一个图像来说,这实际上相当大。加载后的图像在内存中保持未压缩状态。2048x768,每像素4字节=6.2MB,这可能(不确定)需要在底层渲染管道中作为GPU的纹理进行复制。这很大,但不是很大,这取决于加载的其他内容

不能保证这是你痛苦的根源,但试着不带任何图像,看看吧。:)


如果这是问题所在,请查看CATiledLayer,或者在滚动时将其分块加载。

我不确定是什么导致了崩溃,但我想让您知道磁盘上图像和声音的大小与它们使用的内存量不同。这些文件以压缩格式存储在磁盘上,但需要在内存中解压缩这样就可以播放/显示它们。150kb的jpg可能代表内存中的几MB。感谢您的快速回答。我想知道这是否是原因,因为崩溃只发生在几个连续的移动事件之后,所以我怀疑是否有内存泄漏,我可以以某种方式防止。无论如何,我将按照您的建议进行测试.