很多人都在SDL_PollEvent和SDL_WaitEvent之间纠结。前者会带来更好的帧数表现,但是CPU占用极大,可以直接吃掉一个核心。后者则基本不占用CPU,但是帧数会受到影响。有没有办法使两者的优势结合呢?其实只要用轮询(SDL_PollEvent)并且配合一个帧速限制即可。

什么是帧速(FPS)?是指画面每秒传输帧数。要保证画面流畅,一般就要保持帧速在20及以上。要想限制帧速,我们只要在循环中加入如下代码:

const Uint FPS=/;//20可替换为限制的帧速
Uint32 _FPS_Timer;
while (quit!=){
//事件处理等
if(SDL_GetTicks()-_FPS_Timer<FPS){
SDL_Delay(FPS-SDL_GetTicks()+_FPS_Timer);
}
_FPS_Timer=SDL_GetTicks();
}

这个就是帧速率限制的方法。
      当我们开始传输一帧时,我们同时开始计时,跟踪显示当前帧用的时间。为了使这个程序不会运行的太快,每帧传输需要一定的时间,要求每秒显示20帧,那么每帧显示时间要不小于1/20秒。如果帧速率是60fps,每帧显示需要时间就要不小于1/60秒。例程要求是20帧每秒,也就是每帧需要耗时50毫秒。
     为了调整帧速率,我们首先要检查帧计时器的时间是否小于每帧传输所需时间。如果帧计时器时间大于每帧传输所需时间,就说明帧速率比要求的要低,这样我们就不需要进行限速调整了。如果帧计时器时间比每帧所需的时间少,那么我们就要用SDL_Delay()来进行延时,使帧速率符合要求。
     假设程序运行时,帧计时器的时间是20毫秒,那么我们就需要延时30毫秒;如果帧计时器是40毫秒,那么就要延时10毫秒(这样做的话,每帧相当于耗时50毫秒,帧传输速率就是20帧每秒)。

SDL实现限制帧速的更多相关文章

  1. SDL播放YUV----单帧

    用到的项目:Tocy-Android-SDLv2 C中的 入口: main.c as_lesson_XXX.c bmp_main : 在C中定义文件的路径: char *filepath = &quo ...

  2. Three.js中如何显示帧速【转】

    https://blog.csdn.net/hannahlwh1988/article/details/36876295 Step1:src中添加: <script src="js/s ...

  3. 移植FastBlur模糊算法至SDL

    FastBlur是Android标配的模糊算法,这也在当时引起了一股毛玻璃热潮.IOS7就采用了此算法(这有抄袭Android之嫌,因为Android1.5就在标库中加入了此函数).算法效率很高,这也 ...

  4. Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)

    学习内容: 1.了解Drawable类的作用 2.如何使用Drawable... 3.了解Tween动画... 4.如何创建和使用Tween动画... 1.Drawable类...   Drawabl ...

  5. [Unity3D]查看与设置游戏帧数FPS

    原地址:http://blog.sina.com.cn/s/blog_5b6cb9500101bta4.html 关于FPS,在PC端来说,游戏帧数跑得越高越好,FPS跑得越高游戏就越流畅,当然太高也 ...

  6. 【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画

    在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3 ...

  7. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  8. 《月之猎人 (Moon Hunters)》主角设计

    原文链接 游戏开发人员,你们好! 我是 Kitfox Games 工作室的总监 Tanya,我们的工作室位于加拿大的蒙特利尔,拥有六名员工. 我们 3 月份发布了<月之猎人>游戏的桌面版, ...

  9. C# Invoke或者BeginInvoke的使用

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...

随机推荐

  1. Html笔记(九)头标签

    头标签: <head> 头标签都放在 <head> </head> 头部分之间.包括:title base meta link <title> :指定浏 ...

  2. sed写的命令收集

    1. 替换一行字符串. <title name= > <param name="root", value="haha"/> <pa ...

  3. 详细讲解Hadoop源码阅读工程(以hadoop-2.6.0-src.tar.gz和hadoop-2.6.0-cdh5.4.5-src.tar.gz为代表)

    首先,说的是,本人到现在为止,已经玩过.                   对于,这样的软件,博友,可以去看我博客的相关博文.在此,不一一赘述! Eclipse *版本 Eclipse *下载 Jd ...

  4. 如何解决Python脚本在Linux和Windows上的格式问题

    python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...

  5. LLVM在静态分析上的增强 @ WWDC 2013

    在代码还没有真正跑起来的时候,可以利用Clang对代码进行静态分析. 1. 可以应用快捷键Shift+Command+B对项目代码进行分析: 2. 也可以针对某个文件进行分析(现有版本貌似不能针对特定 ...

  6. C# 基础知识 protected 关键字

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  7. windows 文件名太长无法删除的解决方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. PHP获取客户端和服务器IP地址

    /** * 获取客户端IP地址 * @return string */ function get_client_ip() { if(getenv('HTTP_CLIENT_IP')){ $client ...

  9. Monitoring and Tuning the Linux Networking Stack: Receiving Data

    http://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/ ...

  10. EL表达式中的“+-x/”四种运算符和条件,比较运算符等

    <%@page import="cn.hncu.domain.User"%><%@ page language="java" import=& ...