注册 登录
编程论坛 C图形专区

[求助]关于neo的几个问题

奔跑的鸟 发布于 2007-02-27 09:58, 2132 次点击

请教各位高手:
为什么我下载的neo包里的example文件夹里
1 。 第一个例子,就是hello word 的那个文字显示例子不能正常显示?(花的乱码)
2 。 几个调用图片的例子除了cs和人物动画那两个以外画面也都比较花不能正常显示
3 。 大部分例子在运行完后,很多键就不不管用了,比如不能用f3和方向键?
我用的是tc2.0,系统是xp,是不是用neo需要进行什么设置啊?

26 回复
#2
ba_wang_mao2007-02-28 12:00

很可能是显示器的原因

#3
奔跑的鸟2007-02-28 16:59

我的显卡是nvidia的gforce7300,笔记本上的

#4
RockCarry2007-02-28 19:56

怎么跟我的显卡一样,我也是GeForce7300,也是笔记本,华硕的。
显卡没有问题。

#5
奔跑的鸟2007-02-28 20:11
我的是联想的,不知道怎么回事,在另一台机器上也有第3个问题,而地震,日出,文字例子根本运行不出来,就响了一声,那台机器也是联想的,天僖I...
#6
jig2007-02-28 22:19
由于现在的显卡很多都不允许在16位实模式下修改分辨率和刷新率,所以你们的显示器出现蓝屏幕

要是大家是拿NEO学习,我强烈建议大家装个虚拟机,装上DOS,在这个虚拟DOS下去跑NEO,肯定没问题的。
#7
奔跑的鸟2007-03-01 16:10
哦,这样啊,汗,比较麻烦啊,那如果用neo做出的东西生成exe文件是不是也会显示不正常啊?
#8
一笔苍穹2007-03-02 08:59

这种现象在笔记本上的出现概率可能大一些,台式机没有这么糟糕,显示文字花掉的情况我都是头一次知道。

#9
奔跑的鸟2007-03-02 19:58
联想的机器啊....无奈了,两台机器都有点问题,台式机第一个例子根本运行不了,笔记本是花的,唉~
#10
一笔苍穹2007-03-27 13:56
以下是引用奔跑的鸟在2007-2-28 20:11:33的发言:
我的是联想的,不知道怎么回事,在另一台机器上也有第3个问题,而地震,日出,文字例子根本运行不出来,就响了一声,那台机器也是联想的,天僖I...

“就响了一声”,响了一声说明出错了,NEO会在EXE文件所在的目录生成一个包含错误代码的日志,看看是什么错吧。

#11
RockCarry2007-04-02 15:02

如果是英文显示是乱码的话,并且英文点阵使用的是机器BIOS里面的点阵数据的话,可能就是因为BIOS的原因了。
最早的,在吴进的TC256里面就是使用BIOS ROM里面的英文点阵,其方法大概是取得了某个地址,指向了英文点阵数据区。这种方法后来被证实不太可靠,因为不同机器的BIOS中的点阵数据可能是不同的。我以前就是使用此种方法,然后程序在自己机子上调好,到别人机器上就是乱码,如果在别人机器上调好,到自己机器上就成了乱码。
应该说是用BIOS里面的点阵数据是可行的,可能是TC256以及我后来的实现中,没有严格按照VGA的标准去做,而只是简单的取得了点阵数据区的地址。其实VGA在这方面是有一套标准的接口和操作流程的,最好能够严格按照其标准去做。
在我后来的实现中,将中英文全部采用文件形式的点阵字库来实现,个人感觉更加的简单易行,且易于维护。可以考虑采用这种方法。
字体方面,需要考虑的还有很多,比如矢量字库,国际化支持与多国语言等,因此需要好好思考,设计出简洁可扩充的调用接口,然后再加以实现。

如果是XP下进入VESA视频模式出现花屏,是因为某些显卡驱动的问题,一般情况下,更新一下显卡驱动就可以解决问题。我个人分析是XP再早期对SVGA的兼容性没有做好,但是当时各大显卡厂商已经按照微软提供的标准和DDK开发出了显卡驱动程序。后来MS发现了XP对SVGA的兼容性问题,对此做了修正(XP SP2中?猜测,因为SP2以前的好像始终不行)。当然,这种修正不是MS单方面就能解决问题的,还需要驱动开发厂商的配合,因此MS发布了新版的DDK,然后给出了新的县卡驱动标准,厂商就开发出修正般的驱动程序。作为用户就需要升级XP和显卡驱动,就可以解决问题。
当然,以上纯属个人推测。

[此贴子已经被作者于2007-4-2 16:18:53编辑过]

