这是过去的怪事!
我正在为命令提示符编写一个 ASCII Pong 游戏(是的,是 oldschool),并且我正在直接写入视频内存(添加。0xB8000000)所以我知道我正在快速渲染(而不是 gotoxy 然后 printf 渲染)
我的代码工作正常,代码在 Turbo C++ V1.01 下编译良好,但动画滞后......现在等一下,有一个警告!在我的超高速涡轮增压 Dell Core 2 Duo 下,这似乎是合乎逻辑的,但是当我按住键盘上的一个键时,动画变得像新编译的婴儿屁股一样流畅。
我想可能是因为我通过超载键盘缓冲区来减慢计算机的速度(真的吗?来吧......)但后来我很快变得聪明并尝试为 DJGPP 和 Tiny C 编译器编译以测试结果是否相同. 在 Tiny C 编译器上,我发现我无法编译“远”指针类型......仍然对此感到困惑,但我能够为 DJGPP 编译并且动画运行顺利!
我想编译它并让它适用于 Turbo C++,但这个问题在过去 3 天里一直困扰着我,无法解决。有谁知道为什么 Turbo C++ 常量调用我的渲染方法(下面的代码)会滞后于命令提示符但 DJGPP 不会?我不知道我是否正在编译为调试,我什至不知道如何检查我是否是。我确实将代码转换为 ASM,并且在源代码的标题中看到了看起来正在调试数据的内容,所以我不知道......
任何和所有的评论和帮助将不胜感激!
这是我所反对的一个简单示例,易于编译,因此请查看:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<time.h>
#define bX 80
#define bY 24
#define halfX bX/2
#define halfY bY/2
#define resolution bX*bY
#define LEFT 1
#define RIGHT 2
void GameLoop();
void render();
void clearBoard();
void printBoard();
void ballLogic();
typedef struct {
int x, y;
}vertex;
vertex vertexWith(int x, int y) {
vertex retVal;
retVal.x = x;
retVal.y = y;
return retVal;
}
vertex vertexFrom(vertex from) {
vertex retVal;
retVal.x = from.x;
retVal.y = from.y;
return retVal;
}
int direction;
char far *Screen_base;
char *board;
vertex ballPos;
void main() {
Screen_base = (char far*)0xB8000000;
ballPos = vertexWith(halfX, halfY);
direction = LEFT;
board = (char *)malloc(resolution*sizeof(char));
GameLoop();
}
void GameLoop() {
char input;
clrscr();
clearBoard();
do {
if(kbhit())
input = getch();
render();
ballLogic();
delay(50);
}while(input != 'p');
clrscr();
}
void render() {
clearBoard();
board[ballPos.y*bX+ballPos.x] = 'X';
printBoard();
}
void clearBoard() {
int d;
for(d=0;d<resolution;d++)
board[d] = ' ';
}
void printBoard() {
int d;
char far *target = Screen_base+d;
for(d=0;d<resolution;d++) {
*target = board[d];
*(target+1) = LIGHTGRAY;
++target;
++target;
}
}
void ballLogic() {
vertex newPos = vertexFrom(ballPos);
if(direction == LEFT)
newPos.x--;
if(direction == RIGHT)
newPos.x++;
if(newPos.x == 0)
direction = RIGHT;
else if(newPos.x == bX)
direction = LEFT;
else
ballPos = vertexFrom(newPos);
}