恒定 FPS Android OpenGLES

2023-12-05

你好安卓开发者,

我正在 Eclipse 中使用 OpenGLES 1.0 为 Android 开发一个简单的游戏。我使用 Samsung Galaxy S2 Android(2.3) 作为开发设备。

我有一个关于双核和使帧速率恒定的问题。

因此,我成功创建了 GLSurfaceView 并覆盖了 onDrawFrame() 函数,其中我调用了 LogicUpdate(deltatime) 函数和 Render() 函数。

是的,目前全部在单线程中。

我遇到的问题是双核。如果我通过转到“设置”->“省电”并检查“系统省电”来禁用双核,我会发现渲染会自动锁定在 30 FPS。但是,如果我通过取消选中系统节能来启用双核,我会看到渲染锁定在 60 FPS,但是手机会变热并且电池电量消耗得非常快。

所以我的想法是让我的游戏以 30 FPS 运行以节省电池。

为此,我使用下面的代码。

在进行逻辑更新之前,我将其称为“和平代码”,请记住所有这些都是在 onDrawFrame() 中完成的。

if( CONST_FPS > 0 && StartTime > 0 )
{           
    /////////////////////////////////////////////////////////////////
    // Get frame time
    ////////////////////////////////////////////////////////////////
    long endTime  = System.currentTimeMillis(); 
    long time     = endTime - StartTime;
    //              
    long wantedtime = 1000 / CONST_FPS;
    //
    long wait = 0;
    if( time < wantedtime )
    {
        wait = wantedtime - time;
        //                  
        Thread.sleep(wait);
    }
    else
    {
        //Time to big game will slow down
    }                           
}

其中 CONST_FPS = 30

And then

StartTime = System.currentTimeMillis(); //

UpdateLogic(1.0 / CONST_FPS);
Render();

30 FPS 下游戏非常流畅,主要是因为它不需要锁定 FPS。 但是,当尝试将 60 FPS 锁定到 30 FPS 时,我会出现卡顿。我做了一些研究,发现 Thread.Sleep() 并不精确。这是真的?当锁定 60FPS 到 30FPS 时,我还能做些什么来让游戏更流畅。

感谢你的回答 ...


您应该使用经过的时间来缩放所有运动,以便运动在不同的 FPS 速率下保持平滑。您可以这样获取经过的时间:

long currentTime = System.currentTimeMillis();
float elapsed = (System.currentTimeMillis() - lastFrameTime) * .001f;//convert ms to seconds
lastFrameTime = currentTime; 

然后以每秒单位表示速度,并像这样更新位置:

sprite.x += (sprite.xspeed * elapsed);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

