Project1
标题: 不规则位图传送/Blt增强 [打印本页]
作者: SixRC 时间: 2019-10-25 14:57
标题: 不规则位图传送/Blt增强
本帖最后由 SixRC 于 2019-10-28 17:14 编辑
更新情况在四楼 主楼不想改
不单纯blt矩形 根据mask位图的透明度blt 直接效果图吧 比较好理解
一共是两块内容
一块是 MaskBlt
一块是 BltMask
MaskBlt :
mask_blt(x,y,src,rect,mask,opc = 255)
就是多了一个 mask 这个参数可以直接是位图 也可以是等下的 BltMask 类型
这个mask的大小必须和Rect一致 或者更大 不然会炸的 一般反正就一样就行
根据这个mask各点的透明度来进行blt操作
还有一个mask_blt_reverse 参数是一样的 就是进行了 255 - 透明度的操作
这个函数 进行了多线程加持 而且基于之前我写的很多优化 效率很高
单线程情况耗时大概是原版blt的 13/11
现在一般都有多线程了 那效率就很好henhao了
BltMask :
这块基于 agg(anti grain geometry)
是对位图进行画图的类 就是画线 画多边形 圆等的 还有作一些简单坐标变换的
初始化
aa = BltMask.new(400, 400)
aa = BltMask.new(400, 400)
会新建相应大小的位图 并进行初始化
不需要时请 aa.dispose
这个类作图的逻辑是这样的
加入点 圆 弧线等 然后渲染 渲染会清空之前的点序列
我知道这样说不太好理解 我看agg的时候开始也很迷
比分画线
aa.move_to(0, 0)
aa.line_to(100, 100)
aa.draw_line
aa.move_to(0, 0)
aa.line_to(100, 100)
aa.draw_line
move_to 就是移到那里
line_to 就是画过去
draw_line 就是渲染
画个实心圆
aa.ellipse(200, 200, 100, 100)
aa.draw_poly
aa.ellipse(200, 200, 100, 100)
aa.draw_poly
复合也行
aa.move_to(0, 0)
aa.line_to(100, 100)
aa.ellipse(200,200,100,100)
aa.line_to(400,400)
aa.draw_line
aa.move_to(0, 0)
aa.line_to(100, 100)
aa.ellipse(200,200,100,100)
aa.line_to(400,400)
aa.draw_line
画好了就能当mask_blt的参数 直接传 aa 进去就行
用完了记得 aa.clear 清空位图
下面是所有方法介绍
线相关 弧圆相关 渲染相关 坐标转换 其他 线段衔接柔化
如上
一般就是 设置好mask 然后mask_blt
示例没有 自己试着玩吧
下面代码
MaskBlt BltMask
插到随便什么地方
MaskBlt.zip
(236.58 KB, 下载次数: 67)
解压到文件目录
就这样
作者: fux2 时间: 2019-10-26 10:57
相当方便了(用造好的就是舒服
作者: 喵呜喵5 时间: 2019-10-26 21:57
本帖最后由 喵呜喵5 于 2019-10-26 22:45 编辑
哇,先开个工程试试看
=======
又能鼓捣出一些新玩意儿了~
如果rect也能支持这个mask就好了……
作者: SixRC 时间: 2019-10-28 17:12
发个更新贴 以后若更新会改在这里
一是考虑到mask其实大部分像素alpha都是0 所以加了判断 牺牲微不足道的效率(~%6) 可以获得成倍的速度提升
二是毕竟牺牲了一些 所以就对其作了进一步优化
方式是手写了汇编
原先编译器优化的代码比较 诡异 和我写的思路不太一致
和它斗智斗勇半天 它还是不懂我 我累了 就直接汇编了
结果 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
耗时降低了约 42%
加上第一个修改 综合耗时看情况约是原先的 30%~60% 基本是快了一番
所以是 重 大 的 版本更新
MaskBlt_v11.zip
(39.98 KB, 下载次数: 45)
替换原来的 MaskBlt.dll 就行啦
现在基本上没啥好更新的了 冬眠了
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |