Azure Product
浏览模式: 普通 | 列表

恐怖的C++语言

[ 2010-04-08 21:30:40 | 作者: Admin ]
Linus曾经(2007年9月)在新闻组gmane.comp.version-control.git里和一个微软的工程师(Dmitry Kakurin)争执过用C还是用C++,当时的那个微软的工程师主要是在做Git的Windows版,但他却发现Git的源码居然是C语言写的,而不是C++,于是他(Dmitry Kakurin)在Linux社区里发贴表示对Linux的不满,语言很直接:
Pure C as opposed to C++. No idea why. Please don’t talk about portability, it’s BS. (纯C写的,而不是C++,不知道为什么,请别告诉我是为了移植性,这完全是胡扯。)
Linux之父Linus Torvalds马上跟贴,在贴子中,Linus言辞很直接,直接表明C++是一个很恐怖的语言,他在贴子中说:[quote=][/quote]...

阅读全文...

你是哪种编程风格?

[ 2010-04-08 21:23:08 | 作者: Admin ]
在过去的N年中,我遇到了很多使用囧然不同风格的开发者,下面是我所知道的一些,你还知道其它的吗?

散弹枪编程
这种编程风格是一种开发者使用非常随意的方式对待代码。“嗯,这个方法调用出错了……那么我会试着把传出的参数从 false 变成 true!”,当然依然出错,于是我们的程序员会这样:“好吧,那我就注释掉整个方法吧”,或是其它更为随意的处理方式,直到最后让这个调用成功。或是被旁边的某个程序员指出一个正确的方法。

如果我们把一个正规的程序员和一个撞大运的程序员放在一起做结对,那么,那个正规的程序可以马上变得发疯起来,并且,可以把正规的程序员的智商降到最低。两个撞大运的程序员不应该在一起做结对编程,这是因为他们的破坏性能造成的伤害会比只有一个还大。

撞大运编程
这是一种比散弹枪编程要温和一些的编程方式,我相信这种方式可能会是大多数程序员都会使用的方式。这种编程...

阅读全文...

推荐日志 Ogre的skeleton数据的压缩

[ 2010-04-08 17:26:22 | 作者: Admin ]
今天写了个小程序,将Ogre的skeleton数据压缩了一下,发现原来导出的skeleton有很多的冗余数据,由于之前动画数据时按频率采样,并没有读MAX的关键帧,导致两个关键帧内出现了很多重复的差值数据,只要删除这些冗余的插值数据,即可以实现skeleton的数据压缩。

找到冗余的插值数据的算法简述为,遍历时间轴上的连续的3个关键帧,如果按每个关键帧对于时间的比例,计算第2号关键帧是否正好是1,3关键帧的差值数据,如果是的话就删除此关键帧,然后从头再遍历,再执行上述过程,直到最后找不到可删除的关键帧,或者关键帧数小于3,就停止。

最后将skeleton数据导出,则数据量会小了很多,实验证明原来139KB的死亡动作,最后压缩有只有13KB了。效果基本一模一样。

www.azure.com.cn

次世代游戏引擎光影制作简述

[ 2010-04-04 00:16:58 | 作者: Admin ]
一、游戏光影的范畴
实际游戏制作当中,狭义的灯光只是指程序实时根据灯光影响的顶点色和动态阴影,但实际应用当中,影响玩家整体感觉的光影效果,也就是广义上的光影效果包含的范围要更加广泛。
程序的即时光影,shader的定制固然对光影效果至关重要,美术制作的lightmap,normalmap,VertexColor乃至Glow都可以构成一般玩家认知上的灯光效果。
即是说,在游戏制作应该以游戏玩家的感觉为基准整体的设置光影的效果,而并非仅以技术手段作为分界,对于游戏制作来说,综合程序美术的多种表现手段,最终呈现给玩家的光影的感觉,才是游戏制作当中的灯光。

二、基本灯光系统介绍及使用方法
从画面渲染来说,无论一般网游还是次世代游戏,运算的规则构建是大体相似的,我们可以通过分析这个构架得出其中制作各种光影效果的可能性,下图是比较常规的各种图素经过如何的运算达成了最终画面的pipeline。
...

阅读全文...

NuMega Devpartner使用

[ 2010-03-29 11:58:43 | 作者: Admin ]
1 前言
我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。

NuMega是一个动态测试工具,主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuMega共有三个独立的子功能——BoundsChecker、TrueCoverage、TrueTime。BoundsChecker为代码检错工具,TrueCoverage为测试覆盖率统计工具,TrueTime为程序运行性能测试工具。

本文挡通过三章对NuMega三个子功能的使用方法进行了介绍,各部分之间内容独立。如果你想了解NuMega的各项功能,建议阅读本文挡全部内容,如果你只想了解NuMega提供的某一个子功能的相关信息,按目录查看相应的章节即可。

需要说明的一点是,本文挡中所介绍的测试工具NuMega,专指NuMega for Visual ...

阅读全文...

伪共享(False Sharing)及其避免方法

[ 2010-03-25 11:16:50 | 作者: Admin ]
如果不慎将共享内存结构与 OpenMP 应用程序一起使用,可能导致性能下降且可伸缩性受限制。多个处理器更新内存中相邻共享数据将导致多处理器互连的通信过多,因而造成计算序列化。

什么是伪共享?

大多数高性能处理器(如 UltraSPARC 处理器)在 CPU 的低速内存和高速寄存器之间插入一个高速缓存缓冲区。访问内存位置时,会使包含所请求内存位置的一部分实际内存(缓存代码行)被复制到高速缓存中。随后可能在高速缓存外即可满足对同一内存位置或其周围位置的引用,直至系统决定有必要保持高速缓存和内存之间的一致性。

然而,同时更新来自不同处理器的相同缓存代码行中的单个元素会使整个缓存代码行无效,即使这些更新在逻辑上是彼此独立的。每次对缓存代码行的单个元素进行更新时,都会将此代码行标记为无效。其他访问同一代码行中不同元素的处理器将看到该代码行已标记为无...

阅读全文...

#define 封装可变参数的函数

[ 2010-03-24 16:36:50 | 作者: Admin ]
#define WRITE_CONSOLE_LOG(type, format, ...) \
WriteLog(type, format, __VA_ARGS__ ); \

不要忘记了。
一直有这个问题困扰着我,今天我找到了一个解决方案。

在stdafx.h中
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls'
...

阅读全文...

推荐日志 OpenMP 简单示例

[ 2010-01-22 22:32:37 | 作者: Admin ]
OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。

在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。

先看一个简单的使用了OpenMP程序
int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
return 0;
}
这个程序执行后打印出以下结果:
i = 0
i = 5
...

阅读全文...
ħ˽ ħ˽ : ϲ ϲվ ϲʿ ϲʿ ϲʿ ϲվ ϲ ϲվ ϲ ϲ ͸۾ ˽ ѾѾַ document.write("");