汇编程序中的图形编程?

时间:2009-03-03 11:44:40

标签: graphics assembly

我使用Visual C ++ 6.0和DirectX开发了一个正在运行的Super Mario Sprite。但这对我来说并不是很令人满意(强调只用于显示2D精灵的3D多媒体框架),所以我希望能够仅使用C和汇编程序编写动画精灵。

因此,在查看旧游戏时(例如,Wolfenstein),它看起来大多数游戏是用C语言编写的,每次涉及图形输出时都会使用汇编程序。

不幸的是,当尝试使用这个旧的汇编程序代码时,总会出现错误消息“NTVDM.exe发现了一条无效指令”,所以现在这些东西似乎不起作用。

汇编程序中的图形编程教程是否仍然有用?

(我不想使用任何膨胀的框架或库,我只想自己开发所有东西.WinAPI可以创建一个全屏窗口并捕获用户输入,但不是因为我阅读GDI对于快速图形来说太慢了。)

我正在使用WindowsXP和MASM或A86。

6 个答案:

答案 0 :(得分:13)

听起来你只使用汇编程序,因为你似乎认为这是必要的。事实并非如此。如果你没有任何其他原因(即想要学习它),不要在这里使用汇编程序,除非你确切知道你在做什么。

对于普通的图形引擎,完全不需要汇编程序编程。特别是在超级马里奥风格的2D精灵引擎方面。即使像Python这样的“慢”脚本语言也足够快,现在已经足够了。

除此之外,如果你不太确切地知道你在做什么,汇编程序将比C更快(事实上,它可能会慢一点,因为你会重新 - 不太有效地实现现有的C函数。)

答案 1 :(得分:11)

我完全同意samcl

不再使用汇编程序的主要原因是您无法再访问Videomemory。回到早期(你提到过Castle Wolfenstein),有一种叫做0x13h的特殊视频模式,你的图形只是一块内存(每个像素的调色板都是0-255 < - 1 Byte)您可以通过这种特定的视频模式访问此内存,但是,今天情况要复杂得多

今天你有非常快的Videomemory并且使用你的CPU来访问它只会降低所有性能,因为你通过PCI-Express / AGP / PCI / VESA-LOCALBUS / ISA连接CPU(&lt; - 记住任何人!? )

图形编程通常需要大量的读写访问(读取像素,检查它是否透明,乘以alpha,写入像素等) 现代内存接口比直接访问内部图形卡要慢得多。正如Robert Gould建议的那样,这就是你真正应该使用着色器的原因。通过这种方式,您可以更快速,更容易理解代码,并且不会阻止您的GFX内存。

如果您对GFX编程更感兴趣,可以使用shadertoy来满足您的胃口,这是一个专注于基于Shader的效果的社区,完成基于WebGL的Shadercode执行。

你的初学者汇编程序代码也会非常蹩脚。在质量和表现。相信我。它需要大量时间来优化这种原始代码。因此,您编译的C / C ++代码将轻松胜过您的手写内容。

如果您对Assembler不感兴趣,请尝试编写类似diskaccess的代码。这是您可以获得很多表现的地方。

答案 2 :(得分:6)

我猜你是否已经在使用C和DirectX,速度不是问题,这更像是一个学习练习。对于Windows下的2D,C和DirectX确实非常快,正如Konrad Rudolph指出的那样,手动汇编程序不可能比高度优化的SDK更快。

从纯粹的教育观点来看,这是一项有趣的活动,但相当复杂。早在家用计算机和第一个PCS的早期,图形屏幕几乎就像一块内存,其中字节对应于一个或多个彩色像素。通过更改屏幕内存的值,您可以绘制点,然后是线条,然后是精灵等...在现代PC上,这往往不是一个选项,因为您通常通过SDK编程图形卡,做同样的工作。然后该卡完成了艰苦的工作,并为您提供了更高级别的抽象。如果你真的想要了解当天的情况,我会推荐一个模拟器。对于现代游戏,请坚持使用SDK。

答案 3 :(得分:4)

如果您想调查此途径,可以在最新版本的Directx中编程您自己的2D引擎。您可以创建一个“屏幕空间”对齐的多边形,没有透视校正,其中的纹理映射。然后,您可以逐个像素地将精灵绘制到此纹理贴图上。

模式13h(彼得帕克),它带回了一些回忆!

__asm
{
mov ax,0x13
int 10h
}

我倾向于避免使用驳船装配器,特别是难以调试和维护;但是,如果您想更详细地探讨这个主题,我可以推荐Michal Abrash's Graphics Programming Black Book。它有点陈旧,但阅读效果很好,可以让您在3D硬件之前了解图形编程技术。

答案 4 :(得分:2)

图形的汇编程序是因为,当时大多数人都缺少支持3d的图形卡,所以它必须在CPU上完成,而不再是。现在它是关于着色器编程。着色器语言允许您拥抱裸机。因此,如果你应该尝试将你的2D图形编码成为基础,那么这种体验将具有作为职业技能的价值。

尝试CUDA作为首发。

答案 5 :(得分:2)

我的建议是试验。从C / GDI和C ++ / DirectDraw开始,获取精灵代码并以多种形式编写。不要担心汇编程序。

DirectX是快速动作图形的最佳选择。学习它,然后弄清楚如何使用汇编程序进行微优化。通常,汇编程序不会更快地调用API。它将为3D旋转,纹理映射,阴影等事物提供更快的计算灵活性。

从DirectDraw开始。这是一个FAQ。从技术上讲,DirectDraw在DirectX 7之后已被弃用,但您仍然可以使用它并从中学习。它将允许您直接进行帧缓冲修改,这正是您可能正在寻找的。

TripleBuffer Software有一些有用的教程和论坛。

另请考虑将编译器升级到Visual C++ 2008 Express。 VC ++ 6有一个错误的编译器,在尝试编译某些C ++库时会出现问题。