#12
RockCarry2007-04-02 15:59
以下是引用jig在2007-2-28 22:19:57的发言:
由于现在的显卡很多都不允许在16位实模式下修改分辨率和刷新率,所以你们的显示器出现蓝屏幕

要是大家是拿NEO学习,我强烈建议大家装个虚拟机,装上DOS,在这个虚拟DOS下去跑NEO,肯定没问题的。

Jig的说法有点错误。现在的PC机显卡,几乎都能支持到VESA VBE 2.0,VBE2.0中,在实模式和保护模式下都是可以进行设置视频模式等等与显卡相关的操作的。问题是在于Windows下,DOS程序是在Windows的一个虚拟机里运行的,而windows系统的这个虚拟机实现的好坏,就决定了windows对DOS程序兼容性的好坏。目前在XP上,大家是有目共睹的,做的不够好,所以才有这么多的问题。

更加严格的讲,我们所讲的VESA其实不是由显卡单方面实现的,很多功能是在主板的BIOS里面做的,当然显卡这边也需要进行配合。显卡里面有颗IC的,里面有更多的相关寄存器,更加底层(我这里就有一款显卡的资料,有兴趣地可以找我要)。BIOS程序其实才是真正实现VBE标准这一层的,BIOS直接会与显卡IC打交道,其下层是有差异的硬件,而向上提供的则是无差异的标准的VBE调用接口。这也是目前的许多主板只能支持某一系列的显卡的原因。
显卡发展到现在早已不再停留在VGA/SVGA/VESA标准上,这些标准都是针对2D的。现在的显卡已经具备了高性能的3D处理能力,曾有人将其称为AVGA。显卡3D方面的标准,目前应该还有确立,如果说有的话,可能OpenGL和D3D算是吧。但是这两个都只是给出了较为上层的接口,对于靠近硬件一层的相关标准应该是没有确立起来。显卡厂商需要和OS厂商配合,比如由MS和显卡厂商共同定义好D3D向下与显卡的接口,然后,将这个接口交给显卡厂商去实现,这个实现应该就是在显卡驱动里面做的吧。据个例子,在WinCE中,DirectDraw的实现就需要按照MS预先定义好的标准去做。
有关显卡3D接口的硬件方面的资料,在网上比较难找到,显卡厂商方面肯定是有的,只是可能出于商业原因,而没有公开。

我是做WinCE去冬开发的,并没有作过任何一个Windows的驱动,但是大致的原理应该都差不多的,因此我也相信以上基本上都是正确的,淡然也有些是猜测,如果有不对的,请指正。



[此贴子已经被作者于2007-4-2 16:10:24编辑过]

#13
一笔苍穹2007-04-02 18:37
以上两帖都很有道理,将中英双语言都放在文件中的确是个办法。JIG的意思是在16位编译器中比较难以实现刷新率的调整,我个人觉得很多黑屏问题与刷新率没有调整有关系。
最后那段猜测我和陈凯的想法一样,那份显卡资料我想要,呵呵:
dongkai329@yahoo.com.cn
#14
RockCarry2007-04-02 20:18
刷新率要改还是比较麻烦
其实按照通常的做法,我们都不会直接通过I/O去操作显示芯片,以达到改变分辨率和刷新率的目的。
在VGA系统中,是可以直接这样做的,并且能够实现被称为MODE-X的一系列显示模式。但是这样的做法并不推荐。
#15
RockCarry2007-04-02 20:18
在VESA标准中,则是,所有的操作都只能通过BIOS去实现,实模式下是通过软件中断,保护模式下是将BIOS复制一份到一个保护模式段中,然后找出调用地址,进行调用。大的原则就是不能直接访问显示IC,这样做更加安全,另一方面也是由于VESA显卡的硬件差异太大,每个显卡的内部实现和接口都是不同,VBE的目的就是为了屏蔽这些硬件的差异性,而向上提供一致的接口。
#16
RockCarry2007-04-02 20:19
VBE里面应该是定义了改变分辨率和刷新率的接口的,并且VBE2.0开始就支持实模式和保护模式两种模式。通常情况下,我们一不会直接改变分辨率和刷新率,而是通过调用接口查询当前的显卡所能支持的视频模式,然后再在这些可用的视频模式中,选择一种自己需要的模式。这应该是最为安全的做法(我个人是不太赞成VGA的MODE-X)。设置显卡不支持的显示模式也是导致异常的原因之一。
如果按照以上这样稳妥地做法,在XP下还要死机,那么我们就没有什么好的办法了,至少我是想不到了。
#17
RockCarry2007-04-02 20:21
晕,好像是家里网络的问题,导致发帖受限制
深圳电信宽带还真是垃圾,一点都不好用
在公司发帖都没有问题的,在家里必须要分成这样的一段一段的才能发。
都打电话投诉了好几次了,到现在还是没有解决问题。
#18
jig2007-04-14 08:53
那 RockCarry 兄,。能不能给个比较好的在DOS下设置为256色1024X768的模式的建议,我在MS-DOS7.1下去切换图形模式,还是出现了部分机器黑屏或花屏的现象。

