生活就是这么狗血——WPF粒子小记
今天看到了一篇博客,不应该说昨天,作者用了HTML5去实现,老实说本来不想凑热闹,可看了有位兄弟sandcu用SL实现了遍,不过感觉速度并不理想,想来这种粒子效果自己还未用WPF实现过,顺便看看WPF到底性能如何,随着手痒了下面的悲剧也发生了。
1.因为闲的慌,我看了Flash的效果比较好,于是直接拿了Flash的代码来改,结果浪费了N多时间在上面,Flash的Random是从0到1的小数C#里的是整数的,开始效果就是达不,到后来报错才知道,郁闷了半天。
2. 我是用WriteableBitmap这个类来实现坐标点颜色的写入,可老是说我数组越界,弄了半天才知道是row和colum和x,y坐标的关系弄错了,应该是row = y,x = colum.
3.想FPS检测更准确,于是把ETW Event Tracing in WPF中的东西直接抄过来,结果发现他在UAC状态下一定要管理员启动不说,在我的项目里面还不能用,只能自己山寨。
4.花我最长时间最后也没搞定的,我图像的背景不得不是黑色的,为什么?因为我不知道怎么换成其他的,就算是我把背景画了一遍可还是有黑色东西来干扰(见图一),似乎没有clear(color)类似这样基本的函数调用,总之我是没找到怎么设置背景色;上一次的东西也无法清除,我搞不懂为什么会变成黑色。SL倒是查到有篇可以清理,按照这种情况看可能SL的运行效率比WPF还要好?WPF团队早就在“淫光”中那乐不思蜀了。http://nokola.com/blog/post/2009/11/11/Best-Way-To-Clear-WriteableBitmap.aspx
5.除了精神上摧残外,肉体也让我受不了,房间内有嗡嗡的吵杂声让我几经崩溃,也找不到声音来源,怀疑是隔壁或是外面马路上的施工,忙了半天连澡都没戏。
小结:
虽然我坚信成功来源于坚持,可还是需要良道吉日的,感觉很费,早上还要上班,我的天啊。算了睡前安慰下,WPF的呈现速度还过的去,中间滚轮支持定点放大缩小,没怎么做用的是默认的,右键可以返回到原来的样子,其他的就是左键点住拖拖试试了。
附件下载:希望好心人能帮我解决下背景问题
______________________
后记:(原来附件还是有问题未修改)
感谢各位的支持,特别是地狱门神和Clingingboy。
1.确实如地狱门神所说,背景问题是由于我的Long类型超出界限,影响到其他的格子所致。修改如下既可
byte* pBackBuffer = (byte*)_writeableBitmap.BackBuffer;
// Find the address of the pixel to draw.
pBackBuffer += row * _writeableBitmap.BackBufferStride;
pBackBuffer += column * 4;
pBackBuffer[0] = color.B;
pBackBuffer[1] = color.G;
pBackBuffer[2] = color.R;
pBackBuffer[3] = color.A;
就是把_writeableBitmap.BackBuffer当成byte*来扫描,应该说是位图中的基本操作了,惭愧惭愧。
2.Clingingboy给我另一种思路,也可以说是换了另外一套API来实现,感觉比用指针操作还快而且还不需要把项目设成unsafe编译,这API应该可以用于SL。
这种方法是使用WritePixels这个方法来实现。我把他给我项目又修改了下,完全用这个方法还省却了自己的锁定和表示更新操作。
当然你也可以用两种方法一起来在操作,这样的话背景是图画也是可以的,如把图片的点保存为一个数组,WritePixels每次用这个数组当背景刷新,用指针操作来抒写Water点。
当然我这份是最简单的谁让我这么懒呢。