我在Pygame中写了一个简单的自上而下的RPG,我发现它很慢......虽然我不希望python或pygame匹配用C/C++或事件Byte Compiled等编译语言制作的游戏的FPS像Java一样,但目前的pygame的FPS仍然是15.我尝试渲染16色Bitmaps而不是PNG或24位图,这略微提高了速度,然后在绝望中,我将所有内容切换为黑白单色位图,使FPS达到35.但不是更多.现在根据我读过的大多数游戏开发书籍,为了让用户对游戏图形完全满意,2d游戏的FPS至少应该是40,那么有什么方法可以提高pygame的速度吗?
我正在尝试使用前置摄像头录制视频,以下是代码片段,我将setVideoFrameRate设置为29,但录制的视频的fps介于7.5和8之间.我需要录制视频的视频fps 29.
recorder.setPreviewDisplay(holder.getSurface());
recorder.setOnInfoListener(this);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(29);
recorder.setVideoSize(640,480);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setOutputFile("/sdcard/recordvideooutput.mp4");
recorder.setMaxDuration(16*1000);
Run Code Online (Sandbox Code Playgroud) 我在模式后面有一个完整的图像目录<timestamp>.png,其中<timestamp>表示自第一个图像以来经过的毫秒数. input.txt包含有趣图像的列表:
file '0.png'
file '97.png'
file '178.png'
file '242.png'
file '296.png'
file '363.png'
...
Run Code Online (Sandbox Code Playgroud)
我使用ffmpeg将这些图像连接成一个视频:
ffmpeg -r 15 -f concat -i input.txt output.webm
Run Code Online (Sandbox Code Playgroud)
如何告诉ffmpeg将每个帧放在其实际位置而不是使用恒定帧速率?
我在Linux/XWindows上的简单Java2D应用程序中遇到系统事件和窗口刷新率之间的意外交互.最好用下面的小例子来说明.
该程序创建一个小窗口,其中以不同的旋转显示半圆.图形以每秒60帧的速度更新,以产生闪烁的显示.这是通过a BufferStrategy,即通过调用其show方法来实现的.
但是,我注意到当我(a)将鼠标移到窗口上以便窗口接收鼠标悬停事件或(b)按住键盘上的键以使窗口接收键盘事件时,闪烁明显增加.
由于BufferStrategy.show()调用的速率不受这些事件的影响,可以通过控制台上的打印输出看到(它们应该始终保持在60 fps左右).然而,更快的闪烁表明显示实际更新的速率确实改变了.
在我看来,除非生成鼠标或键盘事件,否则无法实现实际的,即每秒可见的60帧.
public class Test {
// pass the path to 'test.png' as command line parameter
public static void main(String[] args) throws Exception {
BufferedImage image = ImageIO.read(new File(args[0]));
// create window
JFrame frame = new JFrame();
Canvas canvas = new Canvas();
canvas.setPreferredSize(new Dimension(100, 100));
frame.getContentPane().add(canvas);
frame.pack();
frame.setVisible(true);
int fps = 0;
long nsPerFrame = 1000000000 / 60; // 60 = target fps
long showTime = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个小卡片交换世界旅行游戏,我想象它是宝石迷阵和10天地理棋盘游戏之间的交叉.到目前为止,编码一直没问题,但帧速率非常糟糕......目前我的Core 2 Duo上的低20分.这是一个问题,因为我正在为英特尔3月的开发者竞赛创建游戏,该竞赛正好针对上网本包装动力不足的Atom处理器.
这是游戏的屏幕:
alt text http://www.necessarygames.com/my_games/betraveled/betraveled-fps.png
我是Python和Pygame的新手(这是我第一次使用它们),而且很遗憾缺乏正式的CS训练......也就是说我认为可能会有很多不良做法在我的代码中,以及可以优化的A LOT.如果你们中的一些老Python手不介意看看我的代码,看看你是否找不到任何明显的优化领域,我将非常感激.
你可以在这里下载完整的源代码(Python 2.6 + Pygame 1.9):http: //www.necessarygames.com/my_games/betraveled/betraveled_src0328.zip
编译的exe在这里:www.necessarygames.com/my_games/betraveled/betraveled_src0328.zip
我关注的一件事是我的事件管理器,我觉得它可能有一些性能整体,而另一件事是我的渲染......我几乎只是将所有内容一直显示在屏幕上(参见渲染例程)在我的game_components.py下面); 我最近发现你应该只更新屏幕上已经发生变化的区域,但我仍然对如何完成这一点仍然模糊......这可能是一个巨大的性能问题吗?
任何想法都非常感谢!像往常一样,我很高兴通过PayPal为您提供时间和精力.
Jordan
EDIT:
感谢下面的建议,我在代码上运行了cprofile.如果有人愿意看看这个输出并让我知道什么是不可预期的,那将是很好的.
这是p.strip_dirs()的输出.sort_stats('cumulative').print_stats():
pydev debugger: starting
Sun Mar 28 04:46:16 2010 cprofile
8383715 function calls (8264821 primitive calls) in 157.732 CPU seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 157.732 157.732 <string>:1(<module>)
1 0.000 0.000 157.732 157.732 main.py:47(main)
1 0.074 …Run Code Online (Sandbox Code Playgroud) 我的游戏在大多数手机上运行良好(56 FPS),但其他游戏的运行速度约为25 FPS.在我的游戏中,我有3个粒子系统,据我所知,问题来自于此.我的问题:如果我检测到FPS低于30,那么停止产生粒子是个好主意吗?如果FPS更高,则只需正常运行.我不确定这是否会导致任何问题.还有其他解决方案吗?
我试图找到一个可靠的方法,能够准确设置我希望我的OpenGL应用程序在屏幕上呈现多少FPS.我可以通过休眠1000/fps毫秒在某种程度上做到这一点,但这没有考虑渲染所需的时间.哪种是将fps限制在所需数量的最一致方法?
查看CSS动画来替换加载轮子中的动画GIF.
这里有一个基本的例子http://jsfiddle.net/kFmY8/448/
#me {
-webkit-animation: rotation 2s infinite linear;
}
@-webkit-keyframes rotation {
from {-webkit-transform: rotate(0deg);}
to {-webkit-transform: rotate(360deg);}
}
Run Code Online (Sandbox Code Playgroud)
我想改变帧速率,这样每个周期只有12帧.这将取消动画的流动性,使其更接近于它所替代的动画GIF.
可以这样做吗?
我正在使用Sprite Kit 制作一个" Achtung die kurve ".对于不断移动的线/玩家,我正在使用A CGMutablePathRef和SKShapeNode.在更新方法中,我正在这样做
// _lineNode is an instance of SKShapeNode and path is CGMutablePathRef
CGPathAddLineToPoint(path, NULL, _xPos, _yPos);
_lineNode.path = path;
Run Code Online (Sandbox Code Playgroud)
添加到该行.更新方法还在不断更新_xPos和_yPos以使其增长.
我想我真正要问的是有另一种更有效的绘制线条的方法,因为我现在这样做的方式现在会在一段时间后(大约15-20秒)将帧速率降低太多.此时FPS不断下降,直到游戏无法播放.时间分析器告诉我这一行:_lineNode.path = path是FPS丢弃的原因.
谢谢你的帮助!非常感谢.
PS.我试图不使用SKShapeNode,因为他们似乎无法画得太好(曲线中的小孔/文物等)
截图:

我正在用Java开发第一人称射击游戏,我想实现鼠标移动旋转玩家的控件.但是在Java中,我只能通过使用MouseListener事件来获取鼠标坐标,因此一旦鼠标光标离开监视器边缘,坐标将停止变化,我将无法转动播放器的视图.
关于如何做的任何提示/建议?谢谢.
frame-rate ×10
java ×3
android ×2
performance ×2
pygame ×2
python ×2
3d ×1
andengine ×1
css3 ×1
ffmpeg ×1
graphics2d ×1
opengl ×1
skshapenode ×1
sprite-kit ×1
video ×1
x11 ×1