用C#绘图实现动画出现卡屏(运行慢)问题的解决办法

原文: 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法

正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术。以为不会有什么问题了。后来当把图片全部绘制上去的时候依然出现了卡屏的问题。这个问题困扰了我将近半个月了。马上就要规定的时间了。而且又是一个五一假期。小盆友们都去玩了。自习室少有的几个人还在上着自习,而我为了解决这个问题。也渡过了苦逼的两天。大早上7:30开始一直到晚上10点多。。。好了废话不多说了。开始进入正题。

问题细节:用绘图功能实现动画显示,也就是不断变换绘制图片的位置,达到动画的效果。结果出现了卡屏问题,就是运行的特别的卡、慢。

在网上找了很多资料参考,但是没有一个系统的示例说明具体的使用过程,我把我的总结给大家说一下。

解决思路:先将图片加载到内存(因为直接从磁盘读取文件要比在内存读取文件慢的多,这是导致卡屏出现的主要原因),然后在从内存中读取出来(即把二进制流转换为Image)

解决步骤:

  

  1.先将图片放到内存中。就是以将图片以二进制流的形式加载到内存。

  /// <summary> 
        /// 图片转换成字节流 
        /// </summary> 
        /// <param name="img">要转换的Image对象</param> 
        /// <returns>转换后返回的字节流</returns> 
       
        public static byte[] ImgToByt(Image img)
        {
            MemoryStream ms = new MemoryStream();
            byte[] imagedata = null;
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            imagedata = ms.GetBuffer();
            return imagedata;
        }
        /// <summary> 
        /// 字节流转换成图片 
        /// </summary> 
        /// <param name="byt">要转换的字节流</param> 
        /// <returns>转换得到的Image对象</returns> 
        public static Image BytToImg(byte[] byt)
        {
            MemoryStream ms = new MemoryStream(byt);
            Image img = Image.FromStream(ms);
            return img;
        }

这段是参考网上的代码。

  2.然后定义一个Image类型的变量,这个变量作为我们绘图时使用:

public Image fish ;

   3.对Image类型 的变量赋值,即当我们程序加载的时候fish图片在使用的时候就不是在磁盘取得了,这样速度要快的多。

fish = BytToImg(ImgToByt(Image.FromFile("../../image/down.png")));

  3.然后在使用fish进行绘图。

g1.DrawImage(fish, 0,0);

这样在改变fish位置绘图,就不会出现卡屏现象了。

如果用下面的方法绘图:

g1.DrawImage(Image.FromFile("../../image/down.png"), 0,0);

就是每次都从磁盘读取图片,速度慢,所以会出现卡屏现象。

希望对大家有帮助,也希望大家提出更好的解决办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#运行Python脚本来实现解锁进入系统的功能,这是一个复杂的任务,因为它涉及到与操作系统交互。一种常见的方法是使用`System.Diagnostics.Process`类来启动一个进程,该进程运行一个Python脚本,该脚本负责解锁屏幕。 首先,你需要编写一个Python脚本,用于解锁屏幕。这可以通过使用第三方库来实现,如`pyautogui`或`pynput`。以下是一个使用`pyautogui`库的示例脚本: ```python import pyautogui def unlock_screen(): # 在这里编写解锁屏幕的逻辑 # 例如,可以使用pyautogui模拟按键或鼠标操作来解锁屏幕 pass if __name__ == "__main__": unlock_screen() ``` 在上述示例中,你可以使用`pyautogui`库中的函数来模拟按键或鼠标操作,以解锁屏幕。你需要根据你的系统和环境进行适当的调整。 然后,在C#中,你可以使用`Process.Start()`方法来运行Python脚本。以下是一个示例: ```csharp using System; using System.Diagnostics; class Program { static void Main() { // 设置Python解释器路径和脚本文件路径 string pythonPath = "python.exe"; string scriptPath = "path/to/your/script.py"; // 创建进程对象并设置启动信息 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = pythonPath; startInfo.Arguments = scriptPath; // 启动进程并等待完成 using (Process process = Process.Start(startInfo)) { process.WaitForExit(); } Console.WriteLine("Python脚本执行完成!"); } } ``` 在上述示例中,你需要将`pythonPath`设置为你的Python解释器的路径,并将`scriptPath`设置为你的解锁屏幕脚本的路径。然后,使用`Process.Start()`方法启动Python解释器,并传递脚本路径作为参数。最后,等待进程执行完毕并显示完成消息。 请注意,解锁屏幕通常涉及到操作系统的安全机制,因此在运行这样的功能时需要小心谨慎,并确保你有权限进行这样的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值