Windows下 提高绘图速度的方法由于我需要在1024* 768这样大的窗口里面,进行每秒中上百次的绘图,现在采用GD
Windows下 提高绘图速度的方法 由于我需要在1024* 768这样大的窗口里面,进行每秒中上百次的绘图,现在采用GDI与GDI+混合的方式,当然是为了达到一定的效果。 现在绘图速度很慢,但是由于时间上的要求,这个问题必须解决。 不知道大家有什么好方法没? 我在考虑是不是在平面里面用GDI或者GDI+不合适。 如果仅仅为了仿真平面效果,采用OpenGL其他的三维方式能不能实现? 那个效率相对来说比较高? 另外,有没有让自己的程序直接占用绝大部分CPU资源的方法(开机只运行这一个程序)?[解决办法] 帮你推荐一下吧 希望有更多的人来帮忙[解决办法] 设计中有需要每秒进行上百次的绘图的吗?觉得这里应该存在不合理的。 如果有使用GDI+,通常情况下都是为了支持ALPHA或旋转输出的。对于24位的或灰度的建议你不要用GDI+,也不要用GDI,直接用自己写的插值算法还会快一些。[解决办法] 这个估计有点难,我个人觉得OPENGL会比GDI快(当然比GDI+更快)。[解决办法] open cv技术本来在国内的应用就不是很成熟,而且教程就那么几个,有点难度[解决办法] 每秒中上百次的绘图, fps上百, 已超出生理视觉范围, 可以减少绘制频率 最好说说绘制些什么东西, 通常可以把重复绘制的保存的东西保存到内存DC, 再需要就直接复制 让自己的程序直接占用绝大部分CPU资源, 如果仅仅是这个, 没多大关系吧, 有需要系统会给你完整空闲的CPU[解决办法] DirectX啊。。。。GDI绘图 CPU消耗死[解决办法] 感觉用GDI 很囧,,,,,,,,NBA2K 这么NB的游戏的帧率 60FPS 已经很流畅了[解决办法] 一秒钟上百次太多了。 如果显示给用户看已经没必要了。 人眼睛超过每秒24次。就是一样的了。 你定在一秒钟40左右就可以了。[解决办法] 先在内存全部画好100个图,然后一秒钟内一个个复制到屏幕。[解决办法] opencv[解决办法] 电影是每秒24帧 显示器刷新频率一般也不过每秒60帧 就算你每秒100次绘图,显示器也无法全部显示出来。[解决办法] 我觉得用遍历的方法是最好实现的,哈哈 计算机的速度是很快的,比较的算法瞬间就完成了,另外可以考虑用异步的方式实现用户感受会好一些[解决办法] 跟着学习一下,第二个问题如果你在任务管理器中提高这个线程的优先级,不知道能不能达到你要的效果。[解决办法] 一般情况下GDI双缓冲,这个应该是GDI或者GDI+模式上面效率最高的技术了。 如果想再进一步提高效率的话只能考虑DX,DX里面有更加底层的绘制方式。[解决办法] 给外星人做的项目? 地球人不是每秒24帧就看不出来了吗? 呵呵~~ - -! 很多游戏,要求显卡XXXX以上,都才60帧 你这项目要刷100多,那我这破机器都不见得跑得动啊~~~ 可以再在结构上分析一下 如果非得要这需求 那OpenGL、Direct这些效率肯定要高的[解决办法] 1024*768大窗口实现帧率高于100fps/s,还真是开眼界了..[解决办法] gpu比cpu快 感觉应该在2点上下功夫: 1、使用gpu 2、优化算法,减少刷新的频率[解决办法] 这个估计有点难,我个人觉得OPENGL会比GDI快(当然比GDI+更快)。[解决办法] 人类的视觉残留一般在 0.1 秒左右,我不知道你的 每秒中上百次的绘图 是给谁看的[解决办法] 每秒 24帧就够了。[解决办法] 莫非楼主要做3D?120HZ刷新频率的??[解决办法]
引用: 每秒中上百次的绘图, fps上百, 已超出生理视觉范围, 可以减少绘制频率 最好说说绘制些什么东西, 通常可以把重复绘制的保存的东西保存到内存DC, 再需要就直接复制 让自己的程序直接占用绝大部分CPU资源, 如果仅仅是这个, 没多大关系吧, 有需要系统会给你完整空闲的CPU
太快了吧每秒100多帧我就是玩个魔兽世界能跑到60帧我就很快乐了吧?
还有3D的大部分跟显卡有关系,如果显卡好的话,是用GPU运行的。
[解决办法] DirectX + GDI DirectX用来加速,GDI用来交互(画各种图形,贴图)。
[解决办法] 不可能实现, 即使改用DirectX, 也未必打到.
[解决办法] 直接上Direct吧,速度上应该没有问题,还是楼上的观点60的帧频易经很happy了,再快真心的没用
[解决办法] 对GPU没经验,但从介绍上来看GPU适合大规模并行,如果你的操作都是串行顺序的,就不要考虑GPU了。
如果你是多核CPU,使用WINDOWS操作系统,可以为特定线程分配CPU。
但不保证只有你的进程占用特定的核,比如某些windows服务例程,不知道你是否有权利更改他们占用的CPU核。但这可以让特定的CPU核上运行尽量少的线程。
[解决办法] 那么高的刷新率还没做过
[解决办法] 同问,那么快的帧率搞神马
[解决办法] 引用: 由于我需要在1024* 768这样大的窗口里面,进行每秒中上百次的绘图,现在采用GDI与GDI+混合的方式,当然是为了达到一定的效果。 现在绘图速度很慢,但是由于时间上的要求,这个问题必须解决。 不知道大家有什么好方法没? 我在考虑是不是在平面里面用GDI或者GDI+不合适。 如果仅仅为了仿真平面效果,采用OpenGL其他的三维方式能不能实现? 那个效率相对来说比较高? 另外,有没…… 首先,你的技术不对,GDI /GDI+ 不是给你画动画用的。请用DirectX 或者 OpenGL 。
其次,你为什么要这么高的刷新率?给谁看,如果不是给人看,真的需要绘制在屏幕上渲染出来么?可以有其他办法么?
[解决办法] “上百幅图每秒”用GDI+肯定不行
[解决办法] DX 绘图还是比较省资源的吧
[解决办法] bitblt贴图达到上千帧还是很容易的,问题在于绘图数据的产生和操作处理,对图片的处理会大幅降低帧率
贴一个之前的简单测试结果吧,我是有点老的TP R400笔记本,DEBUG版本程序,绘制区域和图片大小为800*480,每项测试绘制1000次
GDI+那个测试是PNG图片解码+绘制的速度
Test DC GDI+ Result:34.601000 ms 28.900899 fps
Test DC BitBlt Result:0.905000 ms 1104.972376 fps
Test DC StretchBlt Result:0.890000 ms 1123.595506 fps
Test DC PatBlt Result:0.452000 ms 2212.389381 fps
Test DC bmp AlphaBlend Result:1.420000 ms 704.225352 fps
Test DC DIB AlphaBlend Result:1.436000 ms 696.378830 fps
Test DC TransparentBlt Result:1.326000 ms 754.147813 fps
绘制速度与图片的格式,DC的格式,使用的接口等都有关系,如果不是用的有问题,一般优化的余地也不是太大
把相关接口完整的测试验证一遍,就能大概找到效率的瓶颈,剩下的优化就主要在于自己程序的设计了,使用更多的缓冲,减少数据的搬运,解码和色彩空间转换,设备相关位图无关位图的转换等等费时操作
关心这个也就为了实现一些动画效果之类,PC上感觉难度不大,用途也不大,嵌入式设备上的优化倒是让人比较费神
[解决办法] if(显示)
只要是“显示”出来的=>就是给“眼睛”看=>“蒙骗”眼睛只要达到20多/s就够够高高了。
else
数据内存处理n快快。。。
[解决办法] 关注。。第一次听说这么高难度的电脑操作哦
[解决办法] 如果是实时渲染,肯定选择OGL或者DX,如果是编辑辅助类型,GDI可行,你的需求每秒百次可以理解为百帧?一般游戏才能达到咯。
性能的优化也就是通过外包矩形进行可视判断,或者根据缩放等级进行模糊显示,设置裁剪区等,总之就是减少实际的渲染引擎的API调用,因为那里面封装的算法是很耗时的。
[解决办法] 我近来也在研究这个。
首先绘什么图,是矢量的面还是栅格位图?
如果是1024*768窗口绘矢量的话,速度是比较慢一些;
如果是绘一张图片,用gdi 或 gdi+也不慢。
你用的时间是?
------解决方案--------------------
引用: 电影是每秒24帧 显示器刷新频率一般也不过每秒60帧 就算你每秒100次绘图,显示器也无法全部显示出来。 有道理
[解决办法] 第一点:2D 绘图 OPENGL或DX肯定比GDI快?NO!
第二点:要这么快干嘛?需求分析不正确!
[解决办法] 这方面还真不太懂,学习ing。。。
[解决办法] 用线程
[解决办法] 定时刷新就可以了
[解决办法] 另外,有没有让自己的程序直接占用绝大部分CPU资源的方法(开机只运行这一个程序)?
======================================================
据说可以设置进程优先级。
[解决办法] 提出伟大需求的楼主怎么不现身了?难道他实现了而不告诉我们?
[解决办法] 楼主想突破硬件的极限?这得和微软直接联系了!
[解决办法] 应该用GDI就可以做到(不需要GDI+和OpenGL等),之前我作FlashPlayer 6时,即使考虑矢量运算(包含极其费时的Alpha运算),就可以达到超过100FPS(http://blog.csdn.net/tomsoft/article/details/5884697),当时使用的核心技术就是:只有脏矩形技术;
实际上,就当前的PC平台可以使用:
1)脏矩形技术;
2)双缓冲(需要硬件支持)
3)多核技术(如OpenMP或类似的)
更正楼上的一些错误,2D渲染OpenGL未必比一个好的软件渲染快:我用纯软件渲染即使不使用多核技术也可能会比OpenGL或OpenVG快(我实测过使用硬件加速和软件渲染的结果);关键是算法的优化;另外不合理的使用多线程技术未必会提升性能,可能会造成性能的下降:在单核应用下,多线程技术滥用是很可能造成性能的下降;合理的多线程技术(非IO等待),其线程个数的设定需要考虑CPU实际格式和Cache及内存的带宽问题,经验设定为实际物理CPU个数(非硬件线程个数),同时,近代多CPU技术中CPU(可以理解为线程个数)的上限为16,否则可能会有内存墙问题;
[解决办法] 不错的想法,网络安全也会比较有保障了
[解决办法] 很好 准备抽时间看看OPEN GL
[解决办法] 哦,还有第二问,这个比较简单:随便写个多核程序,如基于多核的纯软件视频解码,8个核(Core i7)CPU占用率很容易就可以到90~100%,随便写了一个程序(实测在我的机器上8核大约100%):
#include "stdafx.h"
#include <omp.h>// 一定要使用这个头文件,否则Release版本会提示找不到vcomp.dll库
#include <stdio.h>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int num_threads;
#pragma omp parallel
num_threads = omp_get_num_procs(); // 强制以最大CPU占用执行
omp_set_num_threads(num_threads);
#pragma omp parallel for private(i)
for(i = 0; i < 50; i++)
{
int value = 0;
for( int k = 0; k < 8000000; k++)
{
int a = rand();
int b = rand() & 15;
int c = (a * b) >> 4;
value += c;
}
printf("Index: %d: value:%d\n", i, value);
}
getchar();
return 0;
}
------解决方案--------------------
引用: 我近来也在研究这个。 首先绘什么图,是矢量的面还是栅格位图? 如果是1024*768窗口绘矢量的话,速度是比较慢一些; 如果是绘一张图片,用gdi 或 gdi+也不慢。 你用的时间是? 同道人~~~已经在这方面努力了好几年了:从Windows到Linux都试过,甚至在uCOS和eCOS上也试过了---软件渲染通常就够了,在矢量渲染时最占时间的不是现实,而是矢量计算的渲染过程
[解决办法] 100次有点夸张了把
[解决办法] 下次楼主将是以微软某个总监的身份现身。。
[解决办法] 召唤lz现身 这么多的建议 应该总有相近可行的说法
[解决办法] DirectDraw
[解决办法] 引用: 召唤lz现身 这么多的建议 应该总有相近可行的说法 要看绘制的是什么图
[解决办法] 什么都不做,帧率肯定刷刷得往上涨,但你还要渲染呢
感觉楼上都没说到点子上,楼主还是自己实验一下吧
[解决办法] 听说过有一种潜意识的试验
在画面显示时会夹一些文字图片什么的,但是都是一闪而过,甚至人都没有反应过来就闪过去了,但听说这些内容会潜意识中对人产生作用。。。,这个绘图的速度就要求很高了
[解决办法] 没听过。。。
[解决办法] 学习了,增长知识。
[解决办法] DirectX。。。。这个快,用了硬件的性能~
[解决办法] 楼主失踪了。
[解决办法] 你需要DX和一颗强悍的显卡,话说显示器的刷新率有你绘图的频率高么?
[解决办法] 硬件加速
[解决办法] 画这么多次,我个人觉得,只能使用多次缓冲或许能解决,但是,不知道是不是你的数据每秒需要更新几百次!如果不是全部数据更新的话,用缓冲拷贝的方式,能节约点资源,不知道能不能满足。
[解决办法] 对opengl只是了解
[解决办法] 楼主是要达到一定的三维效果吧
1. 能不能画图之前先将数据进行尽可能的优化
2. 使用GDI双缓冲
3. 考虑DirectX和硬件加速
[解决办法] DirectX
[解决办法] open cv是图像显示的吧,矢量图形的应该不适合。
gdi 比gdi+快点,但也只是适用于一般的应用程序。三维和游戏的一般用opengl和direct x,因为可以用到硬件加速。另外楼上提到的双缓存跟提高绘图速度没啥关系,双缓存不过是让人看起来绘图更加平滑罢了。
提高绘图速度我认为的途径:
1. 应用硬件加速,最直接、最有效。
2. 减少在绘图过程的计算量,就是绘图的过程不要掺杂计算,在绘图之前把计算结果在内存里保存好。
3. 优化数据结构,比如绘制大图像采用分块显示,然后建立合理的调度机制。
[解决办法] 另外也可以应用些新技术,比如并行和gpu加速,不过我没用过。
[解决办法] 我是菜鸟,不懂啊
[解决办法] 不错 !!!
[解决办法] 分辨率这么大,每秒上百次,即便是你把实现替换成DX还是会很吃力,建议你如果非要这么做,可以改进一下绘图的算法,每秒只在改变的地方重新绘制,而不改变的地方保留原样。
可以搜索一下脏矩形技术