我正在编写一个 DOS 游戏框架,以更好地学习 C 语言,并且对在旧硬件上编程(尤其是在我长大的系统上)产生普遍兴趣。
我正在尝试实现一个双缓冲系统,但我无法分配一个指向 320*200 数组的远指针。
起初我尝试使用 malloc,但发现它只能分配 64kb 以下。我读到您需要使用farmalloc(malloc返回NULL)并且它分配正确。然而,当 _fmemset 或 _fmemcpy 运行时....整个系统卡住。
backBuffer = (unsigned char far*) farmalloc(64000);
何时需要交换我使用的缓冲区
_fmemcpy(VGA, backBuffer, 64000);
程序正在使用小内存模型。
最佳答案
很有趣的帖子,我也很喜欢旧硬件。
您是否尝试过在中型或大型模型中编译以检查代码是否正确运行?
您确定指向 VGA 显存的指针已正确初始化吗?
我记得在那些日子里,使用内存副本来交换屏幕缓冲区非常缓慢,更不用说您必须等待垂直回溯期才能开始复制内存。 (我有一个基本的 VGA 卡,所以也许你的硬件更好,延迟是可以接受的)。
如果您有兴趣,我强烈建议您阅读 Michael Abrash 的 Mode-X列。
Mode-X 及其衍生模式是由 Michael Abrash 首次记录的替代图形模式。基本上,它们是对 256 色 13H 模式的破解,您可以通过调整 VGA 卡中的一些寄存器来激活该模式。
激活后,有两大优势:
实现双甚至三重缓冲区轻而易举,因为您可以直接写入非事件缓冲区并激活它,只需更改 vga 卡中的寄存器,根本不需要内存复制!(您还是需要等待垂直回扫,否则会出现难看的闪烁)
缺点是这种模式更难编程,基本上,模式-X 现在单个内存地址映射到四个连续像素,因此,单个像素写入实际上会同时改变四个像素。 (这对于多边形填充程序来说是一个很好的加速!)。
如果你想改变单个像素,那么你必须设置一个“像素掩码”(也是一个 VGA 卡寄存器),指定四个像素中的哪一个会受到内存写入的影响,就在你绘制像素之前。
如果幼稚地完成,这会很慢,因为绘制的每个像素都需要设置 mask 。通常我们直观地倾向于从左到右,从上到下(因为这正是视频内存在 VGA 模式 13H 上的映射方式),但我们 Mode-X 程序员了解到“旋转范例”要快得多,即,我们从上到下、从左到右绘制东西。
为什么?因为这允许我们为绘制的每一列只修改一次像素掩码! 这是一些伪代码:
朴素、直观的编程
pixelptr = start of screen memory
foreach row
foreach column
adjust pixel mask
write pixel value
pixelptr+= 1 // advance pointer to next pixel to the left
next
next
循环编程方式
[Edit1:添加了指针必须移动到下一列顶部的缺失步骤]
[Edit2:更正,我添加 320 以前进到下一行,实际上这应该除以 4,因为视频内存地址的连续增量将映射到右侧的下一个四个像素组上一个,四像素组]
for each column
pixelptr = start of screen memory + current column index
adjust pixel mask // same mask applies to every pixel in the same column!
for each row
write pixel value
pixelptr += (320 / 4) // advance pointer to next pixel, to the bottom
next
next
所有涉及的步骤和注册地址在我提供的 Michael Abrash 专栏的链接中都有详细说明。这是古老的东西,但我打赌你会发现它很迷人!
干杯!
关于c - 需要帮助在 Borland C++ 3.0 上分配远指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428345/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: