我正在尝试让我自己的简单的3D渲染引擎完全从零开始。所以我从DOS运行它,切换到32位PM和所有这些东西……
最后,我得到了投影和线框渲染的工作变换,但我得到了非常琐碎的问题。渲染我的场景后,需要清除LFB,以便下一帧可以再次在那里绘制。
但是使用rep stosd或简单的mov-loop循环真的很慢,我的每秒平均速度从60+下降到10。
我使用的是高分辨率1280x1024像素,每个像素有4个字节,所以我需要从地址0xFC000000开始将1280*1024=1310720 dword= 5242880字节设置为0。
有没有什么方法可以让记忆立即消失呢?(我想保留这个决议)
发布于 2019-05-16 19:24:24
如果您只有SSE可用,则可以使用带有movntps的pxor一次处理16个字节。如果您有可用的SSE2,您可以使用pxor和movdqu一次处理16个字节(如果对齐到16个字节,则使用速度更快的movdqa )。如果AVX512指令可用,您还可以使用带有xmm寄存器的vpxor和带有相应zmm寄存器的movntps来执行64字节。
如果你想使用SSE和/或AVX512指令,你需要set some control registers
mov eax, cr0
and ax, 0xFFFB ;clear coprocessor emulation CR0.EM
or ax, 0x2 ;set coprocessor monitoring CR0.MP
mov cr0, eax
mov eax, cr4
or ax, 3 << 9 ;set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time
mov cr4, eaxhttps://stackoverflow.com/questions/56151987
复制相似问题