`
熊滔爱孟涛静
  • 浏览: 124688 次
  • 性别: 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";
 }

分享到:
评论

相关推荐

    用多线程加速三维模型动画性能的方法

    本文《用多线程加速三维模型动画性能的方法》提出了一种针对游戏中的模型动画进行多线程加速的高效解决方案,旨在解决复杂游戏场景中多动画同时渲染造成的性能瓶颈问题。 ### 一、多线程加速原理 在现代游戏设计中...

    多线程计算

    - 游戏开发:游戏逻辑、渲染、AI等可以分别在不同线程中运行,提高游戏流畅性。 7. 性能优化策略 - 线程池:预先创建一定数量的线程,重复利用,减少频繁创建和销毁线程的开销。 - 任务分解:将大任务分解为小...

    WPF下,高性能绘图,写WriteableBitmap,多线程,双缓存

    在WPF(Windows Presentation Foundation)框架中,高性能绘图是一个重要的技术挑战,特别是在处理大量数据可视化或者实时渲染的场景下。本项目通过使用WriteableBitmap和多线程技术,结合双缓存策略,实现了高效的...

    java 多线程制作动画

    这种技术在游戏开发、用户界面动态效果以及其他需要实时更新视觉元素的应用中非常常见。 首先,让我们深入理解Java中的多线程概念。Java提供了两种方式来创建线程:继承Thread类或实现Runnable接口。如果选择继承...

    多线程与多核编程文档

    - **游戏开发**:多线程管理图形渲染、物理模拟等,提升游戏体验。 总结,多线程和多核编程是现代软件开发中的重要技能,能有效利用系统资源,提升程序性能。理解和掌握这些知识对于开发高效、可扩展的应用至关...

    多线程示例

    - 游戏引擎中,独立线程处理游戏逻辑和渲染。 通过学习和实践这些多线程示例,开发者可以更好地理解如何在实际项目中利用多线程提高程序的性能和用户体验。同时,也要注意线程安全和性能优化,以避免潜在的问题。

    多线程实例

    2. **并发**:当系统中有多个线程在执行时,如果这些线程交替地在CPU上运行,就形成了并发执行。 3. **并行**:与并发类似,但并行是指在同一时刻,多个线程在多个处理器上同时执行。 **应用场景**: 1. **用户界面...

    Java游戏编程初步

    线程的并发执行使得程序可以同时处理多个任务,这对于游戏编程至关重要,因为它允许游戏在更新游戏状态、渲染图形以及响应用户输入之间交替进行。 总的来说,Java游戏编程初步会引导初学者理解Applets的开发流程、...

    小程序源码 SurfaceViewTest.zip

    5. **渲染线程**:为了保证流畅的动画效果,通常会在一个独立的渲染线程中处理SurfaceView的绘制,避免与主线程竞争,保证UI的响应速度。 6. **布局与嵌入**:SurfaceView可以在XML布局文件中作为普通的View添加,...

    多彩的霓虹灯

    在单核CPU系统中,操作系统通过时间片轮转的方式让不同线程交替执行,营造出并发执行的假象。而在多核CPU系统中,线程可以真正地并行运行,进一步提高系统性能。在"多彩的霓虹灯"这个应用中,线程可能被用来处理不同...

    软件工程中的并发与并行编程.pptx

    当有新任务提交到线程池时,线程池会从空闲线程中选取一个线程来执行该任务。 **信号量与互斥量** 信号量和互斥量是控制并发访问的重要机制。 - **概念**:信号量用于控制对共享资源的访问数量,而互斥量则用于...

    设计并行化游戏引擎的框架

    通过这样的设计,游戏引擎能够将处理任务分散到多个线程中,避免单一线程成为性能瓶颈。 **并行处理态** 并行处理态是高效多线程引擎的核心概念。理想的并行处理要求各个系统在运行时尽量减少交互,以降低同步损耗...

    Java并发编程实战

    6.1 在线程中执行任务93 6.1.1 串行地执行任务94 6.1.2 显式地为任务创建线程94 6.1.3 无限制创建线程的不足95 6.2 Executor框架96 6.2.1 示例:基于Executor的Web服务器97 6.2.2 执行策略98 6.2.3 线程池98...

    网络游戏-一种虚拟游戏场景的图像的提供方法和系统.zip

    服务器端和客户端如何高效地同步游戏状态,保证玩家在同一场景中的互动,这就需要网络编程和多线程技术的支持。同时,考虑到不同设备的兼容性和性能差异,可能还需要进行优化,确保游戏在不同平台上都能顺畅运行。 ...

    测试资源,抱歉管理员,您可以忽略我的,我测试下载公司是否可以上传资源。

    在IT行业中,"并发"是一个核心概念,尤其在多处理器和多线程系统的设计与优化中至关重要。并发处理使得多个任务或操作可以在同一时间段内同时进行,从而提高系统的整体效率和响应速度。以下是对并发的一些详细说明:...

    双缓存屏幕刷新慢代码

    在IT领域,尤其是在游戏开发、图形用户界面(GUI)设计或者高性能计算中,双缓存技术常被用来优化屏幕刷新速度,提供流畅的用户体验。"双缓存屏幕刷新慢代码"这个问题可能涉及到多个方面,包括缓存管理、渲染效率、...

    【并发编程】如何优雅使用线程池.pdf

    - **线程池**:预先创建一定数量的线程,并将它们存储在一个池中,当有任务到来时,直接分配给线程池中的线程执行,而不需要每次创建新的线程。 - **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,这些...

    C++写的贪吃蛇(含源代码和注释,采用了双缓冲)

    1. **游戏循环(Game Loop)**:游戏的核心是一个不断重复的循环,处理输入、更新游戏状态、渲染新帧。在C++中,通常使用`while`或`for`循环来实现。 2. **类设计(Class Design)**:贪吃蛇由蛇身的各个节点、食物...

    windows上MFC游戏编程

    在实际的游戏编程中,还需要考虑更多的因素,如用户交互、物理模拟、图形渲染、声音处理、网络通信等。MFC提供了一些基本的图形和事件处理功能,但为了创建更复杂的游戏,可能需要结合DirectX或OpenGL等图形库,以及...

Global site tag (gtag.js) - Google Analytics