为什么火狐无法添加书签鎃ebGL中的图像

如何在Delphi中鎃ebbrowser控件打开的网页_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
如何在Delphi中鎃ebbrowser控件打开的网页
)delphi 使用 TWebBrowser 控件打开网页很简单.document.body:WebBrowser1.Navigate('网址&#39,可以参考以下代码示例:ShowMessage(WebBrowser1,先在窗体上添加一个 TWebB如果想获取打开的网页内容,打开网页,使用&Navigate 即可,如下示例.OleObject
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包补充一个 &a href=&///?target=http%3A//www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Gatys_Image_Style_Transfer_CVPR_2016_paper.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Image Style Transfer Using Convolutional Neural Networks&i class=&icon-external&&&/i&&/a&。这个算法可以从一张图片中提取艺术风格,并转移到另一张图片中。最近非常火的 &a href=&///?target=https%3A//ostagram.ru/static_pages/lenta%3Flast_days%3D30%26locale%3Den& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ostagram&i class=&icon-external&&&/i&&/a& 就是用的这个算法。&br&下面的图片左下角是代表艺术风格的图片,左上角是转移风格的对象,右边的大图就是算法生成的结果了。&br&&figure&&img src=&/v2-7e1b7ec2a38bef31e63c00a9cd9d2f03_b.png& data-rawwidth=&599& data-rawheight=&403& class=&origin_image zh-lightbox-thumb& width=&599& data-original=&/v2-7e1b7ec2a38bef31e63c00a9cd9d2f03_r.png&&&/figure&&figure&&img src=&/v2-795cd645c6c19ffc9df3_b.png& data-rawwidth=&593& data-rawheight=&396& class=&origin_image zh-lightbox-thumb& width=&593& data-original=&/v2-795cd645c6c19ffc9df3_r.png&&&/figure&&figure&&img src=&/v2-0a8bbb3965893dfaab101_b.png& data-rawwidth=&585& data-rawheight=&392& class=&origin_image zh-lightbox-thumb& width=&585& data-original=&/v2-0a8bbb3965893dfaab101_r.png&&&/figure&&figure&&img src=&/v2-4ae397a49b5c2e448f4ebd_b.png& data-rawwidth=&585& data-rawheight=&391& class=&origin_image zh-lightbox-thumb& width=&585& data-original=&/v2-4ae397a49b5c2e448f4ebd_r.png&&&/figure&&figure&&img src=&/v2-5c4d5b3a3350d80bdb941c0_b.png& data-rawwidth=&588& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&588& data-original=&/v2-5c4d5b3a3350d80bdb941c0_r.png&&&/figure&&br&(图片引自 &a href=&///?target=https%3A//ostagram.ru/static_pages/lenta%3Flast_days%3D30%26locale%3Den& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ostagram&i class=&icon-external&&&/i&&/a&)&br&这个算法的背后其实是深度卷积神经网络,网上有很多不同的开源实现,比如&br&基于 Torch 的 &a href=&///?target=https%3A///jcjohnson/neural-style& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - jcjohnson/neural-style&i class=&icon-external&&&/i&&/a&&br&基于 TensorFlow 的 &a href=&///?target=https%3A///anishathalye/neural-style& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - anishathalye/neural-style&i class=&icon-external&&&/i&&/a&&br&基于 Keras 的 &a href=&///?target=https%3A///titu1994/Neural-Style-Transfer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - titu1994/Neural-Style-Transfer&i class=&icon-external&&&/i&&/a&
补充一个 。这个算法可以从一张图片中提取艺术风格,并转移到另一张图片中。最近非常火的
就是用的这个算法。 下面的图片左下角是代表艺术风格的图片,左上角是转移风格的对象,右边的大…
更新:擦,本来只有一句话,推荐Qt,远离微软,有人追问,补充了点,有人又追问,又补充了点,然后出了趟门回来,感觉跟捅了马蜂窝一样。既然都说到微软了,那就接着展开一下。&br&&br&&b&问题的本源&/b&&br&&br&微软就是战线太长了,忙着去主导各种标准,制订各种框架,这样的话,才能更好的夹带私货,用一个你必须用的东西推进另外一个他想让你用的东西,诸如dx和windows,诸如c#和 &a href=&///?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&,而又因为主导了开发者,才能进一步主导用户,而主导了用户,大量的利润便会随之到来。在整个链条中,如果消费者没得选择,开发者也没得选择时,微软就能想卖啥就卖啥,完全基业长青了。出个新东西没关系,不符合我的利益我就不支持。如果新东西很有前途,那我自己搞一套,然后再把我的开发者和用户绑架过去。&br&&br&到底哪一个方向会有前途呢?微软自己也说不清。到底哪个领域对今后的软件生态影响比较大呢?微软自己也道不明。只能朝着各种有苗头的地方去努力,以前技术领域比较窄,微软可以囊括整条产业链,编译器/IDE/框架,开发者基本可以躲在微软的圈子里不出来。后面各个技术领域蓬勃发展,分支越来越多,微软就有些力不从心了。但是战略依旧没变,任然试图去主导任何一个技术领域的标准。利用自己的影响力去忽悠各种开发者:“跟我来吧,有美好的明天”,但技术领域每天都在推陈出新,产生新的细分。为了主导更多的新领域,称霸完一个领域后,微软的重心并不是完善该领域,而是继续集中精力称霸其他新的领域。&br&&br&对于支持期的技术,微软会利用自己强大的影响力进行各种捆版整合,告诉你:“新的革命又到来了,你准备好了么?”,告诉你:“用了它之后,你就什么都不愁了”,“XXX即将停止支持”,然后各种社区中,一堆mvp前扑后拥的进行推广:“XXX大法好,MS法力无边”;书店的柜台上,瞬间多出几十本红色封面黑色封面的宝典;CSDN的主页里,各种微软 TechED, 夏令营。很多人一看,我靠,全世界都在用,我再不用是不是就要被淘汰了呀?&br&&br&完成支持后,微软进入绑架期,为了不让你用其他的东西,微软想尽一切你的需求,然后为满足你可能的一切需求,开始拼命的飙版本,来兼容各种各样的东西。很多人觉得这个东西好像挺强的,什么都能做,不用学其他了,微软就笑开花了,觉得可以绑架大家了,于是开始疯狂的用该技术夹带越来越多的私货,或者是新技术,或者是为了强迫其他人用另一个东西,为了兼容这些私货,继续飙版本,这就叫绑架。&br&&br&等到你积累了越来越多的代码,或者成熟框架后,你突然发现,原来你能做的事情,就是只能在微软给你划定的一亩三分地里面不断的耕耘。想用它开发一个微软商业上不支持的东西?没门。依赖微软越久,做出选择的成本越来越高。这时会有两种结局,第一种,微软给你指出下一个革命的方向,你别无选择,斩断原有积累投入到下一个革命中。异或,微软觉得自己在这个领域江山稳固了,竞争对手都没了,不会再出什么幺蛾子了,于是彻底开始不思进取,你用着过时的技术干着急。&br&&br&曾任微软副总裁的李开复回忆:“一个产品队伍一旦失去了假想敌,就会松懈,盖茨和鲍尔默也会撤回对它的投资和支持。比如说,微软IE击败网景之后,微软就降低了投资,致使它的浏览器多年没有再进步,直到又出现了‘火狐’这个敌人,才又开始振作。”火狐就是网景的“遗孤”。&br&&br&&b&微软的绑架&/b&&br&&br&MFC就是一个很好的例子,当年同 VCL竞争时挺上进的,VCL一死,MFC也跟着死了,现代的界面系统都是 windowless直接绘制控件了,笨重的mfc还在基于系统控件。大量的onpaint自己做,人招不到不说,工作效率奇低,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高,你说我会选啥?mfc还需要各种奇巧淫技才能达到 qt的效果,弄那些技巧的人变动,项目就傻逼了,考虑到这一点,你说我又会选啥?最近两年界面开发又开始脚本化了,你会发现 Qt有各种支持脚本(除了内嵌支持 js的 QtScript外,还有 Python的 PyQt,还有 Lua)任你选择。核心代码C++,逻辑界面python,用过脚本开发UI的人都不会想用回C++写UI,因为界面逻辑脚本化可以提高至少两倍以上的生产力。微软的策略呢?想用脚本?没门,因为我不推脚本但是我推c#,所以你想方便的写高级界面?还是跟着我去弄 .net和wpf去吧,这就叫绑架。面对绑架你别无选择,开发者微软系的代码和经验积累越多,想离选择非微软的东西成本就越高,想不被微软绑架的代价就越大。&br&&br&为啥有人愿意给 Qt脚本化而不愿意给微软的界面系统脚本化呢?并不是微软的技术就比不过Qt,而是大家唾弃微软的臭脾气,外加Qt是开源的,为它实现脚本各种方便。这里并不是说开源的东西就一定比微软的东西好,微软有很多领先的技术甩开源几条街,主要问题在于微软的封闭性。所以我的论点并不是一定要用开源,而是建议大家有选择的余地下,选择非微软技术,比如qt, flash这种。&br&&br&&b&死也要主导行业标准&/b&&br&&br&为了引导行业标准,微软很多设计的很好的东西,各种音视频格式,还有最近的 HD Photo图片格式,比 jpg2000 和google的webp好多了。但是很多人由于微软的封闭不买微软的帐,很多框架和软件都直接支持webp了,也没几个人支持wdp,在这种情况下,我宁肯选择次一等级的 webp。&br&&br&微软的出过很多标准性的东西,比如wmv, wma格式,当年挺先进的,微软也天天忽悠人去用这两个格式,但是由于封闭,最终失去支持,大家选择了更加开放的方案来代替,微软也就不思进取了,最终视频领域 现在是 h.264/265,音频领域是 he-aac v2。&br&&br&微软又试图代替 pdf,引领该领域的标准,然后自己出了一个 xps。论技术,确实高于 pdf很多,但是没人用呀,没软件支持呀,连打印机都只支持扫描成pdf格式。所以我选择 pdf并不是因为 pdf技术比微软强,而是因为它不是微软的。而且我估计个两年出个 pdf2,xps也就跟 wmv一样进棺材了。&br&&br&再比如 SilverLight,微软在没有太大把握的情况下硬推这个东西,就是因为怕c#由于满足不了RIA使得C#开发的开发者流失到微软以外去,为此 .Net还逼迫大家升了几个版本。可惜,大家都知道的,于是微软自己对它的支持都少了很多。&br&&br&你说微软技术弱么?不弱。那为啥这些明显乱七八糟的东西微软都要硬撑着试图主导行业标准但是最终又主导不了呢?那是因为我们先前提到的微软战略,从几十年前到现在都从来没有变过,然而时代变了。&br&&br&&b&Win32 API&/b&&br&&br&Win32 是系统层最稳定的接口,一切功能的基础。这么基础的东西,微软该化大力气持续发展对不对嘛?非也,随便举两个例子你就会发现其实它已经落后世界很多了。微软是任性的,觉得我提供的开发模型可以解决一切问题,为什么要参考其他操作系统改进呢?即便其他操作系统提供的功能很好,我也要给你挑挑刺。而按照微软一贯的规律,系统 API领域,我完全控制了,那么我改进的动力也就不那么强了,庶民们岂能妄自议论 Win32 API,更别说想提交改动 patch给我了。&br&&br&线程同步:如果你写线程同步,你会发现 Win32 API缺很多关键的东西比如:条件变量,读写锁,这两个最基本的能够组合成其他任何同步模型的东西,微软直到 Vista的年代才提供支持(msdn Condition Variable),这就意味着,你如果用了,你将面临很难在 xp下跑的情况。你问微软 xp怎么办,微软说用 event去 wait嘛。你就奇怪了,event这么弱智的东西能代替条件变量么,为啥不再xp年代就支持了?&br&&br&单次初始化:pthread_once,没错,windows下面由于缺少这个东西,你再做一个全局变量供你的接口访问时,你需要保证该变量只被初始化一次。即便多线程同时调用访问该变量的接口,也不会出现两次初始化的情况,pthread_once就是做这个事情的。直接把代码写成:if (inited == false) { init(); inited =} 线程又不安全,外面加一个 CriticalSection,那你又需要在更前面去 Init这个 CriticalSection,还要保证不会发生多次 Init,问题还是没解决。于是很多人在 Windows下的解决方案是,在全局变量声明一个类的静态实例,这样 main()之前,那个类的构造函数能够提前被调用,进而又引入了新的问题,及多个全局实例又会存在谁先谁后被构造的问题,你又得用恶心的 #pragma宏来解决,最后初始化代码一团乱麻。而如果微软提供 pthread_once类似方法,那或许这一切都会变的很清爽。&br&&br&网络接口:用过 winsock接口的人都觉得简陋,你想实现高性能的网络服务,需要控制 TCP的大量细节参数,比如 TCP_NOPUSH, TCP_CORK, 还有 QUICKACK这些控制调整 TCP面向流量优化或者面向流速进行化的基本功能,winsock上看都看不到。更别说 Google的 TCP速率优化(Kernel 3.2.12收录的 Google patch)等现代功能了。即便是对比最基本最传统的 posix套接字,winsock的行为也是错乱的,比如 REUSEADDR,再比如 Win32下你监听一个 UDP端口,给远端发送 UDP数据包,如果远端没有监听该UDP端口,那么你服务端收到 icmp: port unreachable后,那个udp socket就彻底被 reset了,后续什么数据都读不进来,持续给你报 10054,搞笑吧。除非你创建udp套接字时做一大堆 *windows独有的* 专门的设置,否则vista之前,你都会被 10054。vista之前,默认情况下,客户端如果拒绝收服务端的 udp包的话,服务端的 udp套接字就用不了了,这是不是在搞笑么?还有各种基础功能限制,比如:缺乏poll支持(强迫你用iocp代替),select最多64个fd,没有 socketpair。当然,没有这些也可以写网络应用,但写惯 unix下的网络代码突然来 win下写,就会觉得这真是个玩具呀。&br&&br&TLS:TLS有数量限制也不管了,但是线程本地存储这个东西是需要 destructor的,即我创建了一个本地存储来存一个对象,我可以设置一个 destructor函数指针,在线程退出时,这个函数会被自动调用到。比如你想实现一个 per-thread cache(比如类jemalloc的 arena),线程退出时能够被自动析构,这个最基本操作在 Win下却可以把你别扭死,原生TLS API没有这个支持,你又不想所有线程退出都要强迫使用者调用一下 destructor,那么你开一个线程监听所有线程?还是怎么招?看看 boost和 jemalloc这些在 win下的 destructor实现,你就会发现恶心的要死,就像要在一块工整的电路板上,焊接一根非常碍眼的飞线一样。&br&&br&GDI/GDI+: GDI是牛逼的,出生早又承当了 GUI的基础工作,毕竟那么多年了,做成这样是无可厚非的。但是XP年代的 GDI+一出生就落后于时代。比同期的同一个级别的开源项目 Cairo(gtk后端,wine用来模拟gdi/gdi+的后端,webkit/mono后端)和 Quartz(OS X图形后端)来,GDI+除了速度卡外,图像质量差,功能简陋,不支持抗锯齿,对GDI的字体效果也并没有质的改进。所以 Windows下的应用软件,一直因为字体和图像质量受到诟病。直到后面的 Direct2D出来希望改进这个局面,也已经是好多年以后的事情了。大量兼容 xp的程序还在跑在 GDI/GDI+上。&br&&br&( 问题有很多,以下省略若干字)&br&&br&按微软的能力,想改进这些基础接口,应该不是难事。但基础接口的长期滞后,折射出的是该公司全胜时期的傲慢。&br&&br&&b&统治与分治&/b&&br&&br&微软的接口设计向来是缺乏美感的,喜欢复杂化,喜欢什么东西都搅合在一起。什么叫做大一统?就是什么都能做,貌似很强大,一个东西能做的事情很多,开始是好的,但是随着时间的推移,耦合度高,各种盘根错节,一旦其中一个设计很 “巧妙”的东西过时了,那所有依赖它的东西将面临死亡。什么叫做分治?就是保证简单性和可拆分性,每个系统专心做好一件事情。一个不行,换掉即可,整个解决方案是由若干全部可以替换的子模块组成的,这叫分治。&br&&br&Windows技术栈就是一个典型的大一统设计,他有很多很巧妙,依赖性很强的东西。比如,“一切都是窗口”,这个思想,从设计上来说就是有问题的。举个简单例子,WSAAsynSelect 用过的人都知道,这是一个网络接口,用来判断哪个套接字上有事件。但是却又要传一个窗口句柄过去,让窗口来接受网络事件,这就是一个很搞笑的例子。微软为什么这么设计呢?因为应用程序本身有一个消息循环了,就是窗口消息循环,但是如果处理网络的应用程序使用类似 unix poll的方法,去等待消息的话,窗口消息就得不到处理了。如果把poll放到一个线程里的话,那UI线程要找网络线程做点事情,那网络线程在 poll的等待周期中,如果没有新的网络数据过来,可能短时间内没办法理会 UI线程的请求。于是微软的解决方案,就是让网络层的事件合并到 UI的窗口事件中,这样就比较方便了,全部在窗口消息队列,你要把UI和网络放到一个线程也可以,两个线程也罢。这样把两个风马牛不相及的事情搅在了一起的:“巧妙” 设计在微软的技术栈里数不胜数。&br&&br&合理的处理方法应该是啥?应该是继续使用 Poll,每次 poll可以设一个比较短的时间,并且可以被外面线程唤醒,这样就不会出现之前的问题了,两件事情不会搅在一起,这就叫可拆分性。结果呢,不关网络,大量的其他东西都和窗口搅起来了,等到 Windows程序要移植的时候,就会变得万分痛苦。有人说不是有 IOCP么?看看有多少一流的服务器支持 iocp?再说java可以把所有不同操作系统的异步事件模型封装成NIO,对 Windows对的 iocp却提供单独的接口,而且直到 7.0以后才有,微软总喜欢和全人类反着来。&br&&br&缺乏审美的设计,才会导致 Win32 API被 GUI所束缚这样一种结果。这在其他系统对比来说,这时听都没听过的事情。这是设计上的偶合,还有商业上利益的选择。比如网页开发,C# 和 &a href=&///?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&绑定太紧,&a href=&///?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&和 iis绑定太紧,iis和 windows又绑定太紧。微软的东西才出来都是先进的,可封闭的微软不愿意同外面合作。你要用我先进的东西,你就一个系列都要用。最终全部都搅在一起了,风险是相当大的,系统就像一个吞噬了各种化学物的怪兽一般,蹒跚前行。&br&&br&而所谓简单性和可拆分性的东西,是四处皆可替换的东西。比如你做 web开发,你选一门语言,python,语言就做好语言的事情。外部的网络框架,可以用 django,flask, web.py等等,接口可以用 fastcg / cgi / wsgi / uwsgi / apache_mod, 而外部的服务器,可以用 apache, nginx, lighthttpd。清晰的被分成:语言层、框架层、协议层、服务层 四个不同的层次,每个层次若干备选方案,互相兼容,web.py过时了,我换 flask,apache过时了,我换nginx。每个产品都专注做好自己的事情,并前后适配其他层次的方案,python出问题了,我换 ruby,换php,协议任然用 apache_mod或者 fastcgi。这就是分治,具备美感的设计。&br&&br&这样的情况在微软的技术体系里很难出现,这些技术运行到windows下水土不服不说,微软自己就不让你选:你要写asp .net,那语言你就用 c#(vb比较小众),用了&a href=&///?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&你就要用iis,而iis只能跑在 windows下。外部的人很难兼容进来,本来微软就不太愿意支持其他技术。那么好,一开始可能领先,但是随着时间推移,这么长的链条中间一环出问题,可能会导致其他的跟着他一起被人抛弃。&br&&br&微软一方面出于商业考虑,生怕自己技术链中哪个环节被人替换,一方面有些接口设计充满耦合,考虑不周,导致后面大量的主动升级和被动升级,什么 ocx, com, atl, ole,dx1-7类似的东西都可以搞出那么多来折腾人,系统内核 GUI,网络、多媒体,大量的 API偶合在一起。最终简单的一个 Office和 Windows一样臃肿丑陋,这就叫缺乏美感的设计。&br&&br&&b&C#&/b&&br&&br&C#是一门简洁优雅的好语言,是微软中比较少见有品味的设计,这是因为 C#之父 Anders就是来源于微软之外的 Borland。Anders 早年为 Borland 设计的 Turbo Pascal 和 Delphi 就以编译速度快,使用简单和功能强大受到大众的喜爱,所以在设计 C# 时融入了很多早年的审美观。C#语言层面上胜过 java不少。我经常边用边骂 java到9到10了,也没想着好好的学学 C# 的一些特性。Java 这么多年连个 get/set 都不抄一下,连个unsigned都不肯给我用用。用 C#写代码比 java流畅不少,但应用范围太窄呀,我没办法还得接着用 java呀,应用范围广呀。我用 java写的程序随便运行在几乎任何平台上,大量最新的开源成果可以直接应用。可怜的C#却被微软画了一个圈,死死的呆在圈里出不来。其实大家都是欢迎 C#的,不然也不会有 mono这个项目了,但 mono运行效率比 jvm低不少,比原生的 .Net运行时低很多,库也不全,实在难以承当大任。&br&&br&除了部分人专门从事 C#的工作外,现在互联网企业,几乎很难看得到 C#的身影:做移动应用,用原生的 java和 objc。做服务端用 C++/java/各种动态脚本,做页面用 Js 页游用 Flash。做PC游戏用C++/脚本,没C#什么事情。移动游戏主要也在使用 C++/脚本(unity只是众多游戏开发引擎中一个单例未来是否被代替未知,XNA就是个玩具)。唯一只有微软的老本行PC桌面应用,没错,是C#,但是现在也面临诸多挑战: CEF(Chromium Embedded Framework)用js直接写Windows本地应用,如网易云音乐用CEF效果拔群;Qt系列+脚本(越来越多互联网公司在用,如Wps);自己C++UI库/脚本(例子太多了)。这些方案你或多或少都能挑出些问题来,但不可否认的是她们正从各个方向蚕食 C#的传统地盘。你可能说C#在客户端能做很多非 UI的事情(比数据库和网络还有图像),但 CEF/Qt 这些播放点流媒体、访问下网络、弄下图像或者请求下数据库同样很简单。现在 GUI开发的脚本化进程正在席卷各种桌面开发方案, js等脚本运行速度越来越快,C#速度上并不能体现出数量级的优势,而且基于泛型的脚本语言开发效率比原来高很多,同时这些解决方案全是跨平台的。而整个进程中 C# 被排除在外了,这才是 C#真正危机的地方。&br&&br&&b&DirectX&/b&&br&&br&有人奇怪我为何喜欢 OpenGL,话说白了只有一个理由,它是开放的而且它不是微软的。如今很多人会说你看 d3d 接口不错,兼容性高,CPU占用低而且画面好。没错,但记心好点的同志们把时间拉长一点,Win95时代微软强推 DirectX而封锁 OpenGL很多系统调用的事情各位还记得到吧?那各位还记得到 DX才出来时烂成什么样子么?当时业内骂声一片,很多人看了眼接口就扔了,直到 DX5出来的时候,你稍不留神,还会把整个屏幕画花了,或者弄死机了。当年 OpenGL领先 DX不是一个量级。直到 DX8出来了,才算完善了一些。微软为了商业利益,把整个行业拖后了数年之久。直到2006年,很多 3A大作还是以 OpenGL为图形底层,不鸟微软的 D3D。&br&&br&微软的技术架构,向来不太优雅,耦合度又高。Dx7以前,DirectDraw的表面和 D3D设备还有纹理搅在一起,DSound的坐标系统又可以和 D3D的坐标系统搅在一起。大量的数据结构被定义出来,一个矢量一个矩阵还要单独定义一下,不准我跨平台库用自己的定义么?你就不能用个数组么?你强大是强大,但是你耦合度实在太高了。一个环节更新,所有环节被迫更新,然后就飙版本的原因之一。DirectX的设计就是没有品味的,如果按照简单性和可拆分性的思路来重新考虑,Dx软件包中,应该隔的比较开才行,能不定义的对象和结构体,尽量不定义,用C原始的类型或者数组来接口,这样不会妨碍我外面灵活使用。然后游戏开发者靠一门胶水语言把这些独立模块根据需要粘合在一起,这样的方式是不是更清爽一些呀?&br&&br&开放的东西能自我适应性,自我修正。Real Networks估计很多人还没忘记,当年的他开发的 RM / RMVB视频格式,因为压缩比高,同信噪比下码率能有更低的码率,画面质量更好,而赢得了广泛的支持。但是 RM / RMVB却是一个封闭的视频格式,虽然领先了业界数年之久,但是数年后即被开放的 H264所代替,H264虽然一开始接受度不高,但是数以万计的人在帮他完善。学院派今天发研究出一种更有效的宏块搜索方式,不出两个月工程界就跟进了。今天有人发现一个运动估计的改进,明天有人实现个更低延迟的缓存管理,或者提升下错误恢复能力。免费的 x264不论从延迟,性能,画质,码率都直接秒杀很多商业公司的编码器,ffmpeg又可以轻易的播放h.264视频。最终 Real Networks抱着它的 rm/rmvb一起进了坟墓,死前还不忘叫一句它正在开发 rmvb2,超越 h.265标准的编码格式,业内嗤之以鼻。视频领域的玩法已经变了,H.264通过不断发展,最终颠覆了RMVB的商业模式,这就是一项技术自我适应,自我修正的例子。&br&&br&今天的 D3D就像当年的 RMVB,就算他用商业手段狠狠恶心了 OpenGL一把,导致后面 OGL数年发展不顺,但是老话说得好:理胜力为常,力胜理为变;一时之强弱在力,千古之胜负在理。随着 OpenGL新标准的不断完善,虽然暂时不能彻底抛弃 DX,但封闭的 Dx必然会随着微软 Windows 逐渐边缘化,这就叫得道多助失道寡助。&br&&br&&b&全世界玩一套,微软自己玩一套&/b&&br&&br&还是因为微软最初的战略没有改变,导致全世界一套,微软自己玩一套;微软看不起开源界,开源界也不理微软。再次强调,并不是只有开源才好,而是这么多家公司里,只有微软一家试图自己从头到尾建立一套完整的技术体系,只有微软一家采取如此封闭的策略。然而早年微软可以罩住整条产业链,并且活的很爽,但是现在大量基于开源界的最新成果都和微软技术栈水土不服。&br&&br&所以开发者会面临:依赖微软和不依赖微软两种选择。依赖微软,很容易和外界形成隔离。而不依赖微软,你得到的是满天下的选择。前者强调高度集成统一,后者强调可拆分替换。然而,世界潮流,浩浩荡荡,顺之者昌逆之者亡。&br&&br&&b&成也萧何,败也萧何&/b&&br&&br&早年的微软,象一个潜伏在丛林里的猎手,利用自己操作系统的优势地位,寻找着产业链最高端的用户需求。一旦一项技术可以满足用户某种根本需要,微软就不惜牺牲眼前的现金流,来换取未来的行业领导地位和盈利。或快速收购,或恶意打压,或自家出一套,任何一个领域只要有新的东西出现,微软就试图去控制它,并绑架获出钱养活接受了微软标准的软件开发商让他们支持,出钱扶持低端的开发者让他们学习微软标准,于是巨大的利润,随之而来。&br&&br&这样的战略,使微软茁壮成长,并成为接二连三的行业标准拥有者。然而这样的战略有一个致命的BUG,就是标准必须是与时俱进的,微软需要不断调整已有标准,否则越来越多的标准就会成为束缚住微软的一条条绳索,越来越多的兼容性问题象一座座大山一样压得微软喘不过气来。掌握的标准越多,微软越难改变,随着时间的推移,将会被微软体系外更加迎合用户偏好的竞争者们所取代。&br&&br&有人说:“微软错过了移动化浪潮,错过了云计算,是因为鲍尔默的误判。智者千虑必有一失,再牛逼的人也有判断失误的地方”。但是通过上面的分析,我们可以看出这种说法的荒谬性,我们需要清醒的指出,就算没有鲍尔默,微软即便赶上了云计算,他也会错过雾计算;他即便赶上了雾计算,他照样会错过烟计算。&br&&br&这样的战略,使微软早年站到了时代的风口浪尖,又使如今的微软,变得越来越与时代背道而驰,不是微软不想融合,而是融合的成本越来越高。世异则事异,事异则备变,理解了微软的核心战略,就不难理解微软为什么会去弄什么 xps, silverlight;理解了微软的战略,就能理解为何微软的精力总是在制定新标准,而不是改进老标准了;理解了微软战略,就不难理解为何进入2000年以后,微软总是昏招迭出了。&br&&br&病在肌肤,还可以医治,病在肺腑,人就危险了。沿袭了那么多年的战略,成就了微软和他的下游开发商,也害了微软,让微软想改变都改变不了。就像一辆陆地上上装甲车,装甲越厚越坚固,然而现在要到水里开战了,所有装甲一夜之间全成了负担,要寻求救赎,除非把自己从头到尾全拆了才行。进入2009年后,看到当年一致支持自己标准的下游开发商们,粉粉判离微软转投敌营时,微软深刻的意识到,老天已经再也不像原来一样眷顾微软了,这真可谓是:成也萧何,败也萧何!&br&&br&&b&微软的选择&/b&&br&&br&人什么时候会感觉到压力?就是拥有一个东西,但是看着这个东西一天天的减少,越努力抓住他,却又越抓流失的越快,改变意味着放弃,等待意味着死亡。在这样的压力下,微软昏招迭出,这并不能怪微软高管愚昧,也不能说微软运气差,而是自从步入 2000年以后,沿袭了几十年的一家统治世界的战略与时代变得格格不如了。早年的成功让微软无视各种问题,继续靠惯性又活了15年,错过了自我救赎的最佳时机。&br&&br&核心战略出问题,不是一朝一夕的决策对错,很多人还不愿意承认,认为换了鲍尔默就能解决,认为开源 .Net,就能救 C#,就能救微软,其实这是一个天真的想法。微软战略从头到尾就没变过,开源其实相当于承认先前战略是失败的,可它却又没有提出一套新的思路和新的战略。事实上早在2000年时微软就进入了战略迷茫期,所以东一榔头西一棒子,没有重点,缺乏主题。虽然如此,还是能靠惯性继续生存,但是自我否定之后,新战略是什么呢?战略层的自我否定会极大的伤害企业向心力,让微软在未来变得更加艰难,同时又没有确立能够经得住实践验证的新战略,这又会使整个企业变得比原来更加迷茫。&br&&br&但微软能改变么?不能。微软没有办法提出一套和原来战略不兼容的新战略,除非完全把自己和多年经营的生态链砸碎。15年前的最佳改变期被其错过后,如今再怎么变都只能在原有战略框架下寻求小改变,时代的巨流,象一股巨大的引力场,吸引着身躯庞大的微软,无可奈何的掉进自己挖的坑里。&br&&br&&b&无可奈何的结局&/b&&br&&br&直接送货上门发达了,便利店就萧条了。网上购物兴起了,实体零售业也就死亡了。这就叫做 “新经济体” 代替老经济体。判断一个经济体是否衰落,看的从来不是它银行里还有多少钱,而是看它的商业模式是不是还成立。如今的微软,就是一个核心商业模式被颠覆了的企业。这不是开源能够救得了的,更不是盖茨复出能够救得了的。&br&&br&听到微软开源,让我想起之前 Sun公司 Solaris开源为 Open Solaris,希望用开源来挽救自己的颓势,没多久它就倒闭了。如今一项根本技术,比如操作系统,已经很难被一家公司所垄断。商业模式一旦被颠覆了,开源也不能成为救命稻草。&br&&br&事物强弱变换,新旧更替,本来就是自然界的基本规律。盖茨是一个聪明人,看到了未来的局面,知道什么叫月满则亏,水盈则溢,在微软最鼎盛的时候功成身退,高风亮节的做起了慈善,将最苦的差事留给了鲍尔默。所以,聪明的盖茨也是不会复出的,所以,其实我挺同情老鲍的。&br&&br&&b&结尾故事&/b&&br&&br&一开始就没想喷微软,我不是一个极端的人,一开始只是回答问题,建议题主用 Qt,远离微软的技术。但是完蛋了,一堆人上来围攻,那我真得正儿八经的把微软这事情说的清楚点才行了,否则我变成误导题主了。&br&&br&其实世界是欢迎微软改变的,我们这些从小学电脑就用着盗版微软系统的人,对微软也还是有感情的。但是微软这次能否迎来新生,还得看微软自己,我们是帮不了他的。&br&&br&最后,给大家分享个小故事:&br&&figure&&img src=&/a4e6e0fd43aa_b.jpg& data-rawwidth=&268& data-rawheight=&329& class=&content_image& width=&268&&&/figure&&br&&blockquote&尼古拉·特斯拉(Nikola Tesla,1856年~1943年),被西方科学界的精英人物誉为是唯一堪比达·芬奇并超越爱因斯坦的伟大科学家,是人类有史以来最伟大的天才、发明创造的巨匠,但由于他身上同时也具有某种神秘甚至超自然的特质,也有人称他为神秘怪客或超人。是他发明和创造了交流电系统,对现代世界工业产生了深远影响。特斯拉引起的革命不仅限于电力工程,也涉及其他领域。他在科学和工程学领域取得了大约1000项发明。&/blockquote&&br&尼古拉·特斯拉,交流电的发明者,当年毅然选择放弃交流电专利带给他的暴利,将交流电公诸于众,从此交流电变成了一项免费的发明。因为他觉得,交流电这么基本的东西,是属于全人类的。如果当年特斯拉选择不开放交流电专利,那估计我们今天的社会,都得倒退一百年。&br&&br&一百年后的特斯拉汽车公司,在
Elon Musk 的领导下将自己领先世界的电动车发动机专利向世界开放,同样也是觉得电池车这种东西,是应该属于全人类的。而公司名称选作 “特斯拉” 也代表着向一百年前的 尼古拉·特斯拉致敬。
更新:擦,本来只有一句话,推荐Qt,远离微软,有人追问,补充了点,有人又追问,又补充了点,然后出了趟门回来,感觉跟捅了马蜂窝一样。既然都说到微软了,那就接着展开一下。 问题的本源 微软就是战线太长了,忙着去主导各种标准,制订各种框架,这样的话…
&p&这题不应该放到&b&新媒体艺术(new media arts)、生成艺术(generative arts)&/b&下头么!
都闪开,让新媒体艺术来一发!&/p&&p&前面先放成熟作品。都用了不仅仅一种算法。后面会有几个简单的带代码的。&/p&&p&先砸图 ( 因为都是代码写出来的,所以其实都是动画, 甚至是实时交互的,但是我这里为了方便,而且大部分资源都在vimeo/youtube,所以就只贴图了 ,有兴趣的自己去科学上网吧!)&/p&&p&先来几张Casey Reas的:&/p&&figure&&img src=&/v2-1c378f90f73d6e397f4ad742c273bba2_b.jpg& data-rawwidth=&600& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-1c378f90f73d6e397f4ad742c273bba2_r.jpg&&&/figure&&p&&i&Microimage&/i&&/p&&br&&figure&&img src=&/v2-96dd6c76e292bd8c86aa5ac1bebeb5c2_b.jpg& data-rawwidth=&1210& data-rawheight=&683& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/v2-96dd6c76e292bd8c86aa5ac1bebeb5c2_r.jpg&&&/figure&&p&&i&KNBC&/i&&/p&&figure&&img src=&/v2-30faf7df00fa47c2c269c_b.jpg& data-rawwidth=&1210& data-rawheight=&1068& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/v2-30faf7df00fa47c2c269c_r.jpg&&&/figure&&p&&i&Ideology&/i&&/p&&figure&&img src=&/v2-efdb6bcbb9d39038b06ca_b.jpg& data-rawwidth=&600& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-efdb6bcbb9d39038b06ca_r.jpg&&&/figure&&p&&i&Process 9&/i&&/p&&br&&p&Reas这位就是大名鼎鼎的Processing语言的创始人(虽然说是语言,其实内核是Java, 把很多需要很多步才可以的功能简化了,比如说画一条线,就是 line(x1, y1, x2, y2) 这么简单, x1,y1就是第一个点的X,Y 坐标, x2, y2 就是第二个点的xy坐标。)&/p&&figure&&img src=&/v2-45d2d9ce9b810fbfa3dcadf6_b.png& data-rawwidth=&1334& data-rawheight=&1188& class=&origin_image zh-lightbox-thumb& width=&1334& data-original=&/v2-45d2d9ce9b810fbfa3dcadf6_r.png&&&/figure&&br&&p&上面就是processing 的界面,相当新手友好,几行代码就出来一个美丽的图形。&/p&&br&&br&&p&然后,上面很多朋友都贴了Fractal, 就这样子的:&/p&&figure&&img src=&/v2-ec877164dda9f77e754e52a4b7e3d97e_b.png& data-rawwidth=&962& data-rawheight=&904& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&/v2-ec877164dda9f77e754e52a4b7e3d97e_r.png&&&/figure&&br&&p&其实,稍微调教一下颜色,加一些贴图,打一下光,然后加一个维度,可以玩的更嗨。&/p&&p&你看,这里有个新媒体艺术家专门做Fractal的。他还把这些东西做成了VR体验。&/p&&figure&&img src=&/v2-eaea056bfdedc842c05675d_b.png& data-rawwidth=&500& data-rawheight=&281& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-eaea056bfdedc842c05675d_r.png&&&/figure&&br&&br&&br&&figure&&img src=&/v2-71c2aad0dc2fc1afd561e23_b.jpg& data-rawwidth=&1366& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1366& data-original=&/v2-71c2aad0dc2fc1afd561e23_r.jpg&&&/figure&&br&&figure&&img src=&/v2-0adeda690f08b7a2487ba_b.png& data-rawwidth=&1910& data-rawheight=&1148& class=&origin_image zh-lightbox-thumb& width=&1910& data-original=&/v2-0adeda690f08b7a2487ba_r.png&&&/figure&&br&&br&&p&对他作品有兴趣的可以去他网站看,类似的有很多。
&a href=&///?target=http%3A//www./& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Julius Horsthuis&i class=&icon-external&&&/i&&/a&&/p&&p&在生成艺术里,Fractal是个很好用的算法,另外一个特别特别好用的,就是&b&Perlin Noise.&/b&&/p&&p&这个noise屌就屌在它的产出非常的自然,如果你用普通的随机函数,你得到这么一张图:&/p&&figure&&img src=&/v2-4e46a0107cdf88bfa6d4ac603be6e31b_b.png& data-rawwidth=&256& data-rawheight=&256& class=&content_image& width=&256&&&/figure&&p&但是你用perlin Noise你得到这样一张图&/p&&figure&&img src=&/v2-fade35d7dd1ab866e75b1_b.png& data-rawwidth=&500& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-fade35d7dd1ab866e75b1_r.png&&&/figure&&p&非常自然。然后利用它,再加一个维度,你就得到看起来很真是的地理构造:&/p&&figure&&img src=&/v2-64d23dfabe92fa31fb39bd1ac0b3ef1e_b.jpg& data-rawwidth=&450& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/v2-64d23dfabe92fa31fb39bd1ac0b3ef1e_r.jpg&&&/figure&&p&能想象这个凹凸就是一个noise就生成出来的东西么(天空是贴图)?&/p&&p&然后你再让它的函数演变一下:&/p&&figure&&img src=&/895f3ff83ebabcb9d550bda9afd5216c_b.jpg& data-rawwidth=&600& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/895f3ff83ebabcb9d550bda9afd5216c_r.jpg&&&/figure&&p&可能性是无穷的。其实前面我所有贴的东西,几乎都有用到这个Noise,只要你想让东西起来自然却又很随机,这个就是很好用的。&/p&&p&然后,说完了算法味儿特别重的,下面是数据味的:&/p&&p&首先是Marius Watz, 平面设计背景,自学成才。&/p&&figure&&img src=&/v2-278e8e2fbe_b.png& data-rawwidth=&600& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-278e8e2fbe_r.png&&&/figure&&figure&&img src=&/v2-ba95b8bcefbb7e9b0600c6_b.jpg& data-rawwidth=&750& data-rawheight=&583& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&/v2-ba95b8bcefbb7e9b0600c6_r.jpg&&&/figure&&figure&&img src=&/v2-f43aa43ca73edab3d9738f6_b.jpg& data-rawwidth=&800& data-rawheight=&533& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-f43aa43ca73edab3d9738f6_r.jpg&&&/figure&&br&&br&&p&其实大家也发现了,生成艺术的法宝就是&b&重复&/b&加看起来自然的&b&随机。&/b&&/p&&br&&p&然后,毫无羞耻的放一个自己上半年做的一个项目。一个机械数码装置,自动生成的图像和文字,自己动的鼠标+自己敲自己的键盘,还有自动24/7全天候接受程序发来的打印任务的打印机。&/p&&figure&&img src=&/v2-26a12f509e38c554daaf2_b.jpg& data-rawwidth=&1400& data-rawheight=&934& class=&origin_image zh-lightbox-thumb& width=&1400& data-original=&/v2-26a12f509e38c554daaf2_r.jpg&&&/figure&&br&&br&&p&除了算法是事先写好的,内容都是生成的或者网上随机抓的。不同于上面的风格,我想让把生成的东西看起来特别像是人类设计师的作品。装置放在那里跑了一星期,生成了几千张海报:&/p&&br&&figure&&img src=&/v2-1e9bc807f16f_b.png& data-rawwidth=&1146& data-rawheight=&1806& class=&origin_image zh-lightbox-thumb& width=&1146& data-original=&/v2-1e9bc807f16f_r.png&&&/figure&&br&&p&技术上除了语法生成器 ( 给标题用) glitch art ( 有些背景) ,剩下的排版什么的,很大程度上还是依赖于perlin noise, 这样有一种很有机的随机感觉。像是创意人设计出来的海报。&/p&&br&&p&------------
&b&手好酸,下面贴几个我们敬爱的dan shiffman的简单教程:&/b&
都是最基本的例子,想试试的就去&a href=&///?target=https%3A//processing.org/download/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Download \ Processing.org&i class=&icon-external&&&/i&&/a&下载processing吧!&/p&&br&&br&&br&&p&&b&首先当然是recursive&/b&&/p&&br&&figure&&img src=&/v2-a6883ebddfb1bbf722df3_b.png& data-rawwidth=&704& data-rawheight=&572& class=&origin_image zh-lightbox-thumb& width=&704& data-original=&/v2-a6883ebddfb1bbf722df3_r.png&&&/figure&&br&&br&&br&&br&&div class=&highlight&&&pre&&code class=&language-java&& &span class=&n&&strokeWeight&/span&&span class=&o&&(&/span&&span class=&mi&&2&/span&&span class=&o&&);&/span&
&span class=&n&&line&/span&&span class=&o&&(&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&o&&-&/span&&span class=&n&&len&/span&&span class=&o&&);&/span&
&span class=&c1&&// Move to the end of that line&/span&
&span class=&n&&translate&/span&&span class=&o&&(&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&o&&-&/span&&span class=&n&&len&/span&&span class=&o&&);&/span&
&span class=&n&&len&/span& &span class=&o&&*=&/span& &span class=&mf&&0.66&/span&&span class=&o&&;&/span&
&span class=&c1&&// All recursive functions must have an exit condition!!!!&/span&
&span class=&c1&&// Here, ours is when the length of the branch is 2 pixels or less&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&len&/span& &span class=&o&&&&/span& &span class=&mi&&2&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&pushMatrix&/span&&span class=&o&&();&/span&
&span class=&c1&&// Save the current state of transformation (i.e. where are we now)&/span&
&span class=&n&&rotate&/span&&span class=&o&&(&/span&&span class=&n&&theta&/span&&span class=&o&&);&/span&
&span class=&c1&&// Rotate by theta&/span&
&span class=&n&&branch&/span&&span class=&o&&(&/span&&span class=&n&&len&/span&&span class=&o&&);&/span&
&span class=&c1&&// Ok, now call myself to draw two new branches!!&/span&
&span class=&n&&popMatrix&/span&&span class=&o&&();&/span&
&span class=&c1&&// Whenever we get back here, we &pop& in order to restore the previous matrix state&/span&
&span class=&c1&&// Repeat the same thing, only branch off to the &left& this time!&/span&
&span class=&n&&pushMatrix&/span&&span class=&o&&();&/span&
&span class=&n&&rotate&/span&&span class=&o&&(-&/span&&span class=&n&&theta&/span&&span class=&o&&);&/span&
&span class=&n&&branch&/span&&span class=&o&&(&/span&&span class=&n&&len&/span&&span class=&o&&);&/span&
&span class=&n&&popMatrix&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&br&&p&再来个perlin noise的:&/p&&figure&&img src=&/v2-286b76b45ac7befce1a81943_b.png& data-rawwidth=&1012& data-rawheight=&1010& class=&origin_image zh-lightbox-thumb& width=&1012& data-original=&/v2-286b76b45ac7befce1a81943_r.png&&&/figure&&br&&p&(这个下面的代码复制粘贴到你的Processing里面可以直接跑哦!)&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span class=&c1&&// adapted from http://openprocessing.org/sketch/2785&/span&
&span class=&c1&&// alexis farmer 2014&/span&
&span class=&kt&&int&/span&
&span class=&n&&nPoints&/span&
&span class=&o&&=&/span& &span class=&mi&&4096&/span&&span class=&o&&;&/span&
&span class=&c1&&// points to draw&/span&
&span class=&kt&&float&/span& &span class=&n&&complexity&/span& &span class=&o&&=&/span& &span class=&mi&&8&/span&&span class=&o&&;&/span&
&span class=&c1&&// wind complexity&/span&
&span class=&kt&&float&/span& &span class=&n&&maxMass&/span&
&span class=&o&&=&/span& &span class=&o&&.&/span&&span class=&mi&&8&/span&&span class=&o&&;&/span&
&span class=&c1&&// max pollen mass&/span&
&span class=&kt&&float&/span& &span class=&n&&timeSpeed&/span&
&span class=&o&&=&/span& &span class=&o&&.&/span&&span class=&mi&&02&/span&&span class=&o&&;&/span&
&span class=&c1&&// wind variation speed&/span&
&span class=&kt&&float&/span& &span class=&n&&phase&/span&
&span class=&o&&=&/span& &span class=&n&&TWO_PI&/span&&span class=&o&&;&/span& &span class=&c1&&// separate u-noise from v-noise&/span&
&span class=&kt&&float&/span& &span class=&n&&windSpeed&/span&
&span class=&o&&=&/span& &span class=&mi&&40&/span&&span class=&o&&;&/span& &span class=&c1&&// wind vector magnitude for debug&/span&
&span class=&kt&&int&/span&
&span class=&n&&step&/span&
&span class=&o&&=&/span& &span class=&mi&&10&/span&&span class=&o&&;&/span& &span class=&c1&&// spatial sampling rate for debug&/span&
&span class=&kt&&float&/span&&span class=&o&&[]&/span& &span class=&n&&pollenMass&/span&&span class=&o&&;&/span&
&span class=&kt&&float&/span&&span class=&o&&[][]&/span& &span class=&n&&points&/span&&span class=&o&&;&/span&
&span class=&kt&&void&/span& &span class=&nf&&setup&/span&&span class=&o&&()&/span&
&span class=&o&&{&/span&
&span class=&n&&size&/span&&span class=&o&&(&/span& &span class=&mi&&512&/span&&span class=&o&&,&/span& &span class=&mi&&512&/span&&span class=&o&&,&/span& &span class=&n&&P2D&/span& &span class=&o&&);&/span&
&span class=&n&&points&/span&
&span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&kt&&float&/span&&span class=&o&&[&/span&&span class=&n&&nPoints&/span&&span class=&o&&][&/span&&span class=&mi&&2&/span&&span class=&o&&];&/span&
&span class=&n&&pollenMass&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&kt&&float&/span&&span class=&o&&[&/span&&span class=&n&&nPoints&/span&&span class=&o&&];&/span&
&span class=&k&&for&/span&&span class=&o&&(&/span& &span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&nPoints&/span&&span class=&o&&;&/span& &span class=&n&&i&/span&&span class=&o&&++&/span& &span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&n&&points&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&]&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&kt&&float&/span&&span class=&o&&[]{&/span&&span class=&n&&random&/span&&span class=&o&&(&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&width&/span&&span class=&o&&),&/span& &span class=&n&&random&/span&&span class=&o&&(&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&height&/span&&span class=&o&&)};&/span&
&span class=&n&&pollenMass&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&]&/span& &span class=&o&&=&/span& &span class=&n&&random&/span&&span class=&o&&(&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&maxMass&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&n&&noiseDetail&/span&&span class=&o&&(&/span&&span class=&mi&&14&/span&&span class=&o&&);&/span&
&span class=&n&&background&/span&&span class=&o&&(&/span&&span class=&mi&&255&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kt&&void&/span& &span class=&nf&&draw&/span&&span class=&o&&()&/span&
&span class=&o&&{&/span&
&span class=&kt&&float&/span& &span class=&n&&t&/span& &span class=&o&&=&/span& &span class=&n&&frameCount&/span& &span class=&o&&*&/span& &span class=&n&&timeSpeed&/span&&span class=&o&&;&/span&
&span class=&n&&stroke&/span&&span class=&o&&(&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&mi&&10&/span& &span class=&o&&);&/span&
&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&nPoints&/span&&span class=&o&&;&/span& &span class=&n&&i&/span&&span class=&o&&++)&/span&
&span class=&o&&{&/span&
&span class=&kt&&float&/span& &span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&points&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&][&/span&&span class=&mi&&0&/span&&span class=&o&&];&/span&
&span class=&kt&&float&/span& &span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&points&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&][&/span&&span class=&mi&&1&/span&&span class=&o&&];&/span&
&span class=&kt&&float&/span& &span class=&n&&normx&/span& &span class=&o&&=&/span& &span class=&n&&norm&/span&&span class=&o&&(&/span&&span class=&n&&x&/span&&span class=&o&&,&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&width&/span&&span class=&o&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&normy&/span& &span class=&o&&=&/span& &span class=&n&&norm&/span&&span class=&o&&(&/span&&span class=&n&&y&/span&&span class=&o&&,&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&height&/span&&span class=&o&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&u&/span& &span class=&o&&=&/span& &span class=&n&&noise&/span&&span class=&o&&(&/span&&span class=&n&&t&/span& &span class=&o&&+&/span& &span class=&n&&phase&/span&&span class=&o&&,&/span& &span class=&n&&normx&/span& &span class=&o&&*&/span& &span class=&n&&complexity&/span& &span class=&o&&+&/span& &span class=&n&&phase&/span&&span class=&o&&,&/span& &span class=&n&&normy&/span& &span class=&o&&*&/span& &span class=&n&&complexity&/span& &span class=&o&&+&/span& &span class=&n&&phase&/span&&span class=&o&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&v&/span& &span class=&o&&=&/span& &span class=&n&&noise&/span&&span class=&o&&(&/span&&span class=&n&&t&/span& &span class=&o&&-&/span& &span class=&n&&phase&/span&&span class=&o&&,&/span& &span class=&n&&normx&/span& &span class=&o&&*&/span& &span class=&n&&complexity&/span& &span class=&o&&-&/span& &span class=&n&&phase&/span&&span class=&o&&,&/span& &span class=&n&&normy&/span& &span class=&o&&*&/span& &span class=&n&&complexity&/span& &span class=&o&&+&/span& &span class=&n&&phase&/span&&span class=&o&&);&/span&
&span class=&kt&&float&/span& &span class=&n&&speed&/span& &span class=&o&&=&/span& &span class=&o&&(&/span& &span class=&mi&&1&/span& &span class=&o&&+&/span& &span class=&n&&noise&/span&&span class=&o&&(&/span& &span class=&n&&t&/span&&span class=&o&&,&/span& &span class=&n&&u&/span&&span class=&o&&,&/span& &span class=&n&&v&/span& &span class=&o&&)&/span& &span class=&o&&)&/span& &span class=&o&&/&/span& &span class=&n&&pollenMass&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&];&/span&
&span class=&n&&x&/span& &span class=&o&&+=&/span& &span class=&n&&lerp&/span&&span class=&o&&(&/span& &span class=&o&&-&/span&&span class=&n&&speed&/span&&span class=&o&&,&/span& &span class=&n&&speed&/span&&span class=&o&&,&/span& &span class=&n&&u&/span& &span class=&o&&);&/span&
&span class=&n&&y&/span& &span class=&o&&+=&/span& &span class=&n&&lerp&/span&&span class=&o&&(&/span& &span class=&o&&-&/span&&span class=&n&&speed&/span&&span class=&o&&,&/span& &span class=&n&&speed&/span&&span class=&o&&,&/span& &span class=&n&&v&/span& &span class=&o&&);&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span& &span class=&n&&x&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span& &span class=&o&&)&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&width&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&o&&;&/span&
&span class=&k&&else&/span& &span class=&k&&if&/span& &span class=&o&&(&/span& &span class=&n&&x&/span& &span class=&o&&&=&/span& &span class=&n&&width&/span&&span class=&o&&)&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span& &span class=&n&&y&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span& &span class=&o&&)&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&height&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&o&&;&/span&
&span class=&k&&else&/span& &span class=&k&&if&/span& &span class=&o&&(&/span& &span class=&n&&y&/span& &span class=&o&&&=&/span& &span class=&n&&width&/span&&span class=&o&&)&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&n&&point&/span&&span class=&o&&(&/span&&span class=&n&&x&/span&&span class=&o&&,&/span& &span class=&n&&y&/span&&span class=&o&&);&/span&
&span class=&n&&points&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&][&/span&&span class=&mi&&0&/span&&span class=&o&&]&/span& &span class=&o&&=&/span& &span class=&n&&x&/span&&span class=&o&&;&/span&
&span class=&n&&points&/span&&span class=&o&&[&/span&&span class=&n&&i&/span&&span class=&o&&][&/span&&span class=&mi&&1&/span&&span class=&o&&]&/span& &span class=&o&&=&/span& &span class=&n&&y&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&kt&&void&/span& &span class=&nf&&mousePressed&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&setup&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&br&&p&这里有更多简单好看的例子:
&a href=&///?target=http%3A//abandonedart.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Generative Art
(AbandonedArt.org)&i class=&icon-external&&&/i&&/a&&/p&&p&有兴趣的,可以去下载一个Processing 的IDE, 不要钱,体积也很小。下载链接在上面。想系统学的话可以看书,书的话,可以先从shiffman的&learning processing&看起,或者&Nature of Code&,
各种模仿自然的简单算法,真的炒鸡简单。我12年入坑,之前完全是平面背景,但是现在已经无法自拔了。&/p&&p&好了今天说的逻辑好混乱,希望大家看到自己喜欢的东西,然后入坑,然后发现编程的乐趣。其实写程序还是挥画笔都是个工具而已,目的还是自我表达。&/p&&br&&p&有兴趣想入坑需要更多信息的可以私信我,欢迎纽约面基。&/p&&br&&p&啊。&/p&
这题不应该放到新媒体艺术(new media arts)、生成艺术(generative arts)下头么!
都闪开,让新媒体艺术来一发!前面先放成熟作品。都用了不仅仅一种算法。后面会有几个简单的带代码的。先砸图 ( 因为都是代码写出来的,所以其实都是动画, 甚至是实时交互…
谢邀(终于用上这个高大上的词汇了,真的有点小激动呢)&br&&br&WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。&br&而且封装得也不完全,还是随处可见 HWND HDC之类的东西。&br&用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比如我写过一个小框架用来做安装卸载程序,非常小,其中创建管理窗口部分是用WTL的。&br&&br&MFC是更高级点的Win API封装,比WTL封装彻底,很难见到HWND HDC了,也提供了不少实用工具类,比如高级控件,泛型容器,IO访问,网络协议等。除此之外,还提供了一些基本框架,比如 Document/View,这就是个MVC的简化版本,只有MV,但是对于数据的管理,消息的传递等又没有什么约束,导致Doc/View被用得乱七八糟。尤其是对事件处理的模型,消息映射是功能简陋,而且容易出错的方式,唯一优点是性能好。 从VC++ 1.X就有MFC了,那时整个UI界的设计思想都比较落后(除了Apple),MFC又背负了沉重的兼容性包袱,比如vc++ 1.52的MFC程序到了vc2003稍加修改都可以编译,导致MFC后期没有什么发展,就是沿着老的思路完善了些细节,添加了些组件,但是根本性的设计问题没有改进。&br&&br&GTK,这个吃了语言的亏,用C写面向对象实在是痛苦,虽然在思想上比MFC要先进了些,但是写出来的代码比MFC要罗嗦很多了。相比MFC,多了Layout的概念,事件处理上有了Signal/slot,虽然用起来很麻烦。&br&&br&wxWidgets,这个基本就是个跨平台的MFC,对各个平台的差异做了抽象,实际上后端大多还是用平台原生的API实现,好多控件都是直接用系统原生的。有wxWidgets for GTK+的版本,后端就是GTK+,wxWidgets就是一层壳。这也是wxWidgets的优点,它编译出来的程序发行包比较小,性能也不错。&br&&br&以上这些就是上世纪90年代的UI Framework技术水平了,至今它们也依然没有太多进步。&br&下面来谈谈21世纪的技术。&br&&br&Qt,虽然它也是上世纪90年代出现的,但是它在21世纪有了长足的进步。应该说它的起点就比较高,一开始就定位跨平台,而且不满足于简单封装系统API,而是要自己创造出一套完整的API和框架,甚至要代替系统API,所以不仅仅是做UI,而是涉及到了APP开发所用到的所有东西,包括网络,数据库,多媒体,脚本引擎等。signal/slot是Qt发明的,这是事件通知模型里C++语言的最佳实现了,甚至我都觉得这该写进C++标准,估计C++委员会的老顽固们是从不写GUI的。&br&早期的QT也是没有DirectUI的概念的,每一个QWidget都对应一个原生窗口,从Qt4.4开始,只有顶层QWidget才是原生窗口,而Child Widget是Alien Widget,只是个抽象的图层不对应原生窗口,这就实现了DirectUI的概念,很多图形效果也就变得可能了,比如窗口层叠透明效果。&br&在4.8后实现了QPA(Qt Platform Abstraction),这就使移植Qt变得很容易,目前Qt是支持平台最多的框架没有之一。&br&由于早期授权的问题,Qt对于开源社区不是很友好,导致推广不太顺利,直到它改成了LGPL方式,如果Qt能早点想开了,恐怕就没有wxWidgets的生存空间了。&br&Qt的缺点也是有的,就是太大,不过可以自己剪裁,我可以把QT库剪裁到发行包压缩后2.5MB。&br&&br&WPF,微软在Win Form的思路上走到死胡同后,终于痛下决心用正确的方法开发UI库了。21世纪的UI一定是定义出来的,绝对不能是代码写出来的,所以有了XAML这个强大的定义工具,不但可以定义UI布局,还包括图形动画效果,消息响应方式等。配合C#这种优秀的语言,更是如虎添翼。但是问题也很明显,就是过于庞大,不仅开发时要用到庞大的IDE和设计工具,发行的安装包也十分巨大,所以目前还是很少有人拿他写通用软件客户端的,大多是做企业项目时写专用客户端。&br&大概4-5年前吧疼讯曾经用WPF写了个QQ,但是只实现了基本功能就已经比C++客户端大好多了,而且运行缓慢,主要是太吃内存,而且那时WPF的优化还不充分。&br&&br&最后我想补充下真正的UI库之王,cocoa。&br&Apple的成功有很多原因,其中之一就是cocoa,cocoa理念十分先进,而且出来得早,我都怀疑Qt和WPF有不少思想都是借鉴cocoa的。&br&定义式的UI,用xib就可以定义UI的绝大部分细节,而且提供所见即所得的可视化设计工具。&br&严格的MVC,而且定义非常清晰,分工明确。&br&signal/slot,虽然不叫这个名字,但思想就是,而且真的是拖动鼠标就能connect。&br&提供了ARC,闭包和反射,给UI开发带来巨大的便利性,当然这得益于Objective-C这个语言。&br&&br&再补充下 Borland的OWL和VCL。&br&我是从Borland C++3.0和Delphi 1.0开始用的,那时的Borland看来很有前途的,可惜后来一系列决策失误导致现在这个公司几乎消失了,同学们不要再往这个坑里跳了。&br&OWL曾经和MFC是竞争对手,设计思想也差不多,个人感觉OWL的API设计更优雅一点,但是在市场上OWL被MFC彻底击败。&br&Delphi是神作,它在RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi的特点就是简单、开发快,单纯就写个基本可用的应用来说,可能至今都没有比他更快的,但是缺点就是丑,基本大多数Delphi应用都是一大堆控件堆积在一起,很不美观,另外由于Pascal语言的限制无法和现有大量的C/C++代码融合。虽然后来有C++ Builder,但是Builder里简单和快的优点也消失了。Borland的C++编译器越做越差,导致后来开源项目都不太愿意兼容这个编译器了。&br&VCL准确地说不是UI库,而是一套组件接口规范,类似COM ActiveX。delphi和C++builder都是基于这个规范构建了基础库。&br&&br&UI库是个很大的话题,够写好几本书来探讨的,我这里就是随便写点自己的感受。&br&单纯讨论每个库的优劣是没有意义的,而是要放到具体的应用场景里来看,每个库都有自己擅长的场景。&br&&br&如果仅在Windows下,追求程序小巧,用WTL,不足的地方自己实现去吧,但是视觉效果就呵呵了。&br&如果可以大一点,还要好看点,那就Qt。&br&如果完全不在乎大小,只要视觉效果华丽,就用WPF,如果把开发工具价格也考虑进来,那么土豪才会选WPF呢。&br&MFC就是个鸡肋了,除非你现有的工程师不会用别的,或者有历史遗留代码要保持兼容。&br&&br&如果要求跨平台,那么就用Qt,wxWidgets和GTK+跟现在的Qt比起来没有什么优势了。&br&&br&如果是iOS Android,那么最好用原生UI库,除非你写游戏。
谢邀(终于用上这个高大上的词汇了,真的有点小激动呢) WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码…
&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Scratchapixel&i class=&icon-external&&&/i&&/a&&br&&br&我看到这个网站后,感动得要哭!这一个网站就够了!!好好珍惜吧!&br&&br&想学opengl, 就用这个网站&a href=&///?target=http%3A//ogldev.atspace.co.uk/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGL Step by Step&i class=&icon-external&&&/i&&/a&。非常赞!老外好无私!&br&&br&想学DX,就看‘Practical Rendering and Computation with Direct3D 11’。 这本书把pipeline讲得非常清晰。这是我见过最好的一本DX的书。 (小八卦,real-time rendering的作者曾把这书当礼物送给我同事)
我看到这个网站后,感动得要哭!这一个网站就够了!!好好珍惜吧! 想学opengl, 就用这个网站。非常赞!老外好无私! 想学DX,就看‘Practical Rendering and Computation with Direct3D 11’。 这本书把pipeline讲得非常…
我是来反对楼上某些答案的。&br&我曾经用MFC写了金山词霸(大约20多万行),又用Qt写了YY语音(大约100多万行),算是对两种框架都比较有经验。&br&纠正几个错误的认识。&br&&br&1. “用Qt写的程序编译比MFC慢”的说法是错误的&br&绝对错误,单位代码行数编译Qt远比MFC快得多,因为Qt库的头文件设计非常好,尽量都使用了前置声明,避免了头文件嵌套,几乎所有类都使用了公有类和私有类的设计,把没必要公开的声明放到私有头文件里,避免了编译时引入过多代码。而MFC没有这样的设计。&br&至于大家感觉MFC快主要原因是MFC工程默认打开了编译预处理头文件(PCH),但是这是VC编译器的特性,所有C++程序都可以用,不是MFC特有,Qt也可以使用 PCH&br&方法很简单,在你的 .pro 文件中加入一行&br&&blockquote&PRECOMPILED_HEADER = stable.h&/blockquote&指定 Stable.h这个头文件作为编译预处理文件,MFC里这个文件一般叫stdafx.h&br&然后在 stable.h里 包含你所用到的所有 Qt 头文件,如果你用了很多qt的类可以直接包含所有&br&比如 :&br&&blockquote&#include
&QtCore&&br&#include &QtGui&&/blockquote&这两个文件里又包含了几乎所有Qt常用类&br&不用担心,即使包含了所有头文件也没关系,有了PCH再多头文件也没影响。&br&&br&如果你还想编译再快点,可以在 .pro里加入下面一行&br&&blockquote&QMAKE_CXXFLAGS += /MP&/blockquote&指定/mp编译选项,编译器将使用并行编译,同时起多个编译进程并行编译不同的cpp&br&&br&而且QT这种引入PCH的方法比MFC的好,由于MFC的PCH选项是每个工程逐个指定的,很容易被某些人搞坏,我曾经无数次修复PCH问题,但是Qt的选项是写在.pro里的,写一次就永远不会错。&br&MFC一旦弄坏了PCH,编译也慢得令人发指。&br&&br&给个参考时间吧,YY最新版本大约 100多万行C++代码,rebuild debug和releae总共需要20多分钟,机器是i5 四核SSD硬盘。其实对于大项目硬盘才是瓶颈,如果换机械硬盘要慢差不多70%,有个同事用10G内存做了个内存盘编译,还能快30%。&br&&br&如果你比这个慢,请检查自己的代码问题。&br&&br&2. “QT本身编译慢”的说法是错的&br&Qt本身其实编译并不慢,慢的是webkit库和例子程序,你如果不改任何选项默认是会编译所有的,webkit本身就是个恐龙级项目,用了太多泛型技术,编译非常慢。另外Qt里附带了数百个例子工程,都编译一边也很慢。如果仅编译QT核心库是很快的,比如QtCore只需要1分钟,QtGui大约5分钟。&br&&br&送个福利(仅限windows vc++ 2008):&br&&blockquote&configure.exe -qt-libjpeg -qt-zlib -qt-libpng -qt-libjpeg -qt-gif -no-libtiff -no-libmng -nomake examples -nomake demos -no-webkit -nomake doc -no-plugin-manifests -no-exceptions -no-rtti -no-qt3support -no-openssl -no-opengl -no-multimedia -no-3dnow -no-native-gestures -no-style-motif -no-style-cde -no-style-cleanlooks -no-style-plastique -no-sql-sqlite -no-dbus -platform win32-msvc2008&/blockquote&&br&这是我自己用的Qt编译前的配置命令行,把我自己用不到的都去掉了,这样配置编译就快很多了。&br&我把 webkit examples demos 等大家伙都去掉了。如果你真的需要这些,可以安装Qt sdk里面有编译好的版本。&br&&br&补充:Qt creator只是IDE,不是编译器,编译慢真的不关他的事,要看你具体用的编译器是什么。一般来说在Windows下就是minGW,也就是一个移植版本的GCC,的确是不如VC++里的CL快的。&br&如果是其它平台,那么编译器可以换成LLVM的clang,那就快很多了。&br&在Windows下来是用VC++吧,推荐VC2008,Qt和VC的IDE结合非常好,我现在的项目都是用VC2008+QT的,开发效率很高,记得装Visual Assist哦。&br&&blockquote&qmake -tp vc&br&&/blockquote&可以用 .pro生产 .vcproj的VC工程文件,可以用VC++打开编译。
我是来反对楼上某些答案的。 我曾经用MFC写了金山词霸(大约20多万行),又用Qt写了YY语音(大约100多万行),算是对两种框架都比较有经验。 纠正几个错误的认识。 1. “用Qt写的程序编译比MFC慢”的说法是错误的 绝对错误,单位代码行数编译Qt远比MFC快得…
台词是没什么问题,但是没穿t恤裤衩人字拖总感觉哪里不太协调。
台词是没什么问题,但是没穿t恤裤衩人字拖总感觉哪里不太协调。
&p&2013年在QQ开发中心的最后一个项目就是把QQ整个Solution从VS2005升级到VS2010,包括SDK兼容修改,彻底去MFC,主要是我一个人完成,组长lorischen给了不少帮助。当时的QQ整个应用层solution大概有60个左右的projects,其中包含MFC的项目我记得好像只有3个,主要是跟TXPlaform相关的,用于和浏览器插件交互的,去MFC的方法就是转换成ATL。&/p&&p&&br&&/p&&p&QQ 确实没有使用MFC/Qt这种第三方框架,目前使用的是完全自己撸的第三代Hummer框架,其中UI框架叫做GF,基于DUI理念设计的。Hummer框架是05年开始计划,一直到QQ2009才用上这个全新的框架。Hummer框架设计理念就是平台化,插件化,高性能。当时在职的时候我跟同事经常吐槽代码怎么这么烂,后来离开出来看看其他公司的代码才知道QQ无论从架构设计还是具体编码都是我目前为止参与过质量最高的项目了(也因为我后来经历的公司一个比一个烂,sigh)。&/p&&p&&br&&/p&&p&回到题目上,为什么不用QT/MFC?&/p&&p&&br&&/p&&p&从专业性上来讲&/p&&p&因为公司有实力和资源自主开发一个框架,这样可以不受制于人,并且根据自身业务特点对框架进行针对性的定制和性能优化,而且这也是大公司非常专业的做法。Client开发不像后台开发有很多可靠的开源解决方案,所以造轮子是十分必要的,而且可以造出来比市面上更好的轮子。为什么公司喜欢造轮子,因为造轮子才显得专业:&br&为什么很多公司做c++不用智能指针,也不自己封装一个好用的? - tishion的回答 - 知乎&br&&a href=&/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/question/3785&/span&&span class=&invisible&&6833/answer/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&从技术选型上来说&/p&&p&先说MFC,没饭吃只是对Win32 SDK的一个C++封装,并且提供了框架级别的Windows程序开发方法,可以说是Windows平台的第一代C++开发框架。既然只是封装,所以并不存在什么GUI框架,用MFC开发出来的GUI程序所有的UI渲染都是Windows原生的window,控件以及消息循环。MFC也的确提供了非常丰富的编程模块(&a href=&///?target=https%3A///en-us/cpp/mfc/hierarchy-chart& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hierarchy Chart&i class=&icon-external&&&/i&&/a&),如果QQ全部基于MFC来开发是肯定没有问题的。但是副作用是非常明显的,在今天来看MFC的缺点是性能会有很大的折扣,对于QQ这种内存密集型程序来说,用户体验会受到严重影响。但是在当时来说不用MFC的原因只有一点,MFC无论是动态库还是静态库生成的目标程序体积都会非常庞大(Windows系统本身不包含MFC库),在当年网络带宽并不富裕费用高昂的情况下MFC对成本的影响都非常大,这也是自从计算机行业进入互联网时代之后MFC一直被业界所诟病的缺点,微软自己都嫌MFC体积太大。&/p&&p&&br&&/p&&p&再来说Qt,这个过程我就没参与过了,不过可以猜测跟license有关,跟性能有关,当然也跟体积有关。不过从腾讯做产品的精细程度来说,任何臃肿的第三方框架都是不会被翻牌的。粉丝注意,我这里说的臃肿是指在完成一个需求的所有可行技术方案比较来说的。别怼我,我不懂Qt,就是负责过一两个基于Qt的产品的架构和开发而已(&a href=&///?target=https%3A//www.garena.sg/gpc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Garena&i class=&icon-external&&&/i&&/a&)。&/p&&p&&br&&/p&&p&最后一点,现在Client端的开发已经很少需要做这么彻底的基础框架了,都在往Web方向发展,目前来说也就中国的大公司能在PC产品上有这么深厚的技术积累和精细的用户体验。&/p&&p&我之前回答过一个问题关于MFC/QT:&br&能否比较一下常见C++开发框架的API风格? - tishion的回答 - &a href=&/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/question/3465&/span&&span class=&invisible&&3962/answer/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&-----------手动separator -----------&/p&&p&&b&不建议大家关注我,因为我点赞/关注/回答/提问的东西范围比较广泛,可能有些内容会引起关注者反感,如果纯粹是为了交流技术,我个人有个收藏夹,我把平时回答的所有跟技术相关的问题都收录到这个收藏夹子里了,有兴趣的可以关注:&a href=&/collection/& class=&internal&&tishion的技术笔记&/a&&/b&&/p&
2013年在QQ开发中心的最后一个项目就是把QQ整个Solution从VS2005升级到VS2010,包括SDK兼容修改,彻底去MFC,主要是我一个人完成,组长lorischen给了不少帮助。当时的QQ整个应用层solution大概有60个左右的projects,其中包含MFC的项目我记得好像只有3个,…
短平快的话:&br&&br&1. Electron:js开发界面,可用cpp扩展&br&2. PyQt5: Py开发界面,可用cpp扩展&br&3. QWebView:js开发界面,py cpp做后端(非界面部分)&br&&br&比开发速度,上面三个方案完爆c#&br&Qt5以后,Qt全面使用gpu加速绘制。&br&微软自己都很少用 WPF,做个 vscode还要去用 electron。&br&&br&界面脚本化是大势所趋,弄个界面就该快,改两行代码按个快捷就该跑起来,避免改个文件一编译就等半天,或者出个bug找两天:&br&&br&编码-测试-编码 这个核心工作流越短越好。上面三个方案都跨平台,况且人的时间本来就有限,上面几门技术学了你不亏,其他好多地方都用得上,关键是开发效率都比c#高。&br&&br&再比较下性能:&a href=&///?target=https%3A///watch%3Fv%3D8O-0k4MLKs8& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/watch?&/span&&span class=&invisible&&v=8O-0k4MLKs8&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& &br&Qt 5.6 MinGW 和 .NET 4.5 WPF 跑同一个测试,Qt 的速度是 WPF的两倍!&br&&br&主要是两个技术序列:&br&&br&1. 基于web技术的桌面产品,比如vscode,atom,Slack,网易云音乐,钉钉之类的成熟应用挺多,文档也丰富,问问题有人答,搜问题搜得到。&br&&br&&figure&&img src=&/v2-3e1fd19b3dc109ce9998fbe_b.png& data-rawwidth=&481& data-rawheight=&716& class=&origin_image zh-lightbox-thumb& width=&481& data-original=&/v2-3e1fd19b3dc109ce9998fbe_r.png&&&/figure&&br&短短两年间,这么多来自微软,Facebook, Slack,Docker等公司的桌面产品使用 Electron开发出来,更多的可以到:&a href=&///?target=http%3A//electron.atom.io/apps/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Electron Apps&i class=&icon-external&&&/i&&/a& 自己看。&br&&br&2. 基于PyQt的桌面产品:DropBox client, &a href=&///?target=https%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&R Studio&i class=&icon-external&&&/i&&/a&, &a href=&///?target=https%3A//en.wikipedia.org/wiki/Calibre_%2528software%2529& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Calibre&i class=&icon-external&&&/i&&/a&, &a href=&///?target=https%3A//en.wikipedia.org/wiki/Eric_Python_IDE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Eric Python IDE&i class=&icon-external&&&/i&&/a&, Spyder, &a href=&///?target=http%3A///ovo-catalog-creator-magento& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PDF Catalog Creator for Magento&i class=&icon-external&&&/i&&/a&,出活快,写小工具用它根飞一样,做专业系统可以和C++Qt无缝整合。&br&&br&&figure&&img src=&/236b60893fcdcc65318ace39d042c44f_b.png& data-rawwidth=&949& data-rawheight=&790& class=&origin_image zh-lightbox-thumb& width=&949& data-original=&/236b60893fcdcc65318ace39d042c44f_r.png&&&/figure&R Studio&br&&br&&figure&&img src=&/v2-bd55b2d357fd75dc311c1_b.png& data-rawwidth=&898& data-rawheight=&613& class=&origin_image zh-lightbox-thumb& width=&898& data-original=&/v2-bd55b2d357fd75dc311c1_r.png&&&/figure&Spyder &br&&br&上面两张 R Studio / Spyder 的截图,PyQt做的,不算简单吧,这界面,想看酷炫的可以去看 PyQt的 demo,不要觉得 PyQt有多大, DropBox客户端打包出来 24MB,比很多手机app都小。&br&&br&Electron 内核整合了 NodeJS,所有 NodeJS能用的模块 js都能用,比如:&br&&a href=&///?target=https%3A///node-ffi/node-ffi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&node-ffi/node-ffi&i class=&icon-external&&&/i&&/a& 模块,可以让你直接调用 C++写的动态库,不需要用C++写个node扩展:&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&ffi&/span& &span class=&o&&=&/span& &span class=&nx&&require&/span&&span class=&p&&(&/span&&span class=&s1&&'ffi'&/span&&span class=&p&&);&/span&
&span class=&kd&&var&/span& &span class=&nx&&libm&/span& &span class=&o&&=&/span& &span class=&nx&&ffi&/span&&span class=&p&&.&/span&&span class=&nx&&Library&/span&&span class=&p&&(&/span&&span class=&s1&&'libm'&/span&&span class=&p&&,&/span& &span class=&p&&{&/span&
&span class=&s1&&'ceil'&/span&&span class=&o&&:&/span& &span class=&p&&[&/span& &span class=&s1&&'double'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span& &span class=&s1&&'double'&/span& &span class=&p&&]&/span& &span class=&p&&]&/span&
&span class=&p&&});&/span&
&span class=&nx&&libm&/span&&span class=&p&&.&/span&&span class=&nx&&ceil&/span&&span class=&p&&(&/span&&span class=&mf&&1.5&/span&&span class=&p&&);&/span& &span class=&c1&&// 2&/span&
&span class=&c1&&// You can also access just functions in the current process by passing a null&/span&
&span class=&kd&&var&/span& &span class=&nx&&current&/span& &span class=&o&&=&/span& &span class=&nx&&ffi&/span&&span class=&p&&.&/span&&span }

我要回帖

更多关于 火狐无法安装插件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信