`
熊滔爱孟涛静
  • 浏览: 122010 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

游戏中渲染线程与更新线程交替执行

 
阅读更多

private final State mThreadLocker = new State();
 private UpdateThread updateThread;
 private DrawThread drawThread;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  updateThread = new UpdateThread();
  updateThread.start();
  drawThread = new DrawThread();
  drawThread.start();
 }

 protected void onUpdate() throws InterruptedException {
  final State threadLocker = this.mThreadLocker;
  threadLocker.waitUntilCanUpdate();
  System.out.println("Update");
  threadLocker.notifyCanDraw();

 }

 public void onDrawFrame() throws InterruptedException {
  final State threadLocker = this.mThreadLocker;
  threadLocker.waitUntilCanDraw();
  System.out.println("Draw");
  threadLocker.notifyCanUpdate();

 }

 private class UpdateThread extends Thread {
  private boolean flag; // 线程执行标志位

  public UpdateThread() {
   super("UpdateThread");
   this.flag = true;
  }

  @Override
  public void run() {
   try {
    while (flag) {
     onUpdate();
    }
   } catch (final InterruptedException e) {
    this.interrupt();
    e.printStackTrace();
   }
  }

  /*
   * 停止线程
   */
  public void requestStop() {
   flag = false;
  }
 }

 private class DrawThread extends Thread {
  private boolean flag; // 线程执行标志位

  public DrawThread() {
   super("DrawThread");
   this.flag = true;
  }

  @Override
  public void run() {
   try {
    while (flag) {
     onDrawFrame();
    }
   } catch (final InterruptedException e) {
    this.interrupt();
    e.printStackTrace();
   }
  }

  /*
   * 停止线程
   */
  public void requestStop() {
   flag = false;

  }
 }

 private static class State {
  boolean mDrawing = false;

  public synchronized void notifyCanDraw() {
   this.mDrawing = true;
   this.notifyAll();
  }

  public synchronized void notifyCanUpdate() {
   this.mDrawing = false;
   this.notifyAll();
  }

  public synchronized void waitUntilCanDraw() throws InterruptedException {
   while (this.mDrawing == false) {
    this.wait();
   }
  }

  public synchronized void waitUntilCanUpdate()
    throws InterruptedException {
   while (this.mDrawing == true) {
    this.wait();
   }
  }
 }

 @Override
 protected void onStart() {
  super.onStart();
 }

 @Override
 protected void onResume() {
  super.onResume();
 }

 @Override
 protected void onPause() {
  super.onPause();
 }

 @Override
 protected void onStop() {
  super.onStop();
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  updateThread.requestStop();
  drawThread.requestStop();
 }

 @Override
 public String toString() {
  return "MultiThreadAndSync";
 }

分享到:
评论

相关推荐

    OGRE3D渲染系统线程化[收集].pdf

    OGRE3D渲染系统线程化[收集].pdf

    HGE多线程渲染方案

    使用循环队列最小锁实现底层多线程渲染。原始HGE接口未进行任何修改,理论上只需替换DLL即可实现多线程渲染,并且大幅度提高性能。 使用循环队列原来本来无需加锁,但由于我们的项目资源加载又开启了另一条线程,...

    一个简单的OpenGL多线程渲染模型

    用多线程实现OpenGL渲染, 子线程负责渲染, 主线程负责干其他事情.

    OGRE渲染系统线程化 中文版.rar

    渲染系统线程化.pdf为英文版 OGRE渲染系统线程化.mht为中文版

    Unity接入海量RTSP直播流,多线程渲染demo

    Unity接入海量RTSP直播流,多线程渲染demo Unity接入海量RTSP直播流,多线程渲染demo Unity接入海量RTSP直播流,多线程渲染demo Unity接入海量RTSP直播流,多线程渲染demo Unity接入海量RTSP直播流,多线程渲染demo ...

    Unity 多线程实时更新纹理数据(Android平台)

    当前我们在​Unity中搞了一个Naitve Plugin插件,开一个线程,主要处理纹理更新的线程,这样就不会影响主线程的帧率。 适合人群:研究多线程渲染的人群 语言:Unity以及C++语言 在压缩包中主要为2个压缩包,一个为...

    Flutter渲染机制—UI线程

    为了揭秘Flutter高性能,本文从源码角度来看看Flutter的渲染绘制机制,跟渲染直接相关的两个线程是UI线程和GPU线程:UI线程:运行着UITaskRunner,是FlutterEngine用于执行Dartrootisolate代码,将其转换为layertree...

    QT+OPENGL 多线程测试

    本人原创,浅显易懂,QT+OPENGL多线程,采用2D纹理贴图的方式,多线程进行纹理拷贝和渲染。

    QT-线程阻塞问题-开启多线程(帮助你快速解决因大量计算耗时而导致主线程渲染阻塞的问题、简单实现多线程教学)

    这些操作都是很消耗时间的,如果在此时需要进行一些UI的渲染的话,这些耗时操作就会阻塞渲染线程,导致无法达到想要的效果。 可以通过开启子线程,将复杂计算内容交给子线程来处理,主线程主要进行UI的渲染操作,...

    OpenSceneGraph三维渲染引擎设计与实践

    2.2.1 osg源代码的获取与更新 16 .2.2.2 编译环境生成工具cmake 19 2.2.3 基本编译选项 22 2.2.4 高级编译选项 25 2.3 调试输入与输出 28 2.3.1 命令行输入 28 2.3.2 调试输出 29 第3章 开发预备知识 31 ...

    多线程GDI程序

    这是微软的VC6 安装盘中的一个例子,这个例子说明如何在多线程中使用 GDI 绘制。程序可以开 1,10, 25个线程来绘制 圆,矩形,和直线。

    3dsmax photoshop 影视游戏贴图渲染技术全解析

    3dsmax photoshop 影视游戏贴图渲染技术全解析 ... 《3ds Max/Photoshop影视游戏贴图渲染技术全解析》配套的DVD光盘内含书中案例的源文件、素材文件、参考图片 共计 90MB 左右 不含视频文件(太大)

    论文研究-3D游戏引擎渲染内核架构及其技术.pdf

    一款游戏图形引擎的优劣...在研究分析和实践的基础上,提出了一个由三维模型子系统、场景管理子系统和特效子系统构成的3D游戏引擎渲染内核架构,介绍了每个子系统与相应模块的作用,以及几个重要模块常用的实现技术。

    3D游戏渲染引擎的设计与实现

    论文探讨了游戏引擎中的渲染部分,建立了一款基于的游戏渲染引擎模型,并利用该渲染引擎实现了对地形、模型以及特效的渲染。

    AE多线程渲染-黑鱼工具箱-.rar

    支持多线程,批量多处理,大规模集成,文件类型转换等功能,如果你想要加快自己的渲染速度,可以试试通过这款脚本来加速。CG综合资源 最新CG综合资源随用随下 云插件 AE、PR插件的一键安装、卸载、汉化、自动更新、...

    unity 多线程

    在unity开发中,解决了在分线程没有办法调用mono的api的问题

    MFC 利用线程实现3D场景渲染 (限时下载 只要2分网站显示有误)

    只要继承我的封装的类 你就可以任意操作自己的线程 而且扩展了几个接口大家想用的时候可以自己用, 并且把我以前整理的3D项目添加到其中 以前的Render函数是写在OnPaint里 现在好了 开线程渲染了 并且封装了 临界区 ...

    利用英特尔 线程构建模块

    SimXpert 能够提供交互式图形界面,有助于工程师执行端到端模拟工作,包括本机计算机辅助设计 (CAD) 导入 (import)、预处理、模型设置、求解、后期处理和报告。英特尔和 MSC.Software 合作线程化了 SimXpert,大幅...

    Lemon:适用于C ++的OpenGL和Vulkan的多线程渲染引擎框架

    当游戏或应用程序是多线程的,并且该应用程序尝试渲染对象或从辅助线程播放声音时,就会出现此问题。 与OpenGL相比,Vulkan的主要优势在于它可以通过命令缓冲区进行并行化。 该框架提供了一种有助于解决OpenGL的...

    使用ffmpeg实现单线程异步的视频播放器

    ffplay是一个不错的播放器,是基于多线程实现的,播放视频时一般至少有4个线程:读包线程、视频解码线程、音频解码线程、视频渲染线程。如果需要多路播放时,线程不可避免的有点多,比如需要播放8路视频时则需要32个...

Global site tag (gtag.js) - Google Analytics