代码改变世界

Windows+GCC下内存对齐的常见问题

2013-11-27 20:10 by 空明流转, 3034 阅读, 2 推荐, 收藏, 编辑
摘要:结构/类对齐的声明方式gcc和windows对于modifier/attribute的支持其实是差不多的。比如在gcc的例子中,内存对齐要写成:class X{ //...} __attribute__((aligned(16)));但是实际上你写成class __attribute__((aligned(16))) X { /*...*/};gcc一样可以识别。这样MSVC和gcc就可以使用宏完成跨平台编译。对齐类型的变量在堆与栈上的分配对齐在以下场合都能提示编译器为它的变量分配对齐的地址:void foo(){ X v; // v是个栈上的16字节对齐的变量 X* p ... 阅读全文

Direct3D Draw函数 异步调用原理解析

2013-07-03 23:56 by 空明流转, 10065 阅读, 22 推荐, 收藏, 编辑
摘要:概述在D3D10中,一个基本的渲染流程可分为以下步骤:清理帧缓存;执行若干次的绘制:通过Device API创建所需Buffer;通过Map/Unmap填充数据到Buffer中;将Buffer设置到DeviceContext中;调用Draw执行绘制过程;调用Present提交渲染结果。在这一过程中,不被初学者注意、然而在深入学习时定会遇到的一个特性是:D3D的Draw函数是一个异步调用。我们知道,实际渲染的过程大部分是在GPU上完成的,CPU只负责发号施令。实际上,数据准备完成后,当你的程序调用了Draw函数后,CPU才会真正的将数据和命令提交到GPU上进行渲染。从命令提交到渲染完成通常需要数 阅读全文

OS之争:永不停歇的战争(二,完结)

2013-03-05 20:06 by 空明流转, 3852 阅读, 3 推荐, 收藏, 编辑
摘要:人机界面的对战(续)UI的帮派战争如果说不同流派间比较算是内部的矛盾,那么流派间的竞争,可谓是帮派战争了。帮派战争中,最激烈当属Linux为代表的CLI阵营与Windows/Mac为代表GUI阵营之间的对抗。虽然双方都会将问题描述的花里胡哨,但是这些都是“将答案准备的足够复杂以让别人找不到明显的瑕疵”的做法。撇开表现形式不谈,我们看看操作系统最原始、最主要的需求:检索及管理文件;启动程序;管理已经启动的程序(进程)。为什么Linux和Windows的两伙人在这个问题上能斗的这么激烈,而且还不分胜负,就是因为这三个功能都足够简单,无论是GUI还是CLI都能够轻松胜任。所以说,单独在OS Nati 阅读全文

OS之争:永不停歇的战争(一)

2013-03-05 03:18 by 空明流转, 5657 阅读, 6 推荐, 收藏, 编辑
摘要:不是专家和王垠不一样,和云风不一样,他们是大牛逼,而我只是个无名小卒。不是扫地僧,只是无名小卒。但是作为一个小卒,从看到王垠的《用Linux工作》开始,也有五六个年头了。实际上,我的计算机学习和编程几乎是同时开始的,这样算来,我也用了十三年的PC了。但是,对Mac,Linux和Windows仍然可以说是一无所知。但是王垠的态度,到了《漫谈Linux,Windows,Mac》有了90度的转折,而云风,则从C++的拥趸变成了坚实的反对者。不是我不明白,这世界变化快。然而即便是个别大牛的态度有所转变,也会有别的大牛前赴后继,赴汤蹈火。如今,我只是想作为一个局内的局外人,写点东西为这场无功而有趣的战争 阅读全文

SALVIA 0.5.2优化谈

2013-02-11 20:13 by 空明流转, 2116 阅读, 4 推荐, 收藏, 编辑
摘要:梗概SALVIA 0.5.2 的优化经历是一个“跌宕起伏”的过程。这个过程的结果很简单:在Core 2 Duo T5800(2.0GHz x 2)上,Sponza的性能提升了60%,ComplexMesh性能提升了26%。背景SALVIA的整个渲染流程主要是以下几部分:根据Index Buffer获得需要进行变换的顶点;将顶点利用Vertex Shader进行变换;将变换后的顶点,输出成若干个float4;将三角形光栅化。SALVIA的光栅化是将三角形拆分成4x4的像素块若干,不满的块有掩码来处理;将像素进行插值;插完值后把像素送到Pixel Shader中处理一趟;处理完的结果用Blend 阅读全文

开源光栅化渲染器SALVIA的漫长五年(准·干货)

2013-01-13 05:31 by 空明流转, 9012 阅读, 8 推荐, 收藏, 编辑
摘要:SALVIA是从07年底开始开发的。历经五年,无论是设计目标,还是使用到的一些方法,都和最初差别很大。谨以此文,纪念我在五年中作出来的各种傻逼决定。1. 2007年9月 - 2007年12月:可笑的动机,可笑的雏形动机与原型SALVIA出现的原因其实很可笑。07年底的时候我正在写一篇paper,将GP-GPU的。那个时候还没有CUDA一类的东西,一切都要靠Shader来。本来我手上的显卡是一块9550的SDRAM的简版。但是论文快结束的时候,突然这卡的风扇就罢工了。然后我降频用了大概一个多月,卡也废掉了。因为没钱买新显卡,我就打算写一个比D3D REF快的软件渲染器。07年底的时候,实现了第一 阅读全文

最近招聘时,收到的简历上所发现的问题

2012-08-02 21:17 by 空明流转, 3595 阅读, 2 推荐, 收藏, 编辑
摘要:长话短说。从去年开始,给以前的公司和现在的公司招人。收到了不少简历。在收到的简历中,发现有一些简历存在着一些非技术性的共通问题:1. 格式问题明明是Doc的简历,但是打开后发现和文本文档没什么区别。什么格式都没有。这让阅读简历人从何下手啊?2. 字符对齐问题标题明明居中的,偏偏要抖两个字符;段首缩进的,参差不齐。段落内应该用对齐线对齐的,非要用空格对齐,狗啃过的一样。3. 字体问题一个段落内莫名其妙两三种字体。甚至有的连字号都不一样。4. 段落间距问题段落间距不一致,稀稀落落。段间距的作用,原本在于可以将逻辑上完整的一个部分区分开。结果段落间距不一致,让读简历的人读起来也磕磕巴巴的。5. 强调 阅读全文

LLVM随笔

2011-11-23 18:28 by 空明流转, 2193 阅读, 0 推荐, 收藏, 编辑
摘要:1. LLVM在x86和x64下都和Microsft C++ ABI的吻合程度不够。目前已知在以下情况下会出错: 参数为结构体的 返回值为结构体 以下情况我没有完整测试过: 返回值为单个浮点 返回值为向量(_m128 / <4 x float>) 参数为向量(_m128 / <4xfloat>) 所以建议大家统一将是结构体的返回值和参数以引用/指针的形式传递。 对于大小为4个或者8个字节的结构体如果希望按值传递,那么需要在LLVM函数的签名上使用i32/i64作为参数类型,并使用bit cast在函数体内强制转换成结构体。 2. LLVM提供了很多的Intrinsics 阅读全文

LLVM的调用协议与内存对齐

2011-08-18 08:51 by 空明流转, 2602 阅读, 2 推荐, 收藏, 编辑
摘要:本文讨论了在使用LLVM的过程中可能遇到的跨语言调用协议和内存对齐的问题。 阅读全文