恒定 FPS Android OpenGLES 的相关文章

  • 如何拦截全局资源加载?

    背景 我需要使用翻译 SDK Lokalise 文档here https docs lokalise com en articles 3487109 lokalise android sdk 2 0 beta 旨在从其服务器加载字符串资源
  • 文件递归搜索

    我试图在根目录及其子目录中查找文件 步骤1 在指定路径中查找目录 步骤2 如果找到上述目录 则在其子目录之一中查找文件 为此 我使用下面的代码片段进行递归搜索 现在 这里的问题是 当它满足我的上述要求时 如何突破递归 boolean bFi
  • 将片段部分移出屏幕

    我已经被这个问题难住有一段时间了 我试图将包含在 FrameLayout 中的片段向右移动 以便只有片段的左侧 20 可见 我认为我遇到的问题是父级不会让片段移出其边界 或者我不知道如何移动它 我所尝试的一切只是将片段推到右墙上 然后缩放片
  • 未找到 Google 地图 api v2 类

    我正在使用谷歌地图 api v2 一切正常 今天早上我更新了 sdk 现在地图无法工作 尝试了很多事情 例如再次导入 lib 项目 但似乎没有任何效果 请帮忙 这是 logcat 输出 05 16 08 53 34 327 E dalvik
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • 如何在状态更改时更改 Android 切换按钮的文本颜色?

    我的切换按钮对于每个状态都有不同的颜色背景 红色和白色 现在我需要在激活时更改切换按钮文本 红色 白色 的颜色 使用 xml 我无法让它工作 也许有人知道我做错了什么 我的布局 xml 中的按钮
  • 删除SD卡上的文件夹

    I tried File delete 但它不起作用 如何删除SD卡上的目录 我正在开发 Android 2 1 在删除目录本身之前 您必须将所有目录清空 请参阅here http www rgagnon com javadetails j
  • cordova - 删除不必要的权限

    我需要在游戏中播放声音 因此我将 org apache cordova media 插件添加到我的应用程序中 现在platforms android AndroidManifest xml包含2个我不需要的条目
  • 针对 Android 开发优化 Eclipse

    我使用 Eclipse 和 ADT 插件开发 Android 而且速度 很慢 我必须经常重新启动 当我打开各种 Android 项目 当我使用库项目时需要 时 情况会变得更糟 使用 ADT 插件时 是否可以进行任何具体优化来提高 Eclip
  • Android Fragment 中的 SharedPreferences

    我正在尝试读取 Fragment 内的 SharedPreferences 我的代码用于获取任何其他活动中的首选项 SharedPreferences preferences getSharedPreferences pref 0 我收到错
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • 使用 Retrofit 2 添加标头以请求

    我正在尝试发送带有身份验证标头的请求 但服务器似乎无法识别客户端 我用了this https futurestud io tutorials android basic authentication with retrofit教程 并实现了
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • 如何以编程方式设置 ConstraintLayout 的 XML 属性“layout_constrainedWidth”?

    ConstraintLayout中 如何转换xml属性 app layout constrainedWidth true false in code 如果你想设置constrainedWidth Height以编程方式 那么你必须采取Con
  • 过滤列表视图并获取正确的 onclick 项目

    我有一个列表视图 并且已经实现了过滤 假设我有项目 A B 和 C 如果我在过滤框中输入 B 则只会显示项目 B 它是列表的位置 0 之前位于位置 1 因此 当我调用 onClick 项目时 我得到 id position 0 这导致显示有
  • XML 文档结构必须在同一实体内开始和结束

    我是 eclipse 的新手 我刚刚开始编写一些代码 实际上只是从网站复制并粘贴 谁能帮我解决这个问题 错误出现在最后一行
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 我收到“循环依赖”Android Dagger Hilt 错误

    我从头开始检查了所有内容 但找不到错误 我找不到错误 可能是什么 我收到以下编译错误 HomeViewModel java 6 error ComponentProcessor MiscError dagger internal codeg
  • 如何强制刷新 CallLog.Calls.CACHED_NAME 列?

    我的目标是从通话记录中收集所有未知的电话号码 这可以通过以下代码来实现 private static final String CALLOG PROJECTION CallLog Calls ID CallLog Calls CACHED

