这两天遇到一个非常郁闷的问题,好不容易把debug版本调试通类,功能也多实现类,编译成release版本,居然有的文件无法打开,有的图像显示的颜色不正确,按照正常的思路,是预debug宏定义相关,可是Rester.cpp检查了好几遍,没有定义debug宏,我把其他的文件编译成Release版,这个文件编译成Debug版,就没有问题,没有办法,只能找到绘图的这部分操作,修改相关的颜色赋值,看图像的变化,来确定出问题的部分
费了半天劲,终于找到问题的所在,代码如下
((RGBIL*)pix)->c0 = (((RGBIL*)pix)->c0 >> antiShift) & 0x00FF00FFL;
((RGBIL*)pix)->c1 = (((RGBIL*)pix)->c1 >> antiShift) & 0x00FF00FFL;
其中 RGBIL定义如下
typedef struct _XRGBIL {
U32 c0;
U32 c1;
}RGBIL;
这种方法一次操作32位的数据赋值,在debug版本下没有问题,但Release版本就出现错误
修改为
pix->blue = (pix->blue >>antiShift)& 0xFF;
pix->green = (pix->green >>antiShift)& 0xFF;
pix->red = (pix->red >>antiShift)& 0xFF;
pix->alpha = (pix->alpha >>antiShift)& 0xFF;
pix类型如下:
typedef struct _XRGBI {
U16 blue;
U16 green;
U16 red;
U16 alpha;
}RGBI;
这样的操作,就没有问题了。
下面也是出问题的地方,直接赋值就是有问题,只能改为一个字节一个字节的赋值
#if defined(__ANDROID__)
char * t1 = (char*)(script+pos);
char * t2 = (char*)&data;
for (int i = 0; i < 4; i++)
{
*(t2 + i) = *(t1 + i + 4);
}
for (int i = 0; i < 4; i++)
{
*(t2 + i + 4) = *(t1 + i);
}
#else
XU32*p=(XU32*)&data;
XU32*ps=(XU32*)(script+pos);
p[0]=ps[1];
p[1]=ps[0];
#endif
真不知道gcc是怎么做的,到底做了那些优化