在OpenGL中实现动画

时间:2012-02-27 11:45:34

标签: multithreading animation

我很难想出一种实现类似动画的动画的方法,比如移动到currentX + 3,你只放入deltaX,其余的进行插值。我现在得到的是什么:

drawing / opengl thread,它跟踪绘图时间并处理帧速率:

public void onDrawFrame(GL10 gl) {

    endingTime = System.currentTimeMillis();
    int timeElapsed = (int) (endingTime - startingTime);

    if (timeElapsed < FRAMEDURATION_MILISEC) {
        try {
            Thread.sleep(FRAMEDURATION_MILISEC - timeElapsed);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    startingTime = System.currentTimeMillis();
    Game.renderGame(gl);
}

一个逻辑线程,通过改变GameObjects的x和y值来激活:

static long RATE = 30l; // times
static long duration = 1000l / RATE;

public void run() {
    lastUpdate = System.currentTimeMillis();

    long dur = duration; // copy

    while (Game.running) {

        long tElapsed = System.currentTimeMillis() - lastUpdate;

        if (tElapsed >= dur) {
            lastUpdate = System.currentTimeMillis();
            Game.updateGame(tElapsed);
        } else {
            try {
                GameLogicThread.sleep(dur - tElapsed);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

我想实现一个Animation类,我可以在其中为GameObject设置x的差异,并将此Animation对象应用于GameObject,以便在绘图或逻辑循环中更新位置。

我不知道应该在哪里做这件事,或者如何保持一个干净的结构。有谁可以帮助我?


编辑:

谢谢,我现在制作了一个GLAnimation类,您可以通过它传递dX,dY,dRotation,dScale等。然后计算速度,对象必须在每毫秒更改一次。这个Animation对象通过应用TO来调用GameObject,因此更新和渲染调用可以通过timeElapsed来移动对象。谢谢zmccord!

1 个答案:

答案 0 :(得分:2)

所以,基本上你现在谈论的情况是你有一个物理线程(“逻辑线程”)和一个图形线程。我想你要问自己的第一个问题是,是否值得将它们分成不同的线程;您的逻辑/物理实际上是否计算密集到足以对您的帧速率产生负面影响?对于一个简单的游戏,您将节省错误和努力,将它们保持在一个循环中。对于每种功能类别,代码绝对应该用不同的文件来分解,但它们都可以在同一个线程上运行(步骤逻辑一次,绘制,重复)。

采用单线程方法的一个原因是现在看起来就像你的物理学以尽可能高的速度运行,这实际上并不是一个好主意;你会为小的精确度增加燃烧大量的力量 - 可能精度会降低,这取决于游戏代码的样子。除非您的物理特性非常复杂并且需要高精度,否则您的物理帧速率远远高于图形帧速率并不是很重要。

我喜欢你的动画对象的想法;你如何做到这将取决于GameObjects可以包含什么或者你的Animation对象可能想要改变什么。我建议编写你的GameObject以符合Animation对象可以用来改变它的协议;如果您使用的是C ++,最简单的方法就是让所有GameObjects继承自根GameObject类。然后,您的Animation对象可以包含有关如何修改GameObject的信息。

如果我们使用C ++,我会建议:

root GameObject类方法:

  • 设置/获取位置
  • 设定/获取方向
  • 设置/获取其他任何状态游戏对象;尺寸?颜色?速度ω

root动画类是一个虚拟的,具有一个(虚拟)方法:

  • 将动画应用于对象

然后将Animation根类子类化为单独的动画,例如 AnimationTranslate可以为对象的位置和角度添加偏移量,或者AnimationScale可以更改大小,或者AnimationGravity可以将对象加速到屏幕底部。

类似的设计可以在任何面向对象的语言中完成。你也可以用直线C把它拉下来,稍微做一些腿部工作;如果你这样做了,你可能想要将函数指针成员放入你的结构中。如果您使用的是具有和类型的语言,则可以使用和类型而不是动画的继承层次结构;同样的想法适用。