随机推荐

  • 在定界文档中使用expect命令

    对于以下微小的期望脚本 其函数已添加到 bash 配置文件中 chai expect lt lt EOF spawn ssh myuser myserver expect send mypassword r EOF We get bash
  • Service Worker 的存储限制是多少?

    大多数浏览器提供 localStorage 每个域的存储限制为 5MB 对于服务工作者是否存在这样的内存限制 约束 我知道网络工作人员 服务工作人员所基于的 没有这样的限制 但 Web Workers 并不完全用于资源缓存 而是更多地用于处
  • Symfony2 选择字段验证不起作用

    我在 Symfony 2 7 10 中有一个表单 其定义如下
  • 跨域 POST 请求的 CSRF 验证在生产中失败

    HTTP X CSRFTOKEN 标头与 csrftoken cookie 内的内容不匹配 我怎样才能检查cookie Set Cookie 不会显示在跨域请求的响应标头中 我已经按照以下位置中的说明进行操作 使用 Django 进行 CS
  • 在一台计算机上打开工作簿错误代码 32809,但在另一台计算机上打不开

    我有一个 Excel 2013 宏工作簿 本工作簿在过去 6 个月中一直运行良好 今年的第一天 我遇到了下面的问题 代码如下 这行代码所做的就是在打开工作簿时将 activex 复选框控件设置为 true Sheets WSCHARTS c
  • 将字符串分成两部分,长度几乎相同

    我有字符串 这是一个示例字符串 我需要将其拆分为 2 个字符串 而不破坏单词 并且这两个字符串将具有最接近的长度 因此结果将是 This is a sample string 另一个例子 Gorge is nice gt Gorge is
  • Rails /lib 模块和

    我正在编写一个自定义包装器open flash chart插入 它被放置在 lib并将其作为模块加载ApplicationController 但是 我有类层次结构的问题或其他问题 从我可以访问的任何控制器open flash chart功
  • 如何使用 VBA 验证 SAP GUI 中的活动窗口

    我目前正在尝试使用 VBA 修复 SAP 过程中的一些问题 现在我有一段代码可以正确处理有时出现的错误弹出窗口 If session findById wnd 2 usr txtMESSTXT1 Text Material j atuali
  • 有什么充分的理由使用 FormCollection 而不是 ViewModel 吗?

    我继承了用 ASP Net MVC 4 编写的代码库 每个 post 方法都需要一个FormCollection 除了必须通过带引号的字符串访问值的烦恼之外 它还会导致一些缺点 例如无法使用诸如ModelState IsValid or A
  • 如何在c中确定linux中的目录或文件

    我只想打印文件名而不打印目录名称 所以我实现了这个功能 void list file char directory DIR d struct dirent dir d opendir directory if d while dir rea
  • clientHeight/clientWidth 在不同浏览器上返回不同的值

    特性document body clientHeight and document body clientWidth在 IE7 IE8 和 Firefox 上返回不同的值 IE 8 document body clientHeight 70
  • Elasticsearch 结合多个存储桶和聚合

    假设我们正在查看相当简单的数据 索引中的每个文档都具有以下结构 Time 2018 01 01T19 35 00 0000000Z Country Germany Addr security web com FailureCount 5 S
  • 在 R 中生成一个具有 m 列和 n 行的随机矩阵,其中行总和为 1

    我想生成一个 nxm 矩阵 假设它是 100x3 我希望每一行的总和为 1 因此两个 0 和一个 1 sample c 0 0 1 3 会给我 1 行 但是有没有一种非常快速的方法可以在没有 rbind 的情况下生成整个矩阵 谢谢你 没有循
  • 如果值不存在,则将数组对象推入另一个数组对象

    如果值不存在 需要将数组对象 arr1 的值推送到另一个数组对象 arr2 中 现有值不会推入另一个数组 var arr1 name fred name bill name ted name james var arr2 name spil
  • Android,当我在设备上安装应用程序时图标重复

    我尝试在我的设备上安装我开发的应用程序 Htcdesire 我发现该应用程序的图标是重复的 我需要改变什么才不会迟到发生这种情况 我怎样才能删除其中一个图标 感谢您的帮助 我今天遇到这个问题 我正在使用 Gradle 我发现有一个文件夹 b
  • Android,在 onClickListener 中使用 Toast

    我试图让 toast 在 onClickListener 内给定某些条件时显示一些文本 该应用程序无法在模拟器中运行 并且出现以下错误 void 无法转换为 Toast 我四处搜索 在这个论坛上找到了几个类似的问题和解决方案 但没有一个完全
  • Python 的 Requests 库中的 Session 对象线程安全吗?

    Python 的流行Requests该库在其主页上据说是线程安全的 但没有给出更多细节 如果我打电话requests session 然后我可以安全地将这个对象传递给多个线程 如下所示 session requests session fo
  • Java中模块的动态加载

    在 Java 中 我可以动态地将内容添加到类路径并加载类 动态 意味着无需重新启动我的应用程序 是否有一个已知的框架 库可以处理模块的动态加载 卸载而无需重新启动 通常的设置 尤其是 Web 应用程序 是负载均衡器 多个应用程序实例以及逐步
  • 填充控制台中的最后一行

    我想填充 更新控制台的整个底线 例子 static void Main string args Console BufferWidth Console WindowWidth Console BufferHeight Console Win
  • 恒定 FPS Android OpenGLES

    你好安卓开发者 我正在 Eclipse 中使用 OpenGLES 1 0 为 Android 开发一个简单的游戏 我使用 Samsung Galaxy S2 Android 2 3 作为开发设备 我有一个关于双核和使帧速率恒定的问题 因此