【问题标题】:android surfaceview onDraw vs thread.onDrawandroid surfaceview onDraw vs thread.onDraw
【发布时间】:2011-09-09 09:00:24
【问题描述】:

安卓游戏用什么比较好:

  • 带有渲染线程的SurfaceView

  • 带有调用SurfaceView函数doDraw()的线程的SurfaceView

谢谢。

【问题讨论】:

    标签: android surfaceview ondraw


    【解决方案1】:

    SurfaceView 中的绘图已在单独的线程中处理。你不需要产生一个新的。

    请参阅API doc 了解它:

    这个类的一个目的是提供一个表面,辅助线程可以在其中渲染到屏幕中。如果你打算这样使用它,你需要了解一些线程语义:

    • 所有 SurfaceView 和 SurfaceHolder.Callback 方法都将从运行 SurfaceView 窗口的线程(通常是应用程序的主线程)中调用。因此,它们需要与绘图线程也触及的任何状态正确同步。
    • 您必须确保绘图线程仅在其有效时接触底层 Surface —— 在 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed() 之间。

    【讨论】:

    • 如果您查看 LunarLander 示例,SurfaceView 有一个线程(称为 LunarThread),该线程有一个称为 doDraw() 的函数,用于绘制到画布上。我的问题是将 doDraw 函数(从线程)移动到 SurfaceView 类并从线程调用函数是否有任何区别,例如:MySurfaceView.doDraw();
    • @jerenj doDraw() 函数只是为了保持绘图实现分离并提高可读性,因为它不会在其中创建任何新线程。关于创建MySurfaceView.doDraw() 方法,我认为让它与SurfaceHolder 保持同步会很麻烦。为什么要重新发明轮子?
    • 唯一困扰我的是(在月球示例中)如果您每次按下 home 时都将月球 X 位置存储在 LunarThread 中,您的线程将被终止并且 X 位置丢失。所以我想如果我将draw方法移动到surfaceview类并从LunarThread调用它,问题就解决了(因为lunarview存储了当前的X位置)。或者仅将月球变量移动到月球视图。
    • 文档说“可以”,而不是“可以”——我不认为绘图已经在单独的线程中处理。
    • 您对文档的解释可能不正确,正如它所说:它允许辅助线程进行渲染/绘图。并警告说,如果你这样做,你必须注意与主线程的同步。
    猜你喜欢
    • 2011-09-19
    • 2011-08-04
    • 2013-03-11
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多