热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

关于c:最佳绘图方法

Best Drawing approach我在 wxWidgets 中开发了一个应用程序,我在其中使用位图进行绘图。所以当我的应用程序第一次启动时,它会从文件中


Best Drawing approach


我在 wxWidgets 中开发了一个应用程序,我在其中使用位图进行绘图。所以当我的应用程序第一次启动时,它会从文件中读取坐标并相应地画线。该应用程序还从网络接收UDP数据包,UDP数据包还包含一些必须在屏幕上绘制的xy坐标信息,所以当接收到数据包时我重新绘制位图图像,并显示在屏幕上,我还需要刷新位图在鼠标移动事件上,因为在鼠标移动时,我必须在屏幕上绘制一些新的绘图。

所有这些都会增加运营成本并减慢我的 GUI。因此,请向我建议一些您认为在这种情况下可能有效的替代绘图方法。

我在谷歌上搜索并得到了OpenGL的选项,但由于时间紧迫我不想使用openGL,因为我没有任何OpenGL的经验。



相关讨论




  • 你有 1337 分。我不喜欢那样。赞成:P


  • 你不能在内存中保存一个位图实例,只向它绘制新信息,而不重绘整个东西吗?并将位图拉伸到屏幕...


  • @freerider,我正在绘制一些关于内存的特定信息,但是当我必须从位图中删除现有线条并绘制新线条时,在这种情况下我必须重新绘制整个位图。


  • @Siddiqui 你不能做一个位图缓存,其中包含多个时间点的线条图像。然后你只需要组合几个位图(只要使用 XOR,如果背景是白色的)并将剩余的线绘制到结果。


  • @freerider,假设我有一个主位图(GUI的背景)和一个与主位图异或的多边形,现在从网络接收到一个数据包,该数据包已经更新了多边形的坐标,那么如何在没有更新多边形的情况下更新多边形重绘主位图?


  • @Siddiqui 保存第一个多边形坐标,绘制多边形。获取更新后的坐标时,仅擦除位图中的第一个多边形,重新绘制新的多边形。换句话说:删除并仅绘制图像的所需部分......


  • @freerider,一旦我用主位图对多边形进行异或运算,我该如何擦除它?


  • @Siddiqui 将颜色设置为多边形所在的背景。


  • @freerider,它的彩色背景图像(不同的元素有不同的颜色表示)。


  • >一旦我用主位图对多边形进行异或运算,我该如何擦除它?再次异或! (让我感到困惑的是它在第一个 XOR 之后的样子,因为它是彩色的......)


  • 让我直截了当地说:你有一个必须用鼠标绘制或从网络获取的形状填充的位图。一段时间后,必须重新绘制许多形状,这会使 GUI 陷入困境。您可以通过计算哪些形状不会改变并将它们绘制到第二个位图来优化,该位图用作新形状的新绘制的开始缓冲区?


  • @freerider,感谢您的宝贵建议。当然,这种方法会以某种方式有效,但是您能否建议我更多其他方法来更有效地实现这一目标?


  • 只是游戏编程的一些基本经验法则:最大化数据的直通输出,搜索可以一次绘制多个形状的绘图函数。最小化运行时的计算:如果您可以为已绘制的形状提供多个缓存,请使用它。网上有很多有用的游戏开发教程。最后:使用另一个可以处理硬件加速并具有更好性能的 API。






听起来好像您的问题是您的 GUI 对用户输入没有响应,因为应用程序正忙于重绘显示。这类问题有几个通用解决方案。

  • 使用工作线程在内存中绘制位图。在此过程中,主线程可以继续与用户交互。重新绘制位图后,工作线程向主线程发出信号,然后主线程将完成的位图复制到屏幕上 - 这非常快。


  • 使用主线程将位图直接绘制到屏幕上,但在绘制代码中调用 wxApp::Yield()。这将允许 GUI 在漫长的绘图过程中保持对用户的响应。

  • 选项 1 是"最好的",尤其是在多核机器上运行时,但要保持两个线程同步并防止它们之间的争用是一个挑战,除非您在多线程设计方面有丰富的经验。选项 2 更简单,但您仍需注意用户交互不会在第一个绘图过程完成之前开始另一个绘图过程。



    相关讨论




    • 这不会改变任何东西,"绘制记忆"是没有意义的(否则你会在哪里绘制?)。使用 2 个线程,一个用于绘图,一个用于执行代码并不是一个坏主意,但您必须将这两个线程连接在一起(即绘图时不计算,计算时不绘图,这意味着低收益)。 OP 想要一个简单(或不太复杂)的解决方案来解决他的问题,解决方案是"不要每帧更新 GUI,因为这需要时间"。喜欢与否:-)






    保存要绘制的数据,而不是总是刷新位图,并让主循环不时刷新位图。

    这样您就可以让程序永不停机。不利的一面当然是反应性会降低(即当数据到来时,它不会在屏幕上再显示 20 毫秒而不是立即显示)。






    推荐阅读
    • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
    • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
    • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
    • Nginx使用AWStats日志分析的步骤及注意事项
      本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
    • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
    • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
    • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
    • Java中包装类的设计原因以及操作方法
      本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
    • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
    • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
    • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
    • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
      本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
    • 单页面应用 VS 多页面应用的区别和适用场景
      本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
    • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
      本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
    • 一次上线事故,30岁+的程序员踩坑经验之谈
      本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
    author-avatar
    他乡绿树_762
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有