WaterDrops
安柏霖
zhihu : https://www.zhihu.com/people/toughbro
<无限法则>--LeadProgrammer
<天涯明月刀>--Engine Architect
<Ghost Recon:Advanced Warfighter2>
<EndWar>
展开
-
std::limits
像产生一个nan的float这样的事情,可以这里用这里的函数,挺好的,还第一次注意stl的这个部分。float f = std::numeric_limits::quiet_NaN(); 判断的时候都很熟悉了,就是_isnan();原创 2011-06-09 08:28:00 · 1986 阅读 · 0 评论 -
引用可以被引向NULL
<br />前些天遇到一个,引用指向NULL内存,然后使用reference.xxx的时候就crash了,引用和指针在汇编级是一个东西,指针出现的问题引用一样有。原创 2011-02-23 08:59:00 · 2166 阅读 · 1 评论 -
StaticVariable
<br />今天遇到两个问题关于static variable,属于都了解,但是实际操作中还会犯错的知识不够扎实型。<br /> <br />1,template里面生命的static member会在其他的module(dll)里面有副本,所以要用dll import/export来避免<br />2,static variable作为全局变量其构造顺序无法保证,不要用<br />DataStruct msMember;<br />应该是DataStruct* msMember;<br />用的时候做:<原创 2011-02-22 19:03:00 · 1250 阅读 · 3 评论 -
float向u8和s8的转换
关于float向u8,s8这种类型转换,比较内藏玄机,还是小心为妙,这种级别的优化做了不如不做。直接float向char类型的做法是用__ftol2_sse命令完成,具体怎么做的就不跟了,想跟也能跟,结果放在al里面,然后move byte到结果。这里是如果是范围相当,float是char能表示的数结果是正确的,如果是更大的,就是从4个byte中截取一个byte,不会有自动的clamp到边界-128这种。到了针对unsigned char的表示可以看出使用频繁的loat,store完成的,本身就很慢,尽管c原创 2011-03-04 21:08:00 · 7430 阅读 · 6 评论 -
mul,vector,matrix
<br />matrix定义:<br />float(row)x(column) matrix。<br />比如float 3x4 matrix就是3行4列的matrix。<br /> <br />在汇编级表现是一个column一个register。<br />mul(vector, matrix)要求matrix的row num和vector的dimention对应,如果是:<br />mul(float4, float4x4)那么就是四个dp操作,每个dp取一个register也就是float4x4的一原创 2011-02-27 15:30:00 · 1782 阅读 · 0 评论 -
宏(preprocessor)系列 chips
<br />平常时候说的宏,一般指preprocessor,google的时候用这个比较合适,否则各种macro会悲剧。<br /> <br />msdn里面有比较全:<br />http://msdn.microsoft.com/en-us/library/wy090hkc(v=VS.80).aspx<br /> <br />归档一下以前的相关post:<br />http://blog.csdn.net/ccanan/archive/2007/06/06/1641409.aspx<br />变参的宏:h原创 2011-02-26 21:05:00 · 1327 阅读 · 0 评论 -
FromCarmackTwitter
<br /> <br />记录一些tech words:Using tristrips with restart cuts index memory in half for 10 megs on wasteland1, some cost in lower post transform cache hits.原创 2011-02-25 07:54:00 · 2048 阅读 · 5 评论 -
pch rules
pch优化编译时间这个很好,但是什么放进去什么不放还是遵循一些道理比较好,是项目结构更简单,需要编的东西也最少,个人觉得比较合理的是:所依赖项目的headers本项目基本不变的headers最底层的core proj的pch就包含类似一些string,vector这样的库。基本不包含自己的库,当然想typedef char s8;这样语句所在文件可以有例外。最后的效果就是:所依赖的项目header文件变化了,会导致本项目重新编译。本项目的header变化了不会导致全项目编译。原创 2010-11-26 15:22:00 · 1119 阅读 · 0 评论 -
VARIADIC MACRO
<br />http://en.wikipedia.org/wiki/Variadic_macro<br /> <br />宏的变参写法:比如log常常会用到进行分类,用宏来简化书写,可以这样<br />#define RENDER_LOG(...) BMLog::GetInstance()->LogToDebug(ELT_Render, __VA_ARGS__)原创 2010-11-23 11:26:00 · 1551 阅读 · 0 评论 -
GetData From RGBA8 RenderTarget on dx9
<br />render target正常是放在default pool里,获取其中数据的一个可行的方式create一个system pool的rendertarget,用GetRenderTargetData来把数据读入,然后lock。<br /> <br />解析这个数据的时候,对于rgba8在内存里的存储数据是bgra,b在低位,a在高位。<br />如果按照一个unsigned long来读取的话,要注意endian问题,x86是little endian,也就是a的高位是more signific原创 2011-05-31 10:56:00 · 1853 阅读 · 2 评论 -
smart pointer virtual destructor
<br />今天遇到一个smart pointer没有在destructor上加virtual 导致delete时候assert的问题。<br />不佳virtual导致继承的class的destructor没有被调用,这个没问题,里面内存没有被正确释放,这个有点意思。<br /> <br />class RefObj{public:~RefObj();void Release(){ mRefCount--; if (mRefCount==0)原创 2011-04-20 16:32:00 · 1368 阅读 · 1 评论 -
free&delete&delete[]
最近一些工作里需要处理些内存的东东,需要把delete,free,delete[]分清楚。 跟了下几个汇编delete汇编化是:call destructor.call delete(void*)->free+一些判断 free就是free delete[]是调相应数量的destructor,delete(void*)so:所原创 2011-06-09 17:06:00 · 2937 阅读 · 1 评论 -
[WaterDrops]std::map中判断并删除元素
要做的事情就是遍历一个map,做一些判断,如果符合一定条件,就删除。代码尽量简洁高效(感谢付老板指点):关键点就是要知道map的erase不会令iterator失效,之前不确定的时候做了很多额外的工作保证其正确性。 for (map::iterator it = testMap.begin(); it!=testMap.end(); ) { if(it->second->R原创 2011-06-15 09:06:00 · 1620 阅读 · 1 评论 -
编程模式积累
收集一些编程(c++)的时候应该变成“本能”的不用去想的习惯性的东西:写new的时候就去写delete,如果一些不用delete的东西(gc管理的东西),注明为什么不用deletefor里面用++i, ++it, ...对于图形编程来说,出现概率低到一定程度的时候,可以用一个assert来报错,然后假设不会出现这种情况的去编程,实际应用中这种方式更有实战性。if(5==i)这个习惯好于if(i==原创 2011-06-16 16:54:00 · 2366 阅读 · 4 评论 -
[2011][waterdrop]triangle strip
triangle strip好于triangle list:省index buffertriangle setup速度更快所以通常意义上,能用strip就strip吧。 尤其是在程序生成的地方应该使用triangle strip的。 限制就是直接使用是需要带状的,任意形状需要用degenerate triangle来做,也就是使用有重复点的triangle。原创 2011-06-22 17:01:00 · 2305 阅读 · 0 评论 -
开发随笔
知道的道理和真正指导自己行动的道理是两码事,就是要通过不停地重复来强化之,这就是有效的对自己编程的方式最好的编程状态(起码对自己而言)就是充分休息,心情平静,“不以物喜不以己悲”的状态,无我的平静的沉浸在其中,热血的状态也很好,但是仍旧没有平静的好。人总是要在不同的状态间切换的,不可能一直平静,不可能一直热血,随兴最高写代码的时候务必要谨慎,要以负责的态度来看待代码,绝对不能以粗暴侥幸的态度来做,原创 2011-12-03 23:45:42 · 1498 阅读 · 0 评论 -
misc on bitfield
看了下使用0和false来和bit field做测试有什么不一样,实际是会生成一样的asm代码 if(0==node->mIsVisible || 0==node->mIsVisual)//or if(false==node->mIsVisible || false==原创 2011-09-02 09:38:01 · 1783 阅读 · 0 评论 -
rim lighting
<br />虽然这个看起来巨简单,但是也比较容易出错。<br />我开始就是用normal和view dir做dot来hack,虽然有那么个意思,但是效果不好,不够自然:也就意味着选取的方程不对。<br />人皮肤上的rim lighting是fresnel现象反射背景,换下公式,就自然了原创 2011-05-04 09:01:00 · 2658 阅读 · 2 评论 -
command pattern
类似event这样的方式。多线程异步执行的一个模式,也就是unreal engine render thread使用的模式。 非常优雅的一个设计。 我很喜欢cmd的地方是其好于busy wait的方式,一个线程每个update都去检测flag然后做相应动作,就不太好。使用cmd pattern从其他线程传一个cmd过来,执行动作就高效优雅多了。 一种原创 2011-06-14 17:20:00 · 1402 阅读 · 0 评论 -
tricks
<br /><br />float tricks:If ( a != a ) a is a NaN原创 2011-01-19 10:08:00 · 1601 阅读 · 3 评论 -
patterns
<br />这些东西的意义就是把东西从“听说过”和“知道”上升为可以随心所欲的用出来用得好,这也是开这个thread的真正原因,编程的时候突然发现一个比较简单的东西会需要思考一下,没有在大脑里立刻浮现最佳解决方案/可能踩雷的地方/各种情况下的变通。command buffer with ring/double bufferThreadSafeAssert<br /><br /> <br /> <br />command buffer with ring/double buffer<br />基本上这个模式<原创 2011-01-19 09:39:00 · 1342 阅读 · 1 评论 -
Multithread chips
<br /><br />GetThreadId 这个函数需要是2003以上的windows操作系统支持,xp不支持,会报一个错:无法定位程序输入点GetThreadId于动态链接库KERNEL32.DLL上。如果是用CreateThread创的线程,在这个函数里把threadid记下来就好。原创 2011-01-12 10:16:00 · 1777 阅读 · 0 评论 -
大函数拆成多个小函数
很不错的方法,用适当的inline的话也不会造成function call的额外消耗。函数的名字可以当作注释,大函数读起来轻松多了。另外小函数可以通过visual assist直接定位,查找也很方便,有效的提高了效率。原创 2010-09-24 10:58:00 · 4134 阅读 · 2 评论 -
(zz)点在多边形内部判断算法(不限凹凸)
<br />http://local.wasp.uwa.edu.au/~pbourke/geometry/insidepoly/<br />利用点和其中每个边的关系来判断<br /> <br />#define MIN(x,y) (x < y ? x : y)#define MAX(x,y) (x > y ? x : y)#define INSIDE 0#define OUTSIDE 1typedef struct { double x,y;} Point;int Insid原创 2010-09-07 10:57:00 · 1881 阅读 · 1 评论 -
qt install&init
早些时候安装编译都很顺利,有段时间没碰了,回来升个级之后,用vs addin来开projects.proj遇到一堆问题。记录下。帮助比较大的是这几个blog文章,很感谢他们的分享:http://www.cnblogs.com/huangliujing/archive/2009/02/13/1390068.htmlhttp://blog.csdn.net/zhudelunalpha/archive/2010/08/26/5841394.aspx最开始出问题的地方是在编译projects.proj的时候出现找不原创 2010-09-05 15:54:00 · 1658 阅读 · 0 评论 -
std::vector的数据头指针
<br />是_Myfirst这个,老是忘记。原创 2010-09-01 14:13:00 · 3748 阅读 · 3 评论 -
fsincos---哥没法淡定了
http://www.flipcode.com/archives/Vector_Matrix_Quaternion_Math_Library.shtmlhttp://www.intel.com/software/products/documentation/vlin/mergedprojects/analyzer_ec/mergedprojects/reference_olh/mergedprojects/instructions/instruct32_hh/vc116.htm以前还真没注意,原来有个指令是原创 2010-09-01 08:54:00 · 1645 阅读 · 2 评论 -
平面直线一些公式
<br />平面定义公式<br /><br />直线公式:<br /><br /><br />原创 2010-09-13 13:35:00 · 1406 阅读 · 0 评论 -
keep code tight&clean
<br />应该对code的clean&tight有种宗教般的追求。<br /> <br />这样会使问题变得简单,大量的bug和performance问题都变得显而易见,这部分花的时间后面debug和优化过程中会省很多,绝对赚的回来。<br /> <br />不过这样看这一点就肤浅了,说到底写出clean&tight的代码就是宗教般的追求。原创 2010-09-02 15:29:00 · 1321 阅读 · 3 评论 -
Get&Set
<br />class Show{public:f32 GetValue()const { return mValue; }void SetValue(f32 v) { mValue = v; }protected:f32 mValue;}; <br />这种加get&set的理由也是充分:对读写有控制,写这个类的人可以有充分的控制权对数据的访问可以很方便的做检测封装。。。<br />但是不好的地方就是写一个成员进去,要敲太多东西,浪费时间不说,类看起来臃肿。<br />之前有个原创 2010-08-25 08:27:00 · 1170 阅读 · 0 评论 -
StretchRect...果然和文档上说的一样
<br />存侥幸心理看看能不能从depthbuffer上copy到一个create出来的texture里。<br />结果失败,还得按照这里来用INTZ格式来为g80显卡来做texturize的surface。原创 2010-09-28 22:54:00 · 2733 阅读 · 0 评论 -
TestDriven真是不错
<br />当然做的时候因为游戏的特殊性,没法像很多应用软件那么典型了。<br />但是这个真是一个降低脑力负担的好方法,把需要考量的地方加上测试点,想得周到的话,一劳永逸了。<br />真是在实战中很给力的方法,真是越用越爱。原创 2010-10-03 19:26:00 · 1140 阅读 · 0 评论 -
失误的不可避免性
开发过程中,失误不可避免。大量的努力来避免失误是必需的。大量的测试来诊断失误也是必需的。同样,在开发的过程中一定也要做好准备,再简单的东西都有可能出现失误,那么这个时候要做好应对的准备。不要排计划,或者清理代码的时候,假设自己不会出现失误。原创 2010-10-04 16:07:00 · 1292 阅读 · 0 评论 -
_isnan
<br />这个函数可以判定float是不是非法的数值,对于冲内存的情况判定比价有用原创 2010-11-13 15:10:00 · 1997 阅读 · 2 评论 -
一些汇编指令
呃,得积累些pc上的一些汇编了。mov eax,dword ptr [edx]----从edx这个地址取dword(4byte)放到eax里面。原创 2010-11-11 00:06:00 · 1594 阅读 · 1 评论 -
d16 format on nv card
<br />nv技术哥说d16的depth buffer格式都是一个fragment占用32bit,没有内存优势。<br />而且z rop是不支持d16格式,从g80显卡到fermi都是如此,使用32模拟的,所以速度又慢了很多。<br />简而言之d16就是个悲剧。<br /> <br />d24x8是被祝福过的,n卡5系列之后就是在探测到对d24x8做linear sample的时候就自动开启硬件pcf,quality&performance都不错。原创 2010-11-09 15:35:00 · 1396 阅读 · 2 评论 -
z far&distance
<br />越来越觉得,应试教育中有很多可取之处的----把概念在大量的练习中把握的精准而且扎实。<br />这种精准不是坐下来,问题摆清楚,好好一想,哎,知道怎么回事了。<br />而是在大量的计算做题或者编程任务中,随手一想,靠潜意识就能精准的使用出来。<br /> <br />今天犯了个错误----camera里面的far我误当成distance的far,分割csm的时候这样做了计算:<br />float3 deltaPos = worldPos-eyePos;float dist = leng原创 2010-11-06 22:21:00 · 1013 阅读 · 2 评论 -
禁掉inactive code colorize
<br />option--text edtior--c/c++---formatting---colorize inactive code blocks in a different color<br />vc2005下总是判定错误的宏block,这个可以禁掉。原创 2010-11-02 14:08:00 · 1153 阅读 · 0 评论 -
chips of wow
<br />周末在诺森德大陆上奋战一番,同时以玩家和开发者的角度来看wow,觉得有些“只能意会不能言传”的感觉。<br />普通的技术,把细节处理好,然后经过优秀设计师和艺术家的手笔,仍旧创造出整体观感很不错的游戏。<br />这种game sense真是典范。<br /> <br />打得过程唯一有印象的就是几个坐火车和机关枪的任务。<br />还有一个组队任务一个人完成,dk单打能力的确很强,不过我还是狂死了很久,后来怒了,特地大号飞到拍卖行买了好多药和buff合剂,一顿磕药,还找了临时做任务的圣骑要了原创 2010-10-17 19:59:00 · 1313 阅读 · 0 评论 -
Prototype&Production
<br /> <br />这里算是前一段工作中的一个小教训。<br />对于engineer来说,主要工作在于算法的实现,机制的建立,然后把接口开放给artist或者designer,这个没问题。<br /> <br /> <br />lesson:<br />在调节出production级别的效果的情况下,才算是实现的一个结束。<br /><br /><br />连续几个东西给我的教训就是在做一个没有做过的,尤其是没有可以参考的未知东西的时候,机制的实现到一个比较令人满意的效果之间还有很大的距离,尽管这部原创 2010-10-09 13:24:00 · 1290 阅读 · 0 评论