c# - OnPaint 事件很慢并抛出“阴影”
问题描述
我目前正在尝试使用 OnPaint 事件在我的 WinForms 上绘制一些精灵。我之前使用了一个图片框,它可以工作,但是因为我无法处理多个图片框的重叠,所以我切换到了 OnPaint 事件。我环顾互联网,但找不到我的问题的答案。
我拥有的所有精灵都是我项目中的嵌入式资源。我将它们放在“图像”类型的列表中,并在按下某个按钮(KeyEvent)时循环它们。
我有一个看起来像这样的 Timer_Tick 事件:
private void Timer_Tick(object sender, EventArgs e)
{
Invalidate();
}
我的 OnPaint 方法是这样的:
protected override void OnPaint(PaintEventArgs e)
{
DoubleBuffered = true;
if (SPRITE_POS == 0)
DrawSprite(spriteList[SPRITE_POS]);
if (SPRITE_POS != spriteList.Count - 1)
SPRITE_POS++;
}
和 DrawSprite 方法:
private void DrawSprite(Image img)
{
Bitmap bitmap = new Bitmap(img);
bitmap.SetResolution(60, 60);
PEA.Graphics.DrawImage(bitmap, P1_X, P1_Y);
}
出于某种原因,我得到了快速按键的结果(使用来自 MK 的 Sub-Zero 的图像进行了尝试):
如果没有双缓冲,它会闪烁。使用双缓冲,我在上面得到了这个结果。它抛出“阴影”。是否可以轻松避免这种情况?当新的精灵已经绘制在表单上时,最后一个精灵仍然会显示片刻。
太感谢了!
解决方案
推荐阅读
- r - R:找到值> 0并检查数据帧中两个连续值的总和?
- eigen - 自定义标量类型的两个动态大小的特征矩阵之间的乘积
- bash - 这个 bash 参数扩展语法是什么意思?
- sql - SQL - 当转换和替换已经使用时,修剪并只保留字符串中的最后一个单词
- bash - 搜索第一个模式并搜索第二个模式,然后在第二个模式上方插入新行
- php - 为什么数组键值设置在数组末尾而不是特定位置?
- ruby-on-rails - 我的 Fail2Ban 过滤器似乎不起作用
- java - 当我在 Intellij IDEA 中更新文件时如何重新运行 kotlin 项目
- c# - 仅在使用 JOIN 时出现错误“CHARACTER SET ISO8859_1 is not installed”
- ruby-on-rails - 如何只显示一次记录?