在Allegro 5中编写游戏循环的最佳方法是什么,它始终以相同的速度运行,并且正确地将绘图逻辑与更新逻辑分开?我应该使用线程吗?我应该使用新的Allegro事件系统吗?
我刚刚阅读了DirectX文档,并在IDirect3DDevice9 :: BeginScene的页面中遇到了一些有趣的东西:
要在CPU和图形加速器之间实现最大并行性,最好尽可能远远地调用 IDirect3DDevice9 :: EndScene.
我已经习惯于编写我的游戏循环来处理输入等等,然后画画.我有倒退吗?也许游戏循环应该更像这样:(半伪代码,显然)
while(running) {
d3ddev->Clear(...);
d3ddev->BeginScene();
// draw things
d3ddev->EndScene();
// handle input
// do any other processing
// play sounds, etc.
d3ddev->Present(NULL, NULL, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
根据文档的那句话,这个循环将"启用最大并行性".
这常见吗?订购这样的游戏循环有什么缺点吗?在第一次迭代之后我发现它没有真正的问题...我知道知道实际速度增加的最佳方法就是实际对它进行基准测试,但是还有其他人已经尝试过这个并且你可以证明任何实际的提速?
我在win32 GDI中创建游戏马里奥.我已经实现了游戏的新循环:
PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
while (msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else // No message to do
{
gGameMain->GameLoop();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的游戏一直在运行,直到我按下Ctrl + Alt + Del(鼠标光标正在滚动).
我目前有一些接近以下实现基于物理的游戏的FPS独立游戏循环的东西.它几乎可以在我测试的每台计算机上运行良好,在帧速率下降时保持游戏速度一致.然而,我将移植到嵌入式设备,这可能会更加困难的视频,我想知道它是否仍然会削减芥末.
编辑:
对于这个问题,假设msecs()返回程序运行的以毫秒为单位的时间.msecs的实现在不同平台上是不同的.此循环也在不同平台上以不同方式运行.
#define MSECS_PER_STEP 20
int stepCount, stepSize; // these are not globals in the real source
void loop() {
int i,j;
int iterations =0;
static int accumulator; // the accumulator holds extra msecs
static int lastMsec;
int deltatime = msec() - lastMsec;
lastMsec = msec();
// deltatime should be the time since the last call to loop
if (deltatime != 0) {
// iterations determines the number of steps which are needed
iterations = deltatime/MSECS_PER_STEP;
// save any …Run Code Online (Sandbox Code Playgroud) 我可以找到一组java 2D游戏教程和Android游戏教程,它们只使用原生图形库.
我在C#中寻找类似的东西(没有DirectX或XNA)
我发现这个游戏循环骨架,但它没有告诉如何渲染图形.
目标是模拟一个简单的电子设备.
当用户快速按下键盘上的某些键时,我需要显示一些图形输出.这看起来像一个街机游戏.
例如,当用户按下其中一个箭头键时,指针(图像)将相应地移动.
我想我不能用典型的Windows Forms Application做到这一点吗?
例如,使用PictureBox控件并在KeyPress发生时将其移动Form.
我在javascript中创建一个游戏,我的游戏循环每隔30ms被调用一次,它会泄漏大量内存,因为任务管理器显示firefox内存使用量在大约20秒内增加400mb.我不熟悉如何确保在javascript中收集内存.
function GameLoop(tick) {
move(player1.ship);
}
function Player(name) {
this.id = 0;
this.name = name;
this.ship = Ship(this);
}
function Ship(player) {
this.pos = [1024/2, 768/2];
this.vel = [0, 0];
this.angle = 0;
this.acc = 0;
this.thrust = 0;
this.west = 0;
this.east = 0;
this.turnRate = 5;
this.player = player;
this.size = [40, 40];
this.ship = canvas.rect(this.pos[0], this.pos[1], this.size[0], this.size[1]);
this.ship.attr("fill", "red");
return this;
}
function move(ship) {
var angle = ship.angle;
var max_speed = 20;
var acc_speed = …Run Code Online (Sandbox Code Playgroud) 我的目标是创建一个有效的游戏循环,该循环requestAnimationFrame用于更新显示画布和setTimeout更新游戏逻辑。我的问题是我应该将所有绘图操作放到requestAnimationFrame循环中还是仅将更新HTML画布的主绘图操作放到循环中?
我所说的“所有绘制操作”是所有缓冲。例如,我将所有的精灵绘制到缓冲区,然后将缓冲区绘制到主画布。一方面,如果我将所有缓冲放入其中,则requestAnimationFrame不会在每次逻辑更新时都浪费cpu绘图,另一方面,绘图会占用大量cpu并可能导致requestAniomationFrame等待所有这些操作完成...将逻辑更新与绘图分开的目的是requestAnimationFrame不会因非绘图处理而陷入困境。
有没有人对使用这种创建游戏循环的方法有任何经验?而且不要说“只把它全部放进去requestAnimationFrame”,因为这会减慢渲染速度。我坚信将逻辑与绘图分开是必经之路。这是我正在谈论的示例:
/* The drawing loop. */
function render(time_stamp_){//First parameter of RAF callback is timestamp.
window.requestAnimationFrame(render);
/* Draw all my sprites in the render function? */
/* Or should I move this to the logic loop? */
for (var i=sprites.length-1;i>-1;i--){
sprites[i].drawTo(buffer);
}
/* Update the on screen canvas. */
display.drawImage(buffer.canvas,0,0,100,100,0,0,100,100);
}
/* The logic loop. */
function update(){
window.setTimeout(update,20);
/* Update all my sprites. */ …Run Code Online (Sandbox Code Playgroud) 我正在处理游戏循环并打算创建一些游戏作为练习。
目前我有一个稳定的游戏循环,游戏更新速度尽可能快,渲染每秒更新 x 次(当前为 25)
渲染方法基本上是一个 draw + Console.Clear() 并且在非常高的更新中显示变得非常紧张,因为当 Console.Clear() 命中时它没有完成绘制。
有没有更好的方法来做这样的事情?
我可以将任何数据写入控制台,然后用其他数据替换它吗?
所以,我正在用 JAVA 创建一个等距游戏;简单来说,它有一个由瓦片组成的地图,当用户在屏幕上拖动鼠标时,地图就会移动。为了给你们一个想法,它目前看起来像这样:

在实际原型版本之前,我构建了一个本身没有“游戏循环”的小型 Java 应用程序;唯一更新 tile-map 位置的是鼠标拖动的事件侦听器,它在移动更新后调用 repaint() 方法。它工作正常,我可以选择瓷砖并毫无问题地移动地图。
从那时起,我重建了原型思维,开发了更像真正的游戏引擎,具有游戏状态管理器和真正的游戏循环;游戏循环代码如下所示:
init();
long start;
long elapsed;
long wait;
while(running){
start = System.nanoTime();
update();
draw();
drawToScreen();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
if(wait < 0)wait = 5;
try{
Thread.sleep(wait);
} catch(Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
GameStateManager 使用 update() 和 draw() 方法进行访问,因此我可以像旧原型一样很好地绘制地图。当我在屏幕上拖动鼠标以便地图可以移动时出现问题; 动画变得非常粗糙,以至于我实际上可以看到瓷砖之间的黑色背景在所有瓷砖的最终位置之前移动。
起初我以为问题出在游戏循环线程和主类的事件侦听器之间的并发性,因为可以在 JPanel 尝试绘制刚才绘制的地图时调用 mouseDragged 事件;然后我在我的游戏循环代码上测试了这个:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
draw();
drawToScreen();
}
});
//draw();
//drawToScreen();
Run Code Online (Sandbox Code Playgroud)
现在原型工作得很好。
所以,我的问题是,这种性能是沉重的,还是在 Java 中只是一种不好的做法?另外,我的“并发”假设是否正确?这是我第一次在 Java 中处理线程,所以我真的不知道我是否以正确的方式处理了这个问题。 …
我\xe2\x80\x99m正在阅读Python Arcade上的教程,并且想知道一个函数如何/为什么工作。
\n\n有一个函数叫on_draw(delta_time)
我查看了街机的代码,但无法弄清楚该库如何知道保持时钟运行。有人可以帮助我理解它是如何工作的以及为什么工作吗?
\n\n一个例子在这里:http ://arcade.academy/examples/bouncing_rectangle.html#bouncing-rectangle
\n