这两天,偶然翻到一个Tanner Helland调整亮度的代码,他认为最快的“数据流”方式,其实就是这边直接写内存的双缓存方式。
但是试了一下,使用滚动条对亮度实时调整,非常丝滑,明显比我的快。
把我代码里其它杂七杂八的东西去掉,快了不少,虽然也可以快速调整亮度,但总是有一点丢帧的感觉。
他用的类,一维数组。
我用的模块,三维数组。
我怀疑三维数组做亮度处理时不是顺序读写,改为一维数组,还是不行。
难道模块不如类快?
偶然给Picture加上refresh方法,一下子顺畅起来了,完全没有了卡顿。换回三维数组也丝滑。
不加refresh,关掉Autoredraw也会很顺畅。
就是下面几行代码的组合,都能实现功能,却有不小的差别。
Picture1.Autoredraw = False
Set Picture1.Picture = Nothing
SetDIBitsToDevice Picture1.hdc, 0, 0, lWid, lHei, 0, 0, 0, lHei, bStm(0), bi24BitInfo, 0
'Picture1.Picture = Picture1.Image
'Picture1.Refresh
但是,Tanner Helland的代码,去掉Refresh,还是很丝滑。
我的不加还是卡。直到我又加了一条:
DoEvents
。。。原来,不是写内存太慢了,是太快了,没给系统留出来处理时间。
小坑,研究了两天,共享一下。
但是试了一下,使用滚动条对亮度实时调整,非常丝滑,明显比我的快。
把我代码里其它杂七杂八的东西去掉,快了不少,虽然也可以快速调整亮度,但总是有一点丢帧的感觉。
他用的类,一维数组。
我用的模块,三维数组。
我怀疑三维数组做亮度处理时不是顺序读写,改为一维数组,还是不行。
难道模块不如类快?
偶然给Picture加上refresh方法,一下子顺畅起来了,完全没有了卡顿。换回三维数组也丝滑。
不加refresh,关掉Autoredraw也会很顺畅。
就是下面几行代码的组合,都能实现功能,却有不小的差别。
Picture1.Autoredraw = False
Set Picture1.Picture = Nothing
SetDIBitsToDevice Picture1.hdc, 0, 0, lWid, lHei, 0, 0, 0, lHei, bStm(0), bi24BitInfo, 0
'Picture1.Picture = Picture1.Image
'Picture1.Refresh
但是,Tanner Helland的代码,去掉Refresh,还是很丝滑。
我的不加还是卡。直到我又加了一条:
DoEvents
。。。原来,不是写内存太慢了,是太快了,没给系统留出来处理时间。
小坑,研究了两天,共享一下。