GDI+ 性能技巧 [关闭]

2024-04-30

有谁知道有任何可靠的(并且希望是广泛的)书籍/网站讨论 GDI+ 性能(超出显而易见的范围)?

例如,我最近遇到这个出色的实验 http://www.gamedev.net/community/forums/topic.asp?topic_id=467752。我最近也注意到Graphics.FillPath()Graphics.DrawPath()。我很想知道我还缺少哪些其他重要信息。

善意, 大卫


嗯。如果您需要绘制路径的轮廓,那么知道 FillPath 比 DrawPath 更快并没有什么好处!

优化 GDI+ 的最佳方法与优化任何其他代码完全相同:首先,不要优化它。反而:

  • 首先编写它,让它简单地工作,然后确定它是否真的太慢。
  • Then examine your "algorithm":
    • 简化你正在绘制的内容(减少你正在绘制的东西的数量),它会变得更快(并且在大多数情况下,由于减少了混乱,看起来会更好)。
    • 您是否每次都绘制整个显示,或者是否使用剪辑矩形来避免绘制不需要更新的图像部分?
    • 检查你如何画东西。您是否为每次重画创建和销毁资源(例如画笔和钢笔)?将它们缓存在成员变量中。您是否多次过度绘制同一像素? (例如,绘制背景,然后在顶部绘制位图,然后在其顶部绘制一个矩形 - 也许您可以避免其中一些重绘)。当只用 10 条线段看起来就足够好的时候,您是否使用 100 条多边形线段来绘制一条曲线?当窗口滚动时,您是否让操作系统移动现有图像,以便您只需要重新绘制新暴露的条带,还是浪费时间重新绘制整个窗口?
    • 您是否正在使用变换或是否在代码中进行冗长的定位计算?
    • 检查所有循环并确保从其中移出尽可能多的代码 - 预先计算在循环中使用的值等。确保循环尽可能以 CPU 缓存友好的方向/方式迭代数据。
    • 重绘期间您正在处理的数据中是否有任何内容?也许其中一些可以预先计算或以更渲染优化的形式组织。例如使用不同类型的列表会更快地枚举数据吗?您是否正在处理 1000 个数据项以找到需要绘制的 10 个数据项?
    • 你能用不同的方法获得相同的外观吗?例如您可以通过黑白交替绘制 64 个方格来绘制棋盘。先绘制 32 个黑色方块,然后绘制 32 个白色方块可能会更快,这样就可以避免矩形之间的状态变化。但实际上您可以使用白色背景清晰、4 个黑色矩形和 4 个 XOR 矩形(8 个矩形而不是 64 => 更快的算法)来绘制它。
  • 图像中是否有不经常变化的部分?尝试将它们缓存在屏幕外位图中,以最大程度地减少每次重绘所需“重建”的数量。请记住,您仍然可以渲染离屏位图,然后在其上分层图形基元,因此您可能会发现比您意识到的更多的“静态”图像区域。
  • 您正在渲染位图图像吗?尝试将它们转换为屏幕的像素格式并以“本机”形式缓存它们,而不是让 GDI+ 在每次绘制它们时都进行转换。
  • 如果您愿意以较低质量换取更快渲染速度,请调低质量设置

完成所有这些操作后,您就可以开始寻找有关优化渲染的书籍。当然,如果还是太慢的话。运行分析器以找出渲染的哪些部分最慢。

在您认为可能会有所收获的地方,尝试不同的渲染方式(例如,Graphics.Clear() 可能比用 FillRectangle() 填充背景快得多),或不同的渲染顺序(绘制所有的东西)首先绘制一种颜色,以防状态更改花费您的时间 - 对于现代显卡,批处理操作通常非常重要。绘制多个多边形的单个调用通常比进行多个单多边形调用更快,因此您可以将所有多边形累积到延迟渲染缓冲区,然后在渲染过程结束时将它们全部提交?)

之后,您可能需要考虑使用 GDI 或 DirectX 来更接近硬件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDI+ 性能技巧 [关闭] 的相关文章

  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • NuGet:包含 .pdb 文件并排除“Content”文件夹

    我已将以下行合并到 CI 构建中在每个构建上创建一个私有 NuGet 包 nuget pack C Projects Test Test vbproj OutputDirectory nas1 NuGet The 读取AssemblyInf
  • 防止重入并确保某些操作获取锁的正确方法是什么?

    我正在设计一个基类 当继承该基类时 它将针对多线程环境中的上下文提供业务功能 每个实例可能都有长时间运行的初始化操作 所以我想让这些对象可重用 为此 我需要能够 为这些对象之一分配上下文以允许其完成工作 防止对象在已有上下文的情况下被分配新
  • 当操作系统显示语言为非英语时获取本地时区标识符

    奇怪的是 TimeZone CurrentTimeZone StandardName根据计算机显示语言返回本地化名称 我想要一个可以提供给的程序化标识符TimeZoneInfo在下面的代码中 TimeZoneInfo timeZoneInf
  • Winforms 中的 WPF ElementHost 最大化时崩溃 (Windows)

    我正在尝试将新的 WPF 控件集成到现有的 WinForms 应用程序中 并使用 ElementHost Dock Fill 来托管以下 XAML UserControl NET 4 当我将 WinForm 设置为最大化时 我的整个操作系统
  • 如何有效确保小数值至少有 N 位小数

    我想在进行算术运算之前有效地确保十进制值至少有 N 个位置 在下面的示例中 3 显然我可以格式化 0 000 然后解析 但它的效率相对较低 我正在寻找一种避免与字符串转换的解决方案 我尝试过以下解决方案 decimal d 1 23M d
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • 在 JsonConverter 中递归调用 JsonSerializer

    我正在写一个JsonConverter要执行一些我需要在读 写时完成的转换任务 特别是 我采用现有的序列化行为 并在写入 读取时添加一些附加属性 在 的里面JsonConverter 我想利用通过的JsonSerializer实例来执行大部
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