|
2013年10月20日
摘要:
最近需要模拟红侠乔伊的镜头运用.这东西初看简单,实际还是很需要功夫的.关键不是程序技术如何(就一个摄像机),而是分析其轨迹和追踪点规律.其实就是一个3D空间中的缓冲系统.你如何确定都有什么参数,这么多参数又如何相互之间作用?这些天做下来,有一些心得. 1 确立缓冲点.有3个方向位移的缓冲,有180度范围旋转的缓冲,但这些缓冲关系,只从2个点变化而来:相机的位置,以及相机追踪点的位置.后边这个一开始做的时候容易被忽略,实际上对效果的精细程度所起作用是很关键的.实际上不止对于摄像机系统,对于广泛意义的缓冲系统而言,都要找出主动关系与被动关系的缓冲点.在摄像机中,主动关系就是相机追踪位置,被... 阅读全文
2013年8月16日
摘要:
项目希望能够实现一些剧情动画,类似角色移动,镜头变化,台词展现等.剧情动画这东西随时需要修改调整,不能写死在代码里.考虑之后认为需要做一个简单的DSL来定制剧情脚本,策划在脚本里按顺序写入命令,然后我们解释命令执行即可. 项目的很多功能系统并没有能够实现导入lua中,非我所能决定,若可以则使用lua方便不少.因此我决定使用C++来制作这个剧情脚本DSL. 使用boost的spirit来负责脚本的解析,使用asio的coroutine简化了指令处理逻辑. DSL当然不能太复杂,第一个版本看起来类似:role_walk LEFT 100;role_dialog "stop!!!" 阅读全文
2013年8月8日
摘要:
coroutine: stackless和stackful jmp 基于switch的trick: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html 文中提到高德纳另有一套办法. #define crBegin static int state=0; switch(state) { case 0:#define crReturn(x) do { state=__LINE__; return x; \ case __LINE__:; } while (0)#defin... 阅读全文
2013年8月7日
摘要:
yield汇编实现. #include <stdio.h#include <conio.h#include <iostream.h//// marks a location in the program for resume// does not return control, exits function from inside macro//// yield( x, ret )// x : the 'name' of the yield, cannot be ambiguous in the// function namespace// ret : the 阅读全文
2013年8月6日
摘要:
非正式定义为以返回语句结束的命名语句块.使用PROC和ENDP伪指令声明,必须制定一个有效的名字(标识符).如: samplePROC ... ret sample ENDP程序启动过程之外的其他过程应以RET指令结束.强制CPU返回过程被调用的地方. 启动过程(main)是特例.必须调用终止程序运行的系统函数. main PROC ... INVOKE ExitProcess, 0 main ENDP CALL和RET指令 CALL指令把返回地址压入堆栈并把被调用过程的地址复制到指令指针寄存器EIP. RET总堆栈中弹出返回地址并送到EIP.保存和恢复寄存器USES操作... 阅读全文
摘要:
运行时栈 由cpu管理的内存数组. 使用SS,ESP寄存器. 保护模式下,SS存放段选择子. ESP指向堆栈内的32位偏移地址. ESP寄存器通常由CALL,RET,PUSH,POP等指令间接修改. 向下增长的堆栈.ESP指向栈顶.压栈push,地址减.出栈pop地址增. 一般用途: 寄存器做多种用途时,堆栈作为寄存器值的临时保存区域. CALL指令,CPU用堆栈保存当前被调用过程的返回地址. 调用过程时,通过压栈传递输入值. 过程内的局部变量在堆栈上创建,过程结束时丢弃. PUSH指令 首先减小ESP值,再把源操作数复制到堆栈. PUSH r/m16 PUSH... 阅读全文
2013年8月2日
摘要:
操作数类型 立即操作数(immediate),寄存器操作数(register)和内存操作数(memory). 直接内存操作数 指令使用内存操作数实际使用的是操作数的地址. 假设内存操作数val1位于偏移10400h处,那么把var1送al寄存器的汇编指令如下: mov AL, var1 MASM将指令汇编为 A0 00010400,机器指令第一个自己A0是操作码,剩下部分是var1的32位地址值. 编写程序时使用纯数字地址表示内存操作数是可以的,使用var1这样的符号名更方便. 表示直接内存操作数的其他记法:mov AL,... 阅读全文
摘要:
定义内部数据类型 类型 BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD, FWORD(48位整数,保护模式下用作远指针) QWORD(64位整数,8字节),TBYTE(80位整数,10字节) REAL4(32位,IEEE短实数),REAL8,REAL10 举例:val5 DWORD 12345678h 数据定义语句要指定至少一个初始值,多个初始值以逗号隔开.若不想初始化,可以用符号"?"作为初始值. 定义数组: array1 BYTE 10, 20, 30, 40 BYTE 50, 60, 70, ... 阅读全文
2013年6月26日
摘要:
实地址模式 IA-32处理器使用20位的地址线.可访问1MB字节内存.范围(0-FFFFF). 因为8086的16位寄存器不能存放20位的地址.因此提出了分段内存的解决方案.每段(segment)64KB. 类似解决方案也被用到了保护模式中供大范围寻址. 地址被表示为:段地址+内部偏移地址.段地址最后一个0被省略了.如此一个段地址可被装在16位寄存器里. 如8000h+260h.线性地址即80250h.线性地址(linear address)或被称为绝对地址(absolute address). 典型的程序有三个段:代码段,数据段和堆栈段.3个段寄存器CS, DS, SS包含程序代... 阅读全文
摘要:
32位通用寄存器 EAX, EBX, ECX, EDX EBP, ESP, ESI, EDI EAX 低16位称为AX,AX高8位称为AH,低8位称为AL16位段寄存器 CS, ES, SS, FS, DS, GS 实地址模式下,用于存放段的基址.段是一块预分配的内存区域. 保护模式下,段寄存器存放段描述符表的指针(索引). 有些段存放程序的指令(代码),有些存放变量(数据),另外还有其他段存放(堆栈段)存放函数的局部和函数参数.标志寄存器:EFLAGS CF, OF, SF, ZF, AC, PF指令寄存器:EIP特殊用法: EAX在乘法和除法指令中被自动使用.通常称为扩展... 阅读全文
|