- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个所有者绘制的控件,在快速重绘(例如对象拖动、调整大小和绘制选择器正方形)期间,性能是一个问题。我注意到其他几个应用程序,包括 Picasa,会在快速重绘场景中暂时绘制质量降低的图像,然后更新图像当用户界面“稳定下来”时,一个更高质量的版本。
当进行多次快速重绘时,我应该如何(我可以吗?)生成质量较低的图像进行绘制?是否有其他类似的策略我可以用来提高性能(或假提高性能。)
额外信息:
这是一个类似表单设计器的应用程序,大量使用所有者绘图。它运行良好,但当需要将超过三或四个图像绘制到客户区的矩形中时,它开始陷入困境。 (允许最终用户创建不同类型的元素,其中图像对绘图的影响最大。)
我正在使用 DrawImageUnscaled GDI+ 方法绘制图像,这应该比 DrawImage 更有效,但性能分析显示 DrawImageUnscaled 仍然是瓶颈。我认为我唯一的办法就是想出一些聪明的方法来减少画画。
附言与此问题相关的先前问题为我赢得了 Tumbleweed 徽章,因此我采用另一种方法:How to increase performance over GDI's DrawImage(Unscaled)?
câu trả lời hay nhất
等等 - 您错过了这里的一 block 低垂的果实。在调整大小操作期间,这些可能根本没有真正重绘图像。他们可能正在使用 StretchBlt 调整视频 ram 中现有图像的大小 - 视频驱动程序/硬件可以将其优化为非常非常快,比您“重新绘制质量降低的图像”更快。
策略:
-image 对象有 Last Position/Size (rect) 的成员变量
-重新绘制图像对象绘制全质量
-重绘图像更新最后位置
- 在拖动过程中,执行此操作:
* StrechBlt 从上一个位置/大小到当前位置/大小
* 更新最后位置/大小
* 如果超过几秒。绘图,和/或自上次鼠标移动后>.2s,调用重绘(不仅仅是无效 - 你现在想要它)以获得新的全质量图像。如果您检测到其他对象的重叠(也会得到 StrechBlt),也可以这样做
我在执行类似操作的应用程序中使用的示例代码(类似放大的效果,可以调整可能包含 100 个对象的窗口的大小 - 看起来像 ipad 演示只是更流畅):
Declare Function StretchBlt Lib "gdi32.dll" _
(ByVal hdcDest As IntPtr, _
ByVal nXOriginDest As Integer, _
ByVal nYOriginDest As Integer, _
ByVal nWidthDest As Integer, _
ByVal nHeightDest As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXOriginSrc As Integer, _
ByVal nYOriginSrc As Integer, _
ByVal nWidthSrc As Integer, _
ByVal nHeightSrc As Integer, _
ByVal dwRop As Int32) As Boolean
Using g As Graphics = f.pb.CreateGraphics
' parm of True says draw plain view - no text = looks bad Zooming.
f.DrawAll(g, True)
For i As Integer = iSteps To 1 Step -1
Dim HDC1 As IntPtr = g.GetHdc
Thử
' Size of bite will not be right, but by re-adjusting
' with each iteration, it will make it to full-screen.
' Looks as good as having it right to start with, only much easier.
TopBite = objTop \ i
BottomBite = h - ((h - objBottom) \ i)
' Stretch/move the stuff.
StretchBlt(HDC1, 0, 0, w - LeftBite, h, _
HDC1, LeftBite, TopBite, w - LeftBite, BottomBite - TopBite, 13369376)
' Calculate where MyEntry would be after each stretch. Then the Bite
' size calcs above will ensure its closer next time.
SimulateStretch(objTop, objBottom, TopBite, BottomBite, h)
Finally
g.ReleaseHdc(HDC1)
End Try
' Clear exposed/invalid area to the right.
g.FillRectangle(br, w - LeftBite, 0, LeftBite, h)
' Sleep will make Swells close in duration between small/big window.
' (Can I actually sleep this short of a time?)
System.Threading.Thread.Sleep(5)
Kế tiếp
End Using
当然,如果有人将它调整为非常小的图像然后备份,它将是超低质量和像素化的 - 因此如果不调整大小,您可以使用更智能的算法偶尔在鼠标拖动期间触发真正的上色。
Để ý具体细节取决于具体实现。您应该提供有关您的应用程序的更多详细信息,以便我可以正确处理(它到底是什么样子的?)我假设有一个大的方形用户控件,其中包含许多自有元素,所有元素都同时调整大小。如果您让它们从小开始并调整大小以便它们开始重叠,则您必须在鼠标调整大小操作期间更频繁地定期进行完全重绘。
关于c# - 如何模仿Picasa渲染降质图片加速绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103472/
这个问题在这里已经有了答案: How to test your code on a machine with big-endian architecture? (3 个答案) 关闭 4 年前。 我想
我正在使用 Mockito 对业务对象进行单元测试。业务对象使用通常从数据库获取数据的 DAO。为了测试业务对象,我意识到使用单独的内存 DAO(将数据保存在 HashMap 中)比编写所有 when
如何实现: if X in (1,2,3) then 而不是: if x=1 or x=2 or x=3 then 换句话说,如何才能最好地模仿 Excel 的 VBA 中的 IN 运算符? 最佳答案
我正在使用带有 Jabber-net 的 ejabberd 2。我想问你是否可以在使用管理员登录时冒充用户。意思是我希望能够使用管理员帐户登录并发送消息 From: 'User A', To: 'Us
当查询输入到 Excel 中的 Bloomberg BDH 函数中时,它会自动填充选定的单元格,并使用请求的数据填充下面的单元格。 我正在尝试创建一个执行类似操作的函数(尽管使用不同的数据源)。 BD
在 es6 中保留模拟静态属性的类的属性的最佳方法是什么? 使用原型(prototype)链中创建的属性安全吗? class Employee { constructor(name, creato
我有一个 HTML 文本输入 用户输入字符串。由于它是文本输入而不是文本区域,因此用户无法输入换行符。 用户可以在文本输入中输入 Markdown 元素,以便在稍后重新显示数据时格式化数据。然而,他们
我有一个快速的问题:我正在使用 Spyder,变量浏览器选项卡中有一个巧妙的功能,我可以单击标题并对列进行排序。但是,当我尝试使用时无法重现相同的排序顺序: df.sort_values() 在 py
这是一个有趣的挑战。我正在阅读 TypeScript github 中的这个老问题 support Extension Methods用法与C#类似。提出了两种主要方法,一种是添加语法糖来扩展经常令人
在 Java 中这是有效的: class Class1 { T t; ... } //Inside other class that has no relation to Class1 private
我有另一个对象,我希望它的颜色与 UITextField 的默认占位符文本颜色相同。 我知道我可以简单地创建一个具有相同颜色的新 UIColor,但如果 Apple 更改默认的 UITextField
我正在尝试为我的 ListView 项目构建一个类似于 Gmail 应用程序标签列表的布局,其中标签文本在左侧,计数在右侧。除了长文本,我的大部分工作都有效。我所得到的结果导致文本与计数重叠。 这就是
我用一副纸牌创建了一个圆圈,用户可以旋转它来选择一张纸牌。平移结束后,它会捕捉到指定的角度,并带有漂亮的减速动画。将来会有某种指示表明 45 度的卡是所选的卡。我想指出选择随着触觉反馈而改变,就像在
我有一个简单的链表类型和一个 Clone 的实现它: #[deriving(Show)] enum List { Cons(int, Box), Nil, } impl Clone f
所以我创建了自己的自定义 UIView,它看起来像一个警报,现在我想添加显示和隐藏动画。 我想为 AlertController 模仿 Apple 的默认动画。解雇是一个简单的淡入淡出动画,但是我不确
我正在尝试让我的 Javascript 生活变得更轻松一些(至少对于我的工作环境而言)。我试图将所有 Javascript 对象创建方法移至“类”中。我有以下代码(用于创建超链接): function
您将如何模仿 iPhone 的键盘输入。因此,当您单击一个时,会显示 1,然后显示 2,然后显示 12... 依此类推,并显示 ( ) -。我不想使用实际的电话应用程序,因为我正在创建一个虚假的拨号器
你好,我有一个问题,我需要一些指导/帮助来创建一个菜单,如果屏幕太小而无法显示原始菜单,该菜单将替换为一个按钮。我知道 Bootstrap 会为您做这件事,但由于实现限制,我无法使用该库。因此,我查看
我正在使用 UIBarButtonItems 来触发特殊操作,但我还想在屏幕底部添加另一个按钮,其尺寸与在 NavigationBar 中创建的按钮的尺寸相同,我该怎么做? 我可以在 Interfac
我可以原谅可能重复的问题,但我没有找到解决问题的方法。 Controller 加载时模拟按钮点击。它运行良好,直到我将 ng-click 更改为 on-tap( ionic 应用程序)。现在根本不起作
Tôi là một lập trình viên xuất sắc, rất giỏi!