首页 > 编程知识 正文

单机游戏(fps游戏_Android游戏开发–测量FPS)

时间:2023-05-06 08:41:08 阅读:123929 作者:3466

fps游戏

在上一篇文章中,我们创建了一个以恒定速度和恒定FPS运行的游戏周期。

怎么测量?

检查新的MainThread.java类。

package net.obviam.droidz; 导入Java.text.decimal format; import android.graphics.Canvas; 导入安卓. util.log; 导入安卓. view.surface holder;/* * @ author impaler * * themainthreadwhichcontainsthegameloop.thethreadmusthaveaccessto * thesurfaceviewandholdertotrigeriger publicclassmainthreadextendsthread { privatestaticfinalstringtag=mmm//desiredfpsprivatefinalstaticintmax _ fps=50; //maximumnumberofframestobeskippedprivatefinalstaticintmax _ frame _ skips=5; //theframeperiodprivatefinalstaticintframe _ period=1000/max _ fps; //stuffforstats */privatedecimalformatdf=new decimal format ('0. # ); //2dp//we ' llbereadingthestatseverysecondprivatefinalstaticintstat _ interval=1000; //ms//theaveragewillbecalculatedbystoring//thelastnfpssprivatefinalstaticintfps _ history _ NR=10; //lasttimethestatuswasstoredprivatelonglaststatusstore=0; //thestatustimecounterprivatelongstatusintervaltimer=0l; //numberofframesskippedsincethegamestartedprivatelongtotalframesskipped=0l; //numberofframesskippedinastorecycle (1sec ) privatelongframesskippedperstatcycle=0l; //numberofrenderedframesinanintervalprivateintframecountperstatcycle=0; 私密长总帧计数=0l; //thelastfpsvaluesprivatedoublefpsstore [ ]; //thenumberoftimesthestathasbeenreadprivatelongstatscount=0; //theaveragefpssincethegamestartedprivatedoubleaveragefps=0.0; //surfaceholderthatcanaccessthephysicalsurfaceprivatesurfaceholdersurfaceholdersurfaceholder; //theactualviewthathandlesinputs//anddrawstothesurfaceprivatemaingamepanelgamepanel; //flagtoholdgamestateprivatebooleanrunning; publicvoidsetrunning (布尔运行) {this.running=running; } publicmainthread (surfaceholdersurfaceholder,MainGamePanel gamePanel ) {super ); this.surface holder=surface holder; this.gamePanel=gamePanel; }@Overridepublic void run () {Canvas canvas; log.d(tag,'开始game loop '; //initialisetimingelementsforstatgatheringinittimingelements (; 龙北时间; //the time when the cyc

le begunlong timeDiff;// the time it took for the cycle to executeint sleepTime;// ms to sleep (<0 if we're behind)int framesSkipped;// number of frames being skipped sleepTime = 0;while (running) {canvas = null;// try locking the canvas for exclusive pixel editing// in the surfacetry {canvas = this.surfaceHolder.lockCanvas();synchronized (surfaceHolder) {beginTime = System.currentTimeMillis();framesSkipped = 0;// resetting the frames skipped// update game statethis.gamePanel.update();// render state to the screen// draws the canvas on the panelthis.gamePanel.render(canvas);// calculate how long did the cycle taketimeDiff = System.currentTimeMillis() - beginTime;// calculate sleep timesleepTime = (int)(FRAME_PERIOD - timeDiff);if (sleepTime > 0) {// if sleepTime > 0 we're OKtry {// send the thread to sleep for a short period// very useful for battery savingThread.sleep(sleepTime);} catch (InterruptedException e) {}}while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {// we need to catch upthis.gamePanel.update(); // update without renderingsleepTime += FRAME_PERIOD;// add frame period to check if in next frameframesSkipped++;}if (framesSkipped > 0) {Log.d(TAG, "Skipped:" + framesSkipped);}// for statisticsframesSkippedPerStatCycle += framesSkipped;// calling the routine to store the gathered statisticsstoreStats();}} finally {// in case of an exception the surface is not left in// an inconsistent stateif (canvas != null) {surfaceHolder.unlockCanvasAndPost(canvas);}}// end finally}}/** * The statistics - it is called every cycle, it checks if time since last * store is greater than the statistics gathering period (1 sec) and if so * it calculates the FPS for the last period and stores it. * * It tracks the number of frames per period. The number of frames since * the start of the period are summed up and the calculation takes part * only if the next period and the frame count is reset to 0. */private void storeStats() {frameCountPerStatCycle++;totalFrameCount++;// check the actual timestatusIntervalTimer += (System.currentTimeMillis() - statusIntervalTimer);if (statusIntervalTimer >= lastStatusStore + STAT_INTERVAL) {// calculate the actual frames pers status check intervaldouble actualFps = (double)(frameCountPerStatCycle / (STAT_INTERVAL / 1000));//stores the latest fps in the arrayfpsStore[(int) statsCount % FPS_HISTORY_NR] = actualFps;// increase the number of times statistics was calculatedstatsCount++;double totalFps = 0.0;// sum up the stored fps valuesfor (int i = 0; i < FPS_HISTORY_NR; i++) {totalFps += fpsStore[i];}// obtain the averageif (statsCount < FPS_HISTORY_NR) {// in case of the first 10 triggersaverageFps = totalFps / statsCount;} else {averageFps = totalFps / FPS_HISTORY_NR;}// saving the number of total frames skippedtotalFramesSkipped += framesSkippedPerStatCycle;// resetting the counters after a status record (1 sec)framesSkippedPerStatCycle = 0;statusIntervalTimer = 0;frameCountPerStatCycle = 0;statusIntervalTimer = System.currentTimeMillis();lastStatusStore = statusIntervalTimer;//Log.d(TAG, "Average FPS:" + df.format(averageFps));gamePanel.setAvgFps("FPS: " + df.format(averageFps));}}private void initTimingElements() {// initialise timing elementsfpsStore = new double[FPS_HISTORY_NR];for (int i = 0; i < FPS_HISTORY_NR; i++) {fpsStore[i] = 0.0;}Log.d(TAG + ".initTimingElements()", "Timing elements for stats initialised");}}

我介绍了一个简单的测量功能。 我每秒计算一下帧数,并将它们存储在fpsStore []数组中。 storeStats()会在每个滴答中调用,如果未达到1秒间隔( STAT_INTERVAL = 1000; ),则只需将帧数添加到现有计数中。如果击中一秒钟,则它将获取渲染帧的数量并将其添加到FPS数组中。 之后,我只需要重置当前统计周期的计数器,然后将结果添加到全局计数器即可。 平均值是根据最近10秒钟内存储的值计算得出的。第171行每秒记录一次FPS,而第172行则设置要在屏幕上显示的gamePanel实例的avgFps值。

MainGamePanel.java类的render方法包含displayFps调用,该调用仅在每次渲染状态时才将文本绘制到显示器的右上角。 它还具有从线程设置的私有成员。

// the fps to be displayedprivate String avgFps;public void setAvgFps(String avgFps) {this.avgFps = avgFps;}public void render(Canvas canvas) {canvas.drawColor(Color.BLACK);droid.draw(canvas);// display fpsdisplayFps(canvas, avgFps);}private void displayFps(Canvas canvas, String fps) {if (canvas != null && fps != null) {Paint paint = new Paint();paint.setARGB(255, 255, 255, 255);canvas.drawText(fps, this.getWidth() - 50, 20, paint);}}

尝试运行它。 您应该在右上角显示FPS。

显示的FPS

参考:来自“反对谷物”博客的JCG合作伙伴Tamas Jano测量FPS 。

不要忘记查看我们的新Android游戏ArkDroid (以下屏幕截图) 。 您的反馈将大有帮助! 相关文章: Android游戏开发教程简介 Android游戏开发–游戏创意Android游戏开发–创建项目Android游戏开发–基本游戏架构Android游戏开发–基本游戏循环Android游戏开发–使用Android显示图像Android游戏开发–在屏幕上移动图像Android游戏开发–游戏循环Android游戏开发–雪碧动画Android游戏开发–粒子爆炸Android游戏开发–设计游戏实体–策略模式Android游戏开发–使用位图字体Android游戏开发–从Canvas切换到OpenGL ES Android游戏开发–使用OpenGL ES显示图形元素(原语) Android游戏开发– OpenGL纹理映射 Android游戏开发–设计游戏实体–状态模式Android游戏文章系列

翻译自: https://www.javacodegeeks.com/2011/07/android-game-development-measuring-fps.html

fps游戏

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。