有很多关于渲染高质量图形的帖子,比如这个
High Quality Image Scaling Library
我需要使用 GDI+ 以大约 10fps 的帧速率在图形中渲染大约 6k+ 个对象(直线和椭圆)。因此,我的图形需要尽可能低质量的属性。
这是我所做的:
public static class GraphicsExtensions
{
public static void ToHighQuality(this Graphics graphics)
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
}
public static void ToLowQuality(this Graphics graphics)
{
graphics.InterpolationMode = InterpolationMode.Low;
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.SmoothingMode = SmoothingMode.HighSpeed;
graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
}
}
我是不是忘记了什么,或者这是 Graphics 属性的最佳可能极值?
我在较低模式下以 5fps(202 毫秒/图像)绘制,在较高模式下以 3fps(330 毫秒/图像)绘制。
我不觉得有什么大的不同,但我已经将我的性能问题减少到仅绘图......
一些数字:
最佳答案
GDI+ 不是高性能渲染解决方案。如果您想要更好的原始性能,请直接调用 GDI 或使用 DirectX。然而,通过稍微优化重绘通常可以实现 2 倍的加速:
你真的需要画那么多吗?如果删除了一些元素,图像仍然可以正常工作吗?
您是在创建和销毁大量钢笔和画笔,还是在重复使用一些预定义的? 您是否正在执行任何处理来构建或转换您可以在预处理步骤中执行的形状,以便在重绘期间不会不必要地重复?
你是否画了一些不必要的东西?剔除(丢弃)屏幕外的任何东西。如果发生大量过度绘制(很可能有 6000 个对象),则可以检测并丢弃完全被前面的事物遮挡的形状。
你能把多条线组合成一条多段线吗?每个函数调用都会增加开销,因此如果您可以通过单个函数调用绘制多个形状或线条,它会运行得更快。
你必须使用省略号吗?如果它们很小,您可以使用 8 或 12 边形的多边形获得更好的性能,而不会明显降低形状的质量 - 值得一试。
优化重复。如果形状是规则的(例如,您正在绘制许多相同颜色的 10 像素圆圈),则将一个绘制到位图中,然后复制副本。如果有规则图案(例如棋盘),则将它的一小部分绘制到位图中,然后将该部分复制到整个图像中。 (只需确保绘制未缩放的位图并且它们与屏幕(dpi 和 bpp)匹配,这样您就可以获得最快的 blit 类型并且不会以缓慢的双线性过滤模糊困惑结束)
如果有很多颜色变化,您是否可以将它们批处理在一起,这样您就可以先绘制所有红色的东西,然后再绘制所有蓝色的东西 - 这样可以避免在钢笔/画笔之间频繁切换。
有时您可以通过避免剪裁来获益 - 例如如果您正在绘制文本并且知道它全部可见,则可以在禁用剪裁的情况下进行绘制。 (这用于提供性能优势 - 它可能对硬件加速渲染没有帮助,但值得一试)
最后,请记住,使用硬件加速,您可能无法通过禁用某些渲染功能来获益。如果显卡能够以每秒 500 帧的速度绘制 10,000 个椭圆,但您只能看到 10 fps,那么禁用抗锯齿可能不会帮助您提高帧速率 - 瓶颈更有可能是您的代码和 GDI+ 需要很长时间告诉显卡渲染什么而不是图形渲染本身很慢。 (YMMV - 这将取决于您正在渲染的内容、GDI+ 处理它的方式、它是否是硬件加速的、图形驱动程序用它做什么以及您的显卡有多强大)
关于c# - 最快的 GDI+ 渲染设置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327240/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击