![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程语言
文章平均质量分 50
Nightmare
这个作者很懒,什么都没留下…
展开
-
C++并不支持Unicode,即使是utf8
时至今日,字符串使用unicode已经是不需要理由的常识,但对一些有着悠久历史的编程语言来说,这仍然是个头痛的问题。如果抛开第三方库的支持,C++其实并不能实际有效地支持unicode,即使是utf8。(注:本文讨论的是字符串在内存中的编码方案,而不是文件或网络数据流。)原创 2014-10-04 17:41:36 · 7298 阅读 · 2 评论 -
通过脚本自由设计游戏UI风格
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE原创 2010-02-24 20:59:00 · 2984 阅读 · 0 评论 -
CUDA术语Warp
CUDA里最基本的运行单位是thread,即线程,其英文的本意就是线。Warp是同时运行的一组线程的称呼。这里Warp的本意是编织物的纱线,或者轮胎表层橡胶里加固用的交错粗丝线。简单的说,就是一堆的线(thread),有交错。这个名字很好地隐喻了CUDA里线程的执行模式,线就是线程、线的交叉就是线程间的汇合点(sync point)。直译的话,就是 经纱 或 经编。个人觉得经编好一原创 2009-10-27 15:25:00 · 5187 阅读 · 2 评论 -
会变形的模块 之二
话题回到游戏开发领域。我们解决新问题时,经常会用我们已经熟识的方法。比如开始写一个游戏引擎——我们暂且把做游戏还是做引擎的问题放在一边——经常会从底层开始写,于是先写平台抽象,然后是图形、声音、网络,之后才开始写游戏核心,高层的模块依赖于底层的模块。这看似没有问题,你说呢? 问题一:从敏捷方法来看,这个引擎从开发到能跑起来的周期太长了,到整合时会有一个bug大爆发时期,会发原创 2009-08-24 14:11:00 · 1236 阅读 · 0 评论 -
会变形的模块 之一
Normal 0 7.8 pt 0 2 false false false EN-US ZH-CN X-NONE原创 2009-08-24 14:08:00 · 1367 阅读 · 1 评论 -
设计日志四:保留模式的逐渐完善
设计日志四:保留模式的逐渐完善到目前为止,选择保留模式的设计在3D场景和UI渲染上的表现都比较理想。虽然其中也有一些问题,但通过参考其他图形引擎、游戏引擎,以及UI框架如WPF,似乎主要的问题都已经有比较好的解决方案。另:保留模式其实应该翻译成“保持模式”,叫保留模式容易理解成“reserved mode”而不是“retained mode”。【资源共享】这个大家都比较原创 2009-07-17 18:15:00 · 2101 阅读 · 0 评论 -
设计日志二:脚本系统
设计日志二:脚本系统根据经验,修改程序的速度远远赶不上策划修改游戏设计的速度,如果用流程强制他们减慢改变的频率,也就限制了他们的创造力。如果能让他们自己做些修改和尝试,将大大提高游戏的整体开发效率。脚本系统正是用来解决这个问题。【脚本语言的选择】单说脚本系统是个很宽泛的概念,几行配置文件算是脚本,一个完整的编程语言支持也算脚本,Word里可以记录的宏也是脚本。让我们定义一下游戏引擎里需要的脚本系统原创 2009-03-08 12:25:00 · 3072 阅读 · 1 评论 -
.NET 3.5 SP1的发布让C#和C++的性能比较问题有了定论
一直以来对CLR即时编译生成的汇编码抱有很多疑问,很多地方并没有像微软声称的那样被优化,尤其是并没有内联(inline)。曾经猜想那是为了IDE能够调试而少做了一些优化,在不连接调试器的情况下应该能声称最优代码。随着.NET 3.5 SP1的发布,谜团终于解开了。.NET 2.0的CLR并没有对含有值类型(value type)参数、返回值或局部变量的函数做内联。当然,这也包括所有值类型的属性ge原创 2008-08-22 15:02:00 · 1935 阅读 · 0 评论 -
XmlSerializer中比SGen更深遂的问题
传说中,.NET的XmlSerializer使用方便功能强,我们一直用它。只不过,它需要在运行时编译出一个或多个专门用来解析XML的DLL。为了免除这部分运行时编译开销,便诞生了SGen,用来预先生成解析的DLL。但是,这里有几个没有说清楚的问题。首先,我们是不需要去手工引用并使用生成的*.XmlSerializer.DLL的。只要把它放在程序目录里,不需要修改原有代码,XmlSerializer原创 2008-05-20 10:10:00 · 1372 阅读 · 0 评论 -
序列化有event的类会是什么效果?
今天突然想到这个问题,.NET序列化有event的类会是什么效果?event会被序列化吗?感觉一般情况下event是不需要也不应该被序列化的,但event本质上就是自动生成的一对add和remove方法包装的一个delegate,而Delegate类型是可序列化的,编译器生成的Delegate的派生类也是可序列化的。那么event缺省情况下没有什么理由不会被序列化。那么到底事实是什么样的呢?事实是原创 2008-05-21 12:38:00 · 1918 阅读 · 0 评论 -
新的zh-Hans、zh-Hant与旧的zh-CHS、zh-CHT
从Windows Vista和.NET 2.0的MS07-040 security patch开始,中文语言标识将改为IETF标准的zh-Hans、zh-Hant,旧的标识zh-CHS、zh-CHT将继续支持一段时间,并将在将来的版本中去除。对Silverlight,将只支持新标识。注意:未打patch且未升至SP1的.NET 2.0不支持新标识。在支持新标识的系统上,线程culture为原创 2008-07-13 12:26:00 · 23345 阅读 · 2 评论 -
读Defective C++随笔 3
读Defective C++随笔 3不尽知用兵之害者,则不能尽知用兵之利也 ——《孙子兵法》 5.const完备问题对C来说,const看起来是很合理的,将参数声明成const的,可以利用编译器的语法检查避免一些不期望的修改错误,而且可能帮助编译器做一些优化。多数官方文献都强烈要求程序员编写const完备的C++代码,极力避免const_cast,但现实中大部分代码只能是基本使用了const。原创 2008-04-18 14:25:00 · 1496 阅读 · 3 评论 -
读Defective C++随笔 2
读Defective C++随笔 2不尽知用兵之害者,则不能尽知用兵之利也 ——《孙子兵法》3.不用抛异常就能避免C++异常的麻烦吗new T()会抛异常,也就是说,到处都可能抛出异常。既然内存都不够了,也不指望能继续运行了,所以似乎不是大问题。但如果是尝试分配大块内存时内存不过,程序还是可以继续运行的,捕获异常就很重要了。特别的一点是,虽然new会抛异常,但堆栈溢出却不会,程序将直接崩溃掉。原创 2008-04-16 16:17:00 · 1225 阅读 · 0 评论 -
读Defective C++随笔
读Defective C++随笔不尽知用兵之害者,则不能尽知用兵之利也 ——《孙子兵法》1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++的接口也只是把C的函数又包一层。既然大家都在用C++的编译器,为什么不直接提供C++的API?当初曾经做过一些编译C++DLL的尝试,印象中只是很麻烦,感觉像是编译器支持不好。其实,最核心的原因在于类的私有成员必原创 2008-04-16 13:00:00 · 1680 阅读 · 0 评论 -
一次C#和C++的实际应用性能比较
05年时,在微软的Rico Mariani做了一次实际应用的C#和C++的性能比较。事情起源于微软著名的元老Raymond Chen(在下敬仰的超级牛人)用C++写了一个英汉词典程序,来描述讲解优化C++程序的过程。他从一个代码简单直观的版本开始,不断测试优化,直到达到满意的性能。Rico Mariani使用相同的方式,但是使用C#做了相同的程序。结果是,Mariani的最初的简单直观版本的速度几翻译 2007-12-13 09:52:00 · 4127 阅读 · 3 评论 -
为什么不用C++写游戏
当今世界上绝大多数游戏都是C++写的,为什么要说不呢?要做什么?写游戏。写游戏首先要考虑些什么?做什么样的游戏,图形、音效、游戏逻辑如何实现。用C++要先考虑什么?定义跨平台数据类型抽象,实现常用集合类,设计宏实现RTTI,写一个支持Unicode并可以和其他多种字符串类型互相转换的字符串类,自定义内存分配器,写个shared_ptr,组织预编译头文件,设计实现Object原创 2010-04-12 20:52:00 · 7844 阅读 · 11 评论 -
WPF四年,尤不足以替代WinForm
WPF四年,尤不足以替代WinFormWPF出山已四年,作为官方内定的下一代UI系统掌门,没少露脸。但这个新掌门能否胜任,仍是众多开发者的心头之虑。通过对VisualStudio 2010的编辑器部分用WPF重写,微软终于对这个胜任与否的问题给出了个证实,当然,也给WPF做了不少重要的改进,尤其是终于解决了文本看不清的问题。所以,至少从.NET 4开始,WPF应该可以比较安全的用于重要的开原创 2010-05-09 19:37:00 · 9213 阅读 · 6 评论 -
换掉Lua是个错误
要支持一种脚本语言,JavaScript无疑是非常好的选择。最大的优势就是上过网的人大多知道JavaScript是什么,很多人都能写上那么一两行。尽管JavaScript也有一些WTF(Worse Than Failure)的地方,但不影响它成为一个非常成功个的动态脚本语言。在发现Jint开源项目后,我想终于有个.NET上能用的JavaScript引擎了。不要提JScript.NET,那个原创 2010-05-22 21:16:00 · 3412 阅读 · 2 评论 -
翻新并行程序设计的认知整理版(state of the art parallel)
近几年,业内对并行和并发积累了丰富的经验,有了较深刻的理解。但之前积累的大量教材,在当今的软硬件体系下,反而都成了负面教材。所以,有必要加强宣传,翻新大家的认知。首先,天地倒悬,结论先行:当你需要并行时,优先考虑不需要线程间共享数据的设计,其次考虑共享Immutable的数据,最糟情况是共享Mutable数据。这个最糟选择,意味着最差的性能,最复杂啰嗦的代码逻辑,最容易出现难于重现的bug原创 2014-05-10 08:30:48 · 3759 阅读 · 1 评论 -
内核模式驱动不推荐使用C++的缘由
本文所讲内容主要源自Windows DDK文档。一、内存页面交换和用户模式程序不同,内存页面交换对内核模式的代码不是透明的,而是需要一定程度的主动管理,要保证在代码执行过程中不会需要载入新的页面。编译器有相关的扩展#pragma指令来帮助C代码显式控制生成的二进制代码布局,以便相关的代码被放在一起,被调用时只需载入最少的页面。而对C++而言,还存在一些编译器自动生成的代码块和数原创 2013-12-03 13:36:40 · 3888 阅读 · 0 评论 -
C++/C#/Java等非web语言交叉编译到JavaScript的实用现状
自从两年前见识了浏览器里用JavaScript运行Linux后,看看如今JavaScript交叉编译的进展。看来我也要考虑一下这东西的实用性了。以下为翻译转述。常见交叉编译器:C/C++: Emscripten, MandreelJava: Google Web Toolkit (GWT)C#: JSIL, Script#Python: pyjsLua: lua翻译 2013-10-17 15:38:14 · 4128 阅读 · 0 评论 -
GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新。然而,从这两年的效果而言,C++的复兴并没有发生。一方面随着世界经济的动荡,IT行业也出现了一定程度的衰退;另一方面这也是个新兴语言如雨后春笋的时代,尤其是web平台上,CoffeeScript、Dart、TypeScript等,新人阶前花更红。抛开非技术原因不谈,原创 2013-10-05 23:46:32 · 4604 阅读 · 1 评论 -
说说游戏制作的build系统
如今的大牌游戏都是动则10G、20G的,build系统已经成了一个创新的新领域。暴雪在GDC2013上就讲了他们自主研发的分布式build系统。游戏的build不只要build程序代码,还包括各种美工资源的预处理,比如资源提取、校验、格式转换、组合等。而且这些资源普遍比较大,比如一个纹理图片的原始图片文件就可能有10M,模型的原始文件比如fbx或collada。Build系统会根据需要从原原创 2013-06-12 09:25:05 · 4607 阅读 · 0 评论 -
应用结构:pattern的终结是anti-pattern
以下讨论只针对应用开发,库开发的情况有所不同。起初,人们大多在用C,人们讨论函数(functions)和编译单元(compilation unit)。OO(面向对象、对象导向、物件导向)兴起后,人们开始认为,全局函数不好,全局变量不好,应该都封装到类(class)里。随着程序越来越大,对象越来越多,人们发现,有很多对象几乎要被所有其它的类引用,而且这些对象被四处传递,不原创 2013-01-28 17:59:50 · 3330 阅读 · 2 评论 -
CurrentCulture 与 CurrentUICulture
这两个都是对应Windows系统的设置。CurrentCulture和数字、时间日期等的格式化相关,和字符串比较、排序、大小写转换相关。属于软件国际化(Globalization)。CurrentUICulture用于选择界面语言,和界面语言的翻译相关。属于软件本地化(Localization)。两者经常值相同,但也可不同。比如,可以用英文版WIndows系统,CurrentUICul原创 2012-02-27 20:57:03 · 5025 阅读 · 0 评论 -
Silverlight消散,WinRT登台
2011年,Silverlight刚开始有蓬勃发展的起色,不利的传言就开始大量流传。不安的Silverlight开发者们要求微软澄清,但得到的只是沉默。终于随着微软在BUILD上亮相Window 8以及新的API WinRT,开发者们意识到,Silverlight的故事结束了。尽管微软在年底如期发布了大幅改进的Silverlight 5,但大势已去,微软甚至都没怎么宣传。随后传闻Silverlig原创 2012-02-01 20:43:42 · 4592 阅读 · 2 评论 -
游戏Entity层通信机制:超越虚函数
面向对象的程序设计模式无疑是成功的,虚函数机制对构造复杂系统无疑是非常有用的。但面对足够复杂的问题时,我们往往会需要更加强大的机制。游戏的实体层的构造,就是其中一种可能的情况。 有人会惊诧道:哪尼,传说中的XXL号的软件都可以完美地用OO实现,一个游戏逻辑会更复杂?莫急莫急,待我娓娓道来。话说从前有个程序,它有很多可能的事件需要子类定制处理,于是它就定义了很多的虚函数,但是每个子类通原创 2011-10-30 14:15:06 · 2540 阅读 · 2 评论 -
最隐晦的程序设计指引
一、百家争鸣 俗话说,程序员半年不学新东西,就变奥特曼(out man,过时之人)了。IT行业可以说是变化最快的行业,每年都有大量的新概念、新术语、新技术被创造出来,在多数人还在一头雾水时,“更好的”替代品又被创造出来。别的不说了,单说设计方法。 想当年静态类型系统是原创 2011-07-24 16:14:01 · 18503 阅读 · 118 评论 -
Query Comprehension 查询推导式
指Linq的查询语法结构。在Linq诞生之前有个类似的概念List Comprehension——列表推导式,广泛用于函数式编程语言。如Python的:S = [2*x for x in range(101) if x**2 > 3]Linq实现了一种针对强类型语言的更加一般化的架构,推导对象不限于列表,可以是数据库或任意对象,只要实现了对应的查询算子。还有一个比较热门的推导式原创 2011-07-01 13:44:00 · 1604 阅读 · 0 评论 -
C++/CLI不是用来写应用的
可以同时支持编译出机器码和.NET托管代码的C++/CLI,前身是Managed C++。程序员喜欢强大的语言可以理解,不少人学用C++也是因为C++很强大。但强大并不一定各方面都擅长,有所得必有所失。其至今的最主要用途,仍然是用于托管和非托管程序的交互,包装非托管代码成托管类库。而用其写.NET应用,并无长处,也不是Visual Studio支持的重点,例如WPF编辑器就不支持C++/CLI。原创 2011-05-31 14:44:00 · 2615 阅读 · 0 评论 -
常用汉字基础字库
由于如今的操作系统已经可以一套系统支持各种语言,可以选用的字体也就扩展到其他语言版本的字体。此表将各地常用字体作比较分类。原创 2011-02-20 13:12:00 · 6509 阅读 · 0 评论 -
小谈CAD制图和游戏3D的区别
<br />小谈CAD制图和游戏3D的区别<br /><br />并不是所有人学3D都是为了做游戏,但如今3D学习资料大多是游戏背景的情况下,会让不少走CAD路线的人走错路。<br /><br />游戏领域,3D向着实时电影级效果发展,强调视觉效果,为了获得足够的运行时性能,要把尽可能多的计算放到制作阶段预处理。而CAD领域,画线能力远比视觉效果重要,模型往往需要实时编辑,对单纯的三角面的吞吐量需求很高,需要在大量的线和面中作精准的选取操作,而对硬件加速需求上,OpenGL 1.2的功能基本就够了。原创 2010-09-25 11:09:00 · 4763 阅读 · 0 评论 -
图形界面编程成就了C++
图形界面编程成就了C++听有人说C#、VB比C++好是因为做界面方便还算傻得可爱,听有人说用C++做数值计算而不屑于做界面可就对不起咱C++的恩人了。这我可要说道说道。想当年C++刚出江湖,名门出身,自立门派,想抢Objective C老大的位置割据一方。但名门出身的混混也还是混混,论OO不够Objective C或SmallTalk的水准,论效率没有C的干净利索,结果折腾半天没人看得起。时至原创 2007-11-05 17:23:00 · 19161 阅读 · 12 评论 -
.NET上控制台输出的实时截取
.NET上控制台输出的实时截取.NET上控制台输出的实时截取分两种不同的情况:截取子进程的输出和截取当前进程的输出。截取子进程的输出可以使用Process.StandardOutput属性取得一个StreamReader,并用它来读取输出。注意读取操作是阻塞的,可以使用异步方法调用或者Process.BeginOutputReadLine()来进行异步读取。例子如下:Process p = n原创 2007-09-25 12:27:00 · 2329 阅读 · 0 评论 -
用WeakReference实现共享节点
用WeakReference实现共享节点在C++里要实现共享节点的一个常见方法就是COM式的引用计数。引用计数的好处所有的COM资料都会说,坏处经常可以在各种抱怨帖中看到。最主要的问题就是使用者必须很小心,一有闪失就可能导致资源没有被释放。DotNet里终于可以忘记这些问题了。但设计ResourceManager时,问题又出现了。我这里用游戏程序里常见的ResourceManager做例子,当原创 2006-10-25 21:12:00 · 1798 阅读 · 0 评论 -
尽早地将变量置null?
尽早地将变量置null?用C++的开发者大多养成了尽早释放资源的好习惯,在转移到dotNet平台后,也要坚持将用完的引用型变量置null,以便GC能够尽快地回收内存。果真如此吗?DotNet的GC是分代式的,目前是四代,生存期最长的在第一代,最短的同时也是最近分配的在第四代。第四代的空间很小,不到一兆。GC在尝试分配内存失败时才启动一次回收,绝大多数的回收只发生在第四代,因为其空间小,回收的花原创 2006-10-25 20:35:00 · 1463 阅读 · 0 评论 -
主要C++流派,看看你是哪一流
主要C++流派,看看你是哪一流1. 经典C++流:类是核心,例程多用C Runtime的,很少用模版,一般是正统教育的结果。2. 古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。3. MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32 API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃。4. Portable流:以C Runtime和STL为主要工具,原创 2006-11-01 16:29:00 · 3822 阅读 · 2 评论 -
抛弃型代码(Throwaway Code)
抛弃型代码(Throwaway Code)说到抛弃型代码可能会让某些接受正统教育的开发人员抓狂,但如今,尽管有人还在为虚拟机和机器代码争论不休,脚本语言却早已成为主流。抛弃型代码自有其用武之地。为什么会有抛弃型代码?因为工程和理论不一样,它不是理想情况,它是不完美的。可能某个系统功能不能满足需要,你不得不用很丑陋的方法绕过这个困难;也可能你的用户突然加入新的需求而破坏了你完美的设计;也许你要维原创 2006-10-22 13:42:00 · 3140 阅读 · 2 评论 -
Direct3D 10最新消息
Direct3D 10最新消息2005-12-9【要点】·新的API叫DirectX 10, WGF这个名字已经不再被提及。·D3D10依赖与Vista Display Driver Model,只能在Vista上用。·Vista的桌面系统是基于D3D9的,因为WPF(Windows Presentation Foundation)是要可以在XP上运行的。·Vista仍然支持DX9以及更早的版本,原创 2005-12-19 20:10:00 · 2102 阅读 · 0 评论 -
LUA脚本文档中文翻译(基础)
LUA脚本文档中文翻译(基础) 介绍 Lua读作“鹿啊”,是一种据创作者说的类Pascal脚本语言。巴西人做的,其名字"lua"是西班牙语的月亮。Lua是目前在游戏工业中用得最多的脚本语言。优点是执行速度快。 基本概念 一段脚本就是一组命令和数据。命令的术语叫作语句,一段语句可以用do ... end括起来构成一个语句块。语句块是一个相对独立的块,逻辑上等同于一条语句。 脚本中两个减号“--”后面翻译 2005-12-11 11:15:00 · 6764 阅读 · 1 评论