Bitmap.SetPixel(x,y, Color) 太慢了。

4

目前,我正在创建一个1000x1000的位图,仅调用Bitmap.SetPixel()函数就需要大约0.3秒。

实际上,我可能只绘制了50%的像素,因此实际上只有500,000个setpixel调用。虽然这些调用似乎很多,但是相比于视频游戏而言,其处理更多像素(有些是程序生成)。

显然,Bitmap.SetPixel没有针对速度进行优化,但如果我需要每秒更新20-30次位图以获得良好的动画效果,则这种方式过于缓慢,那么我的选择是什么呢?


我会使用您自己的缓冲区,然后将其“blit”到位图上。很抱歉,我实际上不知道代码解决方案,但我不会在每个像素上使用SetPixel,而是会写入我的自己的缓冲区(或获取对其缓冲区的访问权限)。 - Nick Bedford
4个回答

6

Bob Powell在访问像素映射时有一篇非常好的教程,可以直接在内存中访问。


这对我也有帮助。关键是使用Bitmap.LockBits,Bitmap.UnlockBits。 - Corey Trager
那个链接是不推荐的恶意软件和垃圾邮件网站! - sergiol
完成:Web档案以取代恶意软件网站。 - sergiol

3

FastPixel?:http://www.codeproject.com/KB/GDI-plus/FastPixel.aspx

FastPixel?是一个高效的图像处理库,可以快速读取、修改和写入图像像素。它支持多种图像格式,并提供了简单易用的API接口,方便开发人员在IT技术领域中使用。


1
我可以推荐FastBitmap
FastBitmap fb = new FastBitmap(b);
fb.LockImage();

...

fb.SetPixel(x, y, Color.Red);

...

fb.UnlockImage();

1
现代大型视频游戏在硬件后台完成所有像素设置;它们为硬件提供几何缓冲区,高度并行化的硬件完成所有数学计算。OpenGL和DirectX是用于与硬件通信的API。
请搜索gamedev.net以获取一些教程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接