unity二维动画框架和qt比如何

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity二维动画框架和qt比如何相关的知识,希望对你有一定的参考价值。

参考技术A 关于框架,Unity和Qt都提供了各种可用的动画工具。Unity拥有优秀的内置动画系统,可以轻松创建2D或3D动画。Qt也有自己的动画系统,可以用来创建更复杂的2D动画。

但是,它们之间有很多不同。Unity提供了一系列更丰富的动画工具,而Qt则偏向于更简单的动画系统,以及更灵活的编程接口。此外,Unity的动画系统可以轻松实现3D动画,而Qt则只能实现2D动画。

总之,Unity和Qt都提供了各种可用的2D动画工具,但是由于它们的动画系统各有不同,因此用户可以根据自己的需要选择合适的框架。

没有动画框架的 Qt 动画

【中文标题】没有动画框架的 Qt 动画【英文标题】:Qt animation without Animation Framework 【发布时间】:2013-08-29 11:41:26 【问题描述】:

我需要每秒更新 30...60 次 QPixmap 1024x128(数学函数绘制图片),我不想使用动画框架 - 我认为这对于这个目的来说太过分了。数学函数的工作速度比 1/60 秒快得多,并且需要恒定的时间才能工作,所以这不是问题。

我应该使用每秒 30...60 个滴答声 (TPS) 的 QTimer 并在计时器 SLOT 中调用 update() 吗?但是 QTimer 没有与实际的屏幕更新同步,并且 QTimer 不准确。我的 QTimer 速率可能太低(不流畅)或太高(吃太多 CPU) - 如何找到好的?我的实验表明,我的 linux 和 windows 测试机器需要不同的 QTimer 间隔才能顺利更新:linux:30 TPS,windows:50...60 TPS(如果我设置 1000/30 毫秒,我会看到崎岖的运动)。

或者也许我误解了动画框架,实际上它非常简单且适合这项任务?

【问题讨论】:

Qt 对这样的事情并不好。为了获得平滑的结果,请尝试使用 Qt 5.1、QML 并最好使用着色器程序 (GPU) 计算图像。我认为这是您使用 Qt 获得平滑 60fps 的最佳选择。或者只是满足于你在某个合适的时间间隔使用 QTimer 得到的结果:不是完全流畅,但对于桌面应用程序来说可能还可以...... 【参考方案1】:

远射,但排除动画框架后,您不会给我们留下太多选择。如果您的数学函数可以预先计算所有帧,那么只有一个想法才有效,那就是动态制作动画 gif 或 mng 并使用 QMovie 播放。但从开销来看,我不确定它是否比动画框架更好。

【讨论】:

【参考方案2】:

您不需要动画框架来制作任何动画,但它是一种可能对您有用的选项。

听起来你认为 QTimer 应该与绘制事件同步,但实际上这并不重要。

如果你想象一个对象是从 A 移动到 B。很多人在第一次开始像这样的动画时,没有框架,只会有一个更新函数并做这样的事情:-

QPoint pos(pObject->getPos()); // get the current position
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2;

在这种情况下,对象的更新取决于计算机运行的速度;机器越快,物体移动的越快,与渲染帧速率无关

为了解决这个问题,使物体以相同的速率移动,无论机器的计算能力如何,更新函数需要考虑自上次更新以来的时间并将其考虑在内:-

QPoint updateSpeed(30,0); // speed at which the object will move
int deltaTime = m_timer.elapsed(); // how long since we last updated

QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y());
pObject->setPos(newPos); 

所以,既然对象的动画依赖于时间,无论渲染器绘制对象的速度如何,它都会始终以相同的速度运行。在较慢的机器上,更新之间经过的时间较长,因此与较快的机器相比,对象在更新之间移动的距离更远。以不同速度运行的两台机器将在相同的时间内保持对象的移动距离相同。

回到你的问题,你说你是从数学函数计算图像,只要图像根据时间更新,就像上面例子中的动画对象动画一样,那么你只需要一个定时器以每秒 30 或 60 帧的速度调用 QPixmap 上的 update() 函数,无需将其与图像数据计算的更新联系起来。

最后,如果这没有回答您的问题,据我了解,请发布一个如何生成 QPixmap 数据的示例。

【讨论】:

在较慢的机器上,更新之间经过的时间较长,因此与较快的机器相比,更新之间的对象距离更新得更远这不会导致在极端情况下会产生波动的运动效果? @Greenflow,你是对的,如果机器跟不上,你会看到物体跳跃。这与您在玩网络视频游戏时遇到的延迟相同,但它是动画制作的方式,基于时间而不是固定数量。所有移动的物体都会根据时间移动一段距离,这不应该因为我们观察移动物体的方式而改变。如果我看着你以恒定的速度奔跑并闭上眼睛一秒钟,那么当我再次睁开眼睛时,你就不会在我看到你的最后一个地方。 @Merlin069 与我的问题不太相关。因为 QTimer 接口以毫秒为单位工作,并且封装了与机器速度相关的代码,所以我不必考虑你解释的快慢问题。我更新了我的问题并创建了新主题:***.com/questions/18528300/… 好的,感谢您的澄清。我再看看另一个问题。

以上是关于unity二维动画框架和qt比如何的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中声明和使用二维整数数组(GUI)?

QT 二维图形 原理发展及应用

[Unity3D]自制UnityForAndroid二维码扫描插件

如何在原生 C/C++ 中使用 Qt 绘制二维码

如何在 QT 中制作二维数组?

Unity怎么制作中心带logo的二维码