栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

游戏循环中最佳睡眠时间计算的研究

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

游戏循环中最佳睡眠时间计算的研究

您可以使用与互斥锁关联的
循环计时器。这是IHMO做您想要的事的最有效方法。但是,然后您应该考虑跳过帧以防计算机延迟(您可以使用计时器代码中的另一个非阻塞互斥锁来做到这一点。)

编辑:一些伪代码来澄清

计时器代码:

While(true):  if acquireIfPossible(mutexSkipRender):    release(mutexSkipRender)    release(mutexRender)

睡眠代码:

acquire(mutexSkipRender)acquire(mutexRender)release(mutexSkipRender)

起始值:

mutexSkipRender = 1mutexRender = 0

编辑 :更正了初始化值。

以下代码在Windows上运行良好(以50 fps的精度精确到毫秒地循环)

import java.util.Date;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.Semaphore;public class Main {    public static void main(String[] args) throws InterruptedException {        final Semaphore mutexRefresh = new Semaphore(0);        final Semaphore mutexRefreshing = new Semaphore(1);        int refresh = 0;        Timer timRefresh = new Timer();        timRefresh.scheduleAtFixedRate(new TimerTask() { @Override public void run() {     if(mutexRefreshing.tryAcquire()) {         mutexRefreshing.release();         mutexRefresh.release();     } }        }, 0, 1000/50);        // The timer is started and configured for 50fps        Date startDate = new Date();        while(true) { // Refreshing loop mutexRefresh.acquire(); mutexRefreshing.acquire(); // Refresh  refresh += 1; if(refresh % 50 == 0) {     Date endDate = new Date();     System.out.println(String.valueOf(50.0*1000/(endDate.getTime() - startDate.getTime())) + " fps.");     startDate = new Date(); } mutexRefreshing.release();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437902.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号