Iphone 石英2d图纸:在模拟器上完美/在设备上糟糕。分发与调试

Iphone 石英2d图纸:在模拟器上完美/在设备上糟糕。分发与调试,iphone,quartz-graphics,Iphone,Quartz Graphics,我刚刚完成了应用程序的波形绘制代码。我对它很满意,在模拟器上看起来很棒 我的问题是,当我在ipad上运行它时,它不能正常绘制。在模拟器上,图形看起来像一个很好的规则波形图形,而在ipad上,波形看起来就像一个大矩形 我很不确定我怎么能开始解决这样的问题 你能提供一些建议来解释为什么它是在模拟器上工作的&而不是在ipad上 如果我可以提交更多可能有帮助的信息,请让我知道 计算 -(void) plotwaveform:(AudioSourceOBJ )source { int count

我刚刚完成了应用程序的波形绘制代码。我对它很满意,在模拟器上看起来很棒

我的问题是,当我在ipad上运行它时,它不能正常绘制。在模拟器上,图形看起来像一个很好的规则波形图形,而在ipad上,波形看起来就像一个大矩形

我很不确定我怎么能开始解决这样的问题

你能提供一些建议来解释为什么它是在模拟器上工作的&而不是在ipad上

如果我可以提交更多可能有帮助的信息,请让我知道

计算

-(void) plotwaveform:(AudioSourceOBJ )source
{

    int count =source->framecount;
    int blocksize= count/resolution;
    currentmaxvalue=0;


    int readindex=0;
    CGRect *addrects= malloc(resolution * sizeof(CGRect));
    float *heights=malloc(resolution * sizeof(float));

    for (int i=0; i<resolution;i++) {

        AudioUnitSampleType *blockofaudio;
        blockofaudio =malloc(blocksize * sizeof(AudioUnitSampleType));

        memcpy(blockofaudio, &source->leftoutput[readindex],(blocksize * sizeof(AudioUnitSampleType)));

        float sample= [self getRMS:blockofaudio blocksize:blocksize];
        heights[i]=sample;
        readindex+=blocksize;

    }

    for (int scale=0; scale<resolution; scale++) {


        float h= heights[scale];

        h= (h/currentmaxvalue)* 45;
        addrects[scale]=CGRectMake(scale, 0, 1, h);


    }



    if (waveform) {

        [waveform release];

        [waveform removeFromSuperview];
        waveform=nil;
    }



    CGMutablePathRef halfpath=CGPathCreateMutable();
    CGPathAddRects(halfpath, NULL, addrects, resolution);



    CGMutablePathRef path= CGPathCreateMutable();


   CGAffineTransform xf = CGAffineTransformIdentity;
    xf= CGAffineTransformTranslate(xf, 0.0,45);


    CGPathAddPath(path,&xf, halfpath);


    xf= CGAffineTransformIdentity;
    xf= CGAffineTransformTranslate(xf, 0.0, 45);
    xf=CGAffineTransformScale(xf, 1.0, -1);

    CGPathAddPath(path, &xf, halfpath);


    CGPathRelease(halfpath);

    free(addrects);
    waveform = [[Waveform alloc] initWithFrameAndPlotdata:CGRectMake(0, 0, 400,90) thepoints:path];
    [self.view addSubview:waveform];



}

-(float ) getRMS:(AudioUnitSampleType *)blockofaudio blocksize:(int)blocksize


{

    float output;
    float sqsummed;
    float sqrootofsum;
    float val;

    for (int i=0;i<blocksize; i++) {
        val= blockofaudio[i];
        sqsummed+= val* val;

    }

    sqrootofsum=sqsummed / blocksize;

    output = sqrt(sqrootofsum);

    // find the max
    if(output> currentmaxvalue)
    {
        currentmaxvalue=output;
    }
    return output;

}
描述编辑

我将一组音频数据传递给plotwaveform函数,并将其分成块。对于每个音频块,我计算每个块的RMS,并跟踪最大值。当所有这些都完成后,我使用最大值缩放rms值以适合我的视图端口

我注意到一件奇怪的事情。如果我在getRMS函数中记录“output”变量的值,则波形在设备上绘制得很好。如果我不记录波形不能正确绘制的值


这对我来说很奇怪。

我看到的一个主要错误是,在
getRMS:blocksize:
方法中从未初始化
sqsummed
,因此它的初始值是垃圾。垃圾是什么取决于周围代码的细节,编译器如何为变量分配寄存器,等等。添加NSLog语句很可能会改变下一次循环中的垃圾


如果垃圾总是与一个非常小的浮点值相对应,您将得到预期的行为,而如果垃圾总是与某个非常大的浮点值相对应(大到足以淹没实际样本),您将得到一个大矩形,而如果垃圾恰好变化,您将得到类似噪声的输出。

在任何情况下,请记住,模拟器有您的整个mac ram和cpu电源可供使用。令人遗憾的是,iphone/ipad模拟器没有模拟进程容量。

你能发布一些示例代码吗?你能把代码简化一点吗?有很多代码与绘图没有直接关系,这使得它很难理解。添加了代码摘要说明。还有一个奇怪的观察结果是,我也有这个确切的问题,我一辈子都无法解决它。这幅画在模拟器中100%的效果很好,但在iPad上显示为拉格线/锯齿线。@AlexFZ:我正在寻找解决方案。如果我发现有用的东西,我会发回这里这是一个有趣的观察。早上,我将尝试将变量初始化为0并返回报告。我注意到我的应用程序的其他部分在归档并构建到ipa进行临时测试时也不起作用。这可能是一个相关的问题。在调试版本和发布版本的编译方式之间存在着一些明显的关键区别,我对此一无所知,因为当我在插入设备的情况下点击run按钮时,它工作得很好。。。。。只是不是为了分发而构建的。
- (void)drawRect:(CGRect)rect
{

    CGContextRef ctx= UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(ctx, 0, 0, 0, .5);
    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, mutatablepath);
    //CGContextStrokePath(ctx);
    CGContextFillPath(ctx);
    CFRelease(mutatablepath);

}