19,498
社区成员
发帖
与我相关
我的任务
分享
case 32:
*(unsigned long *)dst.Ptr = (unsigned long)src.Value;
把24 bit 的当做32 bit 就可以一次传输过去。嘿嘿,好办法!
源码GPE EmulatedBlt_Internal()函数中可以找到):
while( height-- )
{
for( x=0; x<width; x++ )
{
src.Value = ( *src.Ptr ) + ( *(src.Ptr+1) << 8 ) + ( *(src.Ptr+2) << 16 );
src.Ptr += src.BytesPerAccess;
if( pParms->pConvert )
{
src.Value= Parms->pColorConverter->*(pParms->pConvert))( src.Value );
}
if( quickWrite )
{
switch(dst.Bpp) {
case 8:
*(unsigned char *)dst.Ptr = (unsigned char)src.Value;
break;
case 16:
*(unsigned short *)dst.Ptr = (unsigned short)src.Value; break;
case 32:
*(unsigned long *)dst.Ptr = (unsigned long)src.Value;
break;
case 24:
*dst.Ptr = (unsigned char)(src.Value);
*(dst.Ptr+1) = (unsigned char)(src.Value>>8);
*(dst.Ptr+2) = (unsigned char)(src.Value>>16);
}
dst.Ptr += dst.BytesPerAccess;
}
}
}
}
还有下面两个人的总结也非常有用
在EmulatedBlt_Internal()函数中加个Sleep(1000)的话,挺有意思,可以很清楚得看出WIN是如何显示界面的,包括像关闭的那个"X",是一个点一个点出来的),视频就不清楚了。
解决显示慢的问题,保证图片颜色深度和屏实际的一致,否则系统会做转换,这肯定是慢的,我们6410的CPU都是一样。
解决显示时间不一致的问题,双缓冲,用GDI来做就是,先把所有内容绘制到内存DC,在一次性从内存DC拷贝到屏幕DC,这样的效果就是同时显示出来的。
本人就是遵循这2点,所以我做的每个界面,显示速度很快,基本上是一瞬间就出来,而且是同时显示,不会局部不一致,闪烁什么的