memory - 为背景图像设置动画时 iPad 崩溃

标签 memory animation ipad crash png

我创建了一个带有 png 图像和长 jpg 背景的 View Controller (它的宽度是 iPad 宽度的两倍 - 2048px)。移动 png 图像使背景图像以无缝方式向左移动。请参阅此图像以获取说明性引用:

image

在 iPad 上玩它时,只要我一个接一个地移动它超过 3-4 次,它就会崩溃。
有谁知道这些崩溃的原因是什么?我尝试检查内存泄漏,但我不确定它是否真的没有内存泄漏,但找不到。调试器发出内存过载警告,但我不认为那里有这么多消耗内存的 Assets 。有一个 2048X768 px(约 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

tnx 提前,
乌里

最佳答案

您实际上只加载了一次图像,但这对于图像来说实际上相当大。加载后的图像在内存中保持未压缩。 2048x768,每像素 4 字节 = 6.2MB,可能(不确定)需要在底层渲染管道中复制为 GPU 的纹理。这很大,但不是愚蠢的巨大,这取决于您要加载的其他内容。

不能保证这是您的麻烦的根源,但请在没有图像的情况下尝试并查看。 :)

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

关于memory - 为背景图像设置动画时 iPad 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161980/

相关文章:

使用 iPhone SDK beta 5 提交 iPad 应用程序被拒绝

c++ - 当字节顺序很重要时 - 强制转换操作

C 数组表达式

javascript - 在 promise 履行后触发 $ngAnimate enter

javascript - 在 D3.js 中触发 css 动画作为过渡

ios - 如何查找不同iOS设备(非OS版本)上的用户百分比?

memory - CL_OUT_OF_RESOURCES 用于 1GB VRAM 的 200 万个 float ?

python 在磁盘上存储实时变量

css - 使用 transition-duration 使动画淡出

ios - 如何检查 NSMutableDictionary 中的 UIImageView 是否与同一 NSMutableDictionary 中的另一个 UIImageView 相交?