首页 > 其他分享 >10.4 提高叠加处理速度(2) (harib07d)

10.4 提高叠加处理速度(2) (harib07d)

时间:2023-03-02 17:36:29浏览次数:42  
标签:处理速度 sht harib07d bx by1 bx0 buf vx0 10.4

ps:能力有限,若有错误及纰漏欢迎指正\讨论

  • sheet_refreshsub
void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1)
{
	int h, bx, by, vx, vy, bx0, by0, bx1, by1;
	unsigned char *buf, c, *vram = ctl->vram;
	struct SHEET *sht;
	for (h = 0; h <= ctl->top; h++) {
		sht = ctl->sheets[h];
		buf = sht->buf;//sht->buf用于记录图层上所描画内容的地址(buffer)
		/* 使用vx0~vy1,对bx0~by1进行倒推 */
		bx0 = vx0 - sht->vx0;
		by0 = vy0 - sht->vy0;
		bx1 = vx1 - sht->vx0;
		by1 = vy1 - sht->vy0;
		if (bx0 < 0) { bx0 = 0; }
		if (by0 < 0) { by0 = 0; }
		if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }
		if (by1 > sht->bysize) { by1 = sht->bysize; }
		for (by = by0; by < by1; by++) {
			vy = sht->vy0 + by;
			for (bx = bx0; bx < bx1; bx++) {
				vx = sht->vx0 + bx;
				c = buf[by * sht->bxsize + bx];/*请注意本句与下下句的区别,本句用*/
				if (c != sht->col_inv) {
					vram[vy * ctl->xsize + vx] = c;
				}
			}
		}
	}
	return;
}

注意:

c = buf[by * sht->bxsize + bx];

vram[vy * ctl->xsize + vx] = c;

的区别

第一句,目的:取出该图层中所需位置上的绘图信息(画什么)理解: buf本就是sheet(图层)的属性,故用by*sht->bxsize即可,by可以理解为“相对地址(长度)”,只有与准确的坐标结合才能画出准确的图像。

第二句,目的:在屏幕上显示理解:此处要在整个屏幕上显示,故需要上句提到的 准确坐标,即vy(由相对坐标by和绝对坐标(精准)sht->vx0和sht->vy0构成)

  • 以下是某个图层在需要绘制区域外面的情况:

  • 以下是某个图层与需要绘制区域相交的情况:

注意理解这种情况,举例:黑框显示文字(需要重绘),鼠标一部分在文字上方,此时文字的重绘较为简单,但对鼠标的重绘即是简化的关键,简化方式:只重绘相交区域(阴影部分),此处以鼠标为例简化不明显,但如果是较大的画面则有更好的简化效果(只需重绘一小部分)

标签:处理速度,sht,harib07d,bx,by1,bx0,buf,vx0,10.4
From: https://www.cnblogs.com/LZHKKK/p/17172585.html

相关文章