要是实在不行,就只能去用32位的用现成的图形包试试啦。

[此贴子已经被作者于2007-4-14 8:54:19编辑过]

#19
RockCarry2007-04-14 09:46
我也没有实际做过
但是看VBE的标准里面是这样的:
1VESA下特定的显卡并不是一定就支持某个视频模式,1204x768x256这个视频模式并不是每个显卡都支持的。如果当前的显卡不支持这个视频模式,程序中设置这个视频模式时可能就会出问题
如何知道当前显卡能支持的视频模式?这个是有办法的,应该是VBE的
Function 00h - Return VBE Contorller information
Function 01h - Return Super VGA mode information
在设置视频模式时先查询显卡的能力,可以将返回的信息放到一个数组里面
然后实现setmode函数:
setmode(int width, int height, int color);
setmode函数会遍历前面的那个数组,看有没有对应的视频模式,然后再调用
Function 02h - Set Super VGA video mode
设置视频模式,如果该显卡不支持,则返回FLASE。
从VBE的文档上理解,应该是这种做法,但是我没有具体的实验过。这样做可能会设置某个视频模式失败,但是不会导致花屏和死机。
DirectDraw和Allegro应该都是这样做的吧。

[此贴子已经被作者于2007-4-14 10:46:16编辑过]

#20
一笔苍穹2007-04-16 08:43
NEO SDK后来加上的set_video_mode()函数就是这么做的,先询问显卡能支持的显示模式,再设置之,不过似乎仍然不行。超出刷新率范围的问题还是存在。所以我才认为是刷新率未与显示模式匹配造成的显示范围超出的。
#21
w21109420042007-04-16 16:39

我也有各問題-------為何我的電腦在運行
#include "neo.h"


main()
{
int a;


neo_init();
set_vbe_mode(VBE800X600X32K);
install_keyboard();
while (!keypressed()){}
}
時會進入文字介面????

希望各位大大解答下
謝謝

[此贴子已经被作者于2007-4-16 16:42:12编辑过]

#22
RockCarry2007-04-16 19:37
我对VBE的认识也只是停留在理论上,没有写过相关的代码。
如果这样都还不行的话,就没有办法了。
还是应该把VBE的文档认真看看,里面有很多Notice和Note。仔细看看,说不定遗漏了什么地方。
如果通过VBE都不行的话,就没有办法,也没有必要再考虑别的办法了。
有时间写程序看看。

[此贴子已经被作者于2007-4-16 19:49:02编辑过]

#23
一笔苍穹2007-04-17 18:49
以下是引用w2110942004在2007-4-16 16:39:48的发言:

我也有各問題-------為何我的電腦在運行
#include "neo.h"


main()
{
int a;


neo_init();
set_vbe_mode(VBE800X600X32K);
install_keyboard();
while (!keypressed()){}
}
時會進入文字介面????

希望各位大大解答下
謝謝



应该是你的显卡并不支持这个显示模式,使用set_vbe_mode(VBE800X600X64K);或set_video_mode(800, 600, 16, 60, 0);试试吧

#24
w21109420042007-04-17 21:28
試過了,結果換成屏幕沒輸出
別台電腦似乎也一樣
#25
一笔苍穹2007-04-19 09:20

你没有用任何绘图函数,屏幕上理应没输出的。也可能是你的显卡不支持这个显示模式,你可以先从最低的分辨率做起,因为只要是VGA的卡都支持320X200:
#include "neo.h"
main()
{
int a;


neo_init();
set_vbe_mode(VBE320X200X256);
install_keyboard();
rectfill(50, 50, 100, 100, _WHITE);
while (!keypressed()){}
}
我在里面加了个填充方块的函数,以便你观察输入。
好了,编译后应该能看到一个白色的方块了,接下来提高分辨率,不要急,先上到set_vbe_mode(VBE640X480X256);
OK的话再上800X600,这样就可以知道你的显卡支持的最高分辨率了。

#26
w21109420042007-04-19 14:30

恩 謝謝

似乎最大解析值是 640x480

範例都可運行

但我的顯示卡是 nVidia Geforce 6600 le

應該會有支援,那是否有可能是驅動程式的問題?

[此贴子已经被作者于2007-4-19 15:10:50编辑过]

#27
一笔苍穹2007-04-19 21:30
恩。是NEO对新显卡支持不够的原因,不好意思哈!我会再改进的。
1