Skip to content

Archive

Archive for October, 2013
随着工程代码量越来越大,pdb的尺寸也会一直增长。比如KlayGE核心没多大,但pdb已经到了73.7M。一个偶然的机会让我发现了vc的link一直以来都有个undocument的选项/pdbcompress。加上之后可以在生成pdb的时候自动打开NTFS的压缩。 由于pdb里面大量内容都是文本信息,即便是NTFS的压缩都可以得到比较高的压缩比。经常可以压到剩下1/3的大小。NTFS压缩的算法比较简单,压缩和解压的的速度也不错。所以在生成和调试的时候,读写速度并不会有很大影响。所以能用这个选项的时候还是尽量使用吧。 话说,这年头还有人不用NTFS吗?
D3D11.1和OpenGL ES都提供了discard frame buffer的方法,分别成为DiscardView和GL_EXT_discard_frame_buffer。虽有文档,但却很少有例子来表达这功能在什么情况下使用。这里我只能根据我的理解做一些探讨。希望有更了解的朋友可以一起讨论。 从tile-based说起 移动平台上最常见的GPU架构是tiled-based。它把frame buffer划分成许多大小相同的tile。每个rasterizer一次处理一个tile,把这个tile中包含的三角形光栅化到那个区域。为了提高性能、减少功耗,tile-based硬件会有一个片上空间,真正的光栅化仅仅发生在这个片上空间,当一个tile的所有三角形都渲染完成之后,才写入位于video memory的frame buffer。可以认为,那个片上空间是个ca ...
几个月前我提到过如果通过IE10或单独装补丁的方法,可以在Win7上获得部分D3D 11.1和DXGI 1.2的能力。代价是,由于debug layer的不同,那么做的话无法用D3D11_CREATE_DEVICE_DEBUG标志建立设备,所以就不能使用调试模式的D3D。Win8.1再次修改了debug layer的名字,使得这个现象在Win8.1上也会出现。如果在Win8.1上使用VS2012及以前的Win SDK,就无法建立debug设备。 Win7上的D3D11.1 从文件日期可以看出,安装了D3D11.1后的Win7,d3d11.dll已经被升级了。原先的debug layer叫做d3d11sdklayers.dll,而在Win8 SDK里有了个d3d11_1sdklayers.dll。新的d3d11.dll会去找那个文件,而不是原先的。如果把Win8 SDK或者VS2012里的d3d11_1sdklayers.dl ...
MinGW-w64是另一组人做的修改版GCC,比起原先的MinGW,它的好处是可以编译出x64和x86的Windows程序,而且对Windows API的支持更好。原先用MinGW编译KlayGE的时候,需要对MinGW的头文件(或者说w32api的头文件)做一些修改,才能完成。如果用MinGW-w64,会不会好些呢? 版本的选择 和其他第三方的MinGW一样,由于选项的不同,MinGW-w64在Windows上其实有多个不同的版本。C++ Exceptions有DWARF、SJLJ、SEH三种处理方式;GCC Threading Model有Win32和Posix两种实现;编译器本身还分Win32和Win64的,虽然都可以交叉编译出x86和x64的代码。这些方式组合爆炸后,最终的binary版本就眼花缭乱了。我这里测试的是x32-4.8.1-release-win32-sjlj-rev ...
2006年以来, KlayGE一直都是用Variance Shadow Map(VSM)来表达阴影。VSM只比标准shadow map(SSM)增加了几行代码,但却能通过插值,极大减少边缘的锯齿,甚至模拟软阴影的效果。VSM的缺点是,需要抓用两个32F的通道。这么一来,带宽消耗大得多了,并且没办法通过编码到RGBA8的技巧在不支持浮点纹理的设备上使用。另外,VSM的light leak也是很讨厌的毛病,需要仔细调参数才能减轻。 Exponential Shadow Map 实际上在VSM出来不久之后的2008年,就有了Exponential Shadow Map(ESM)的方法。和VSM类似,ESM也是通过巧妙的方法使线性插值成为可能,从而完成各种blur。比较一下SSM、VSM和ESM的生成和使用,就能看出来ESM在代码上比VSM简单, ...