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