仅游戏循环使用50%的CPU使用率,我还没有完成任何渲染工作.我在这做什么?
while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT ||
msg.message == WM_CLOSE ||
msg.message == WM_DESTROY)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//Run game code, break out of loop when the game is over
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试使用java.util.Timer中的Timer在Java中创建游戏循环.在计时器滴答声期间,我无法让我的游戏循环执行.以下是此问题的示例.我试图在游戏循环期间移动按钮,但它没有继续计时器滴答事件.
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JButton;
public class Window extends JFrame {
private static final long serialVersionUID = -2545695383117923190L;
private static Timer timer;
private static JButton button;
public Window(int x, int y, int width, int height, String title) {
this.setSize(width, height);
this.setLocation(x, y);
this.setTitle(title);
this.setLayout(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
timer = new Timer();
timer.schedule(new TimerTick(), 35);
button = new JButton("Button");
button.setVisible(true);
button.setLocation(50, 50);
button.setSize(120, 35);
this.add(button);
}
public void gameLoop() {
// Button does not move on timer tick. …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Scala,我正在尝试一个小玩具程序 - 在这种情况下是一个基于文本的TicTacToe.我根据我对scala的了解编写了一个工作版本,但注意到它主要是必要的,我的课程是可变的.
我正在尝试实现一些功能习惯用法,并且设法至少使表示游戏状态的类不可变.但是,我留下了一个负责执行游戏循环的类,依赖于可变状态和命令循环,如下所示:
var board: TicTacToeBoard = new TicTacToeBoard
def start() {
var gameState: GameState = new XMovesNext
outputState(gameState)
while (!gameState.isGameFinished) {
val position: Int = getSelectionFromUser
board = board.updated(position, gameState.nextTurn)
gameState = getGameState(board)
outputState(gameState)
}
}
Run Code Online (Sandbox Code Playgroud)
在这个循环中编写我正在做什么的更具惯用性的方法是什么?
完整的源代码在这里https://github.com/whaley/TicTacToe-in-Scala/tree/master/src/main/scala/com/jasonwhaley/tictactoe
Windows中有很多例子可以在相当高且稳定的帧速率下触发代码而不会占用CPU.
例如,WPF/Silverlight/WinRT应用程序可以执行此操作.浏览器和媒体播放器也是如此.他们究竟是如何做到的,以及我将从Win32应用程序中获得相同效果的API调用?
当然,时钟轮询不起作用,因为它会刺激CPU.也没有Sleep(),因为你最多只能获得大约50ms的粒度.
注意:我不是母语为英语的人.请原谅任何语法错误.
我开发了一个简单的游戏,左边有一个射手,右边有敌人......非常简单.
该项目几乎完成,它完美运行,但现在我对游戏循环管理有一些疑问.
我安排从右边出现的敌人给调度程序一个间隔,这没关系,但我通过一个简单的ccMoveTo动作从右到左管理敌人的移动,我再说一遍:它完美无缺.问题是我读了一些关于"在每一帧中渲染精灵"的内容,将此操作委托给每帧运行一次的调度方法.
更好:我读到不使用动作移动精灵,但是逐帧重新渲染它们模拟以1/60频率(fps频率)调用的预定方法中的移动,并且我读到此实现可以防止不同硬件系统的稳定性差异..
我问的是:
编辑:
- 同样的技术也应该用于动画吗?
我决定最近开始研究一个小型2D游戏.我已经有一些引力工作了.我开始在java上变得更好但是我从来没有在这个项目之前使用过java AWT或任何与渲染有关的东西,基本上这是我的问题:
我得到了一个角色,每个蜱虫走1个像素,这太慢了.如果我将它提升到2个刻度,它太快了,而且角色几乎正在运行.我想要介于两者之间,但问题是X和Y存储为int,如果我将它们更改为float,我将不得不将它们转换为int类似(int)的东西,这将导致删除浮动数字.
我试过的是每2个刻度而不是1个刻度更新角色的X或者使游戏循环变慢但是看起来相当不稳定.如果有人有一个很好的解决方案,请留言.谢谢!
我正在尝试编写一个python游戏循环,希望考虑到FPS.调用循环的正确方法是什么?我考虑过的一些可能性如下.我试图不使用像pygame这样的库.
1.
while True:
mainLoop()
Run Code Online (Sandbox Code Playgroud)
2.
def mainLoop():
# run some game code
time.sleep(Interval)
mainLoop()
Run Code Online (Sandbox Code Playgroud)
3.
def mainLoop():
# run some game code
threading.timer(Interval, mainLoop).start()
Run Code Online (Sandbox Code Playgroud)
4.使用sched.scheduler?
有人可以为一个只有"游戏循环"的程序编写一个源代码,这个循环只会循环,直到你按下Esc,程序会显示一个基本的图像.下面是我现在拥有的源代码,但我必须使用SDL_Delay(2000);该程序保持活动2秒,在此期间程序被冻结.
#include "SDL.h"
int main(int argc, char* args[]) {
SDL_Surface* hello = NULL;
SDL_Surface* screen = NULL;
SDL_Init(SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
hello = SDL_LoadBMP("hello.bmp");
SDL_BlitSurface(hello, NULL, screen, NULL);
SDL_Flip(screen);
SDL_Delay(2000);
SDL_FreeSurface(hello);
SDL_Quit();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只想让程序打开,直到我按下Esc.我知道循环是如何工作的,我只是不知道我是在main()函数内部实现还是在函数内部实现.我试过了两次,两次都失败了.如果你能帮助我,那就太棒了:P
我拼凑了一个简单的游戏循环,主要是使用看起来很普遍的技术,特别是在Java的杀手游戏编程书中,在本教程中我刚刚发现:这里 只是一个带有后台缓冲区的简单,定时的游戏循环.
问题是它不会以良好的FPS重绘屏幕.我能从摩托罗拉Xoom中获得的最好成绩是15FPS,目标是24.
如果我的后置缓冲区大小的一半,速度会大幅提升,所以我猜这个问题可能与利用Xoom上的屏幕有关(我的SurfaceView的大小是1280x727)...还有其他游戏看到了以相同的尺寸完美地运行.
我没有任何其他设备可以测试,所以我现在有点卡住了该做什么.
我做错了什么/失踪/无知?
我正在编写一个Objective-C游戏,我正处于我应该开始在游戏循环中优化我的一些代码的阶段.
我使用了大量的类比较方法,
if([obj isMemberOfClass:[SomeClass class]])
等
我听说这种检查是相当昂贵的,因为我只选择有1个阵列填充了多个类,我需要某种类的检查.
我想也许在NSObject子类化NSObject中添加一个属性来包含一个字符串属性,在初始化过程中我将使该等特定子类的类名等于.然后干脆做一个
if([obj.klass isEqualTo:@"SomeClass"])
这会有益吗?
我试图尽可能多地保持游戏循环中的动态编码.
谢谢!
game-loop ×10
java ×2
swing ×2
winapi ×2
android ×1
c++ ×1
canvas ×1
frame-rate ×1
game-engine ×1
iphone ×1
loops ×1
objective-c ×1
python ×1
scala ×1
sdl ×1
surfaceview ×1
timer ×1