【Paint基本使用】

 

一、硬件加速

在CPU绘制和GPU绘制时,在流程上是有区别的:
在基于软件的绘制模型下,CPU主导绘图,视图按照两个步骤绘制:

1.让View层次结构失效
2.绘制View层次结构


在基于硬件加速的绘制模式下,GPU主导绘图,绘制按照三个步骤绘制:

1.让View层次结构失效
2.记录、更新显示列表
3.绘制显示列表


可以看到在GPU加速时,流程中多了一项“记录、更新显示列表”,它表示在第一步View层次结构失效后,并不是直接开始逐层绘制,而是首先把这些View的绘制函数作为绘制指令记录一个显示列表中,然后再读取显示列表中的绘制指令调用OpenGL相关函数完成实际绘制。所以在GPU加速时,实际是使用OpenGL的函数来完成绘制的。
使用GPU加速的优点:硬件加速提高了Android系统显示和刷新的速度;
GPU缺点:
1、 兼容性问题:由于是将绘制函数转换成OpenGL命令来绘制,定然会存在OpenGL并不能完全支持原始绘制函数的问题,所以这就会造成在打开GPU加速时,效果会失效的问题。
2、内存消耗问题:由于需要OpenGL的指令,所以需要把系统中的OpenGL相关的包加载到内存中来,所以单纯OpenGL API调用就会占用8MB,而实际上会占用更多内存;
3、电量消耗问题:多使用了一个部件,当然会更耗电……
下图显示了一些特殊函数硬件加速开始支持的平台等级:(红叉表示任何平台都不支持,不在列表中的默认在API 11就开始支持)

 二、禁用GPU硬件加速方法
那么问题就来了,如果你的APP跑在API 14版本以后,而你洽好要用那些不支持硬件加速的函数要怎么办?
那就只好禁用硬件加速喽,针对不同类型的东东,Android给我们提供了不同的禁用方法:
硬件加速分全局(Application)、Activity、Window、View 四个层级


1.在AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启/关闭硬件加速:

<application android:hardwareAccelerated="true" ...> 


2.在Activity 标签下使用 hardwareAccelerated 属性开启或关闭硬件加速:

<activity android:hardwareAccelerated="false" />  


3. 在Window 层级使用如下代码开启硬件加速:(Window层级不支持关闭硬件加速)

getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);


4.View 级别如下关闭硬件加速:(view 层级上不支持开启硬件加速)

setLayerType(View.LAYER_TYPE_SOFTWARE, null);  


或者使用android:layerType=”software”来关闭硬件加速:比如

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingLeft="2dp"
    android:layerType="software"
    android:paddingRight="2dp" >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Paint in 3D 绘制所有物体 - 在游戏内和编辑器里。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! ? 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每个功能。然后你还可以看看如何将多个功能结合在一起的演示场景,创建一些更有趣的东西。 ? 长期支持 - Paint in 3D 经过超过 5 年的定期更新,现在已经具有大量功能。感谢迄今为止一直支持其开发的每一个人! ? 所有渲染管线 - 此资源支持标准管线,以及 LWRP、HDRP 和 URP。请参阅文档了解如何在它们之间切换。 ? 随地可用 - Painy in 3D 一开始就被设计来用于尽多的设备和平台。它在台式、移动端、VR 上等更多都运行得很好!假如遇上任何性能问题,你可以调整许多设置来提升性能,而且其视觉效果影响极小。 ? 包含了完整源代码 - 如果你是程序员,随时可以根据爱好代码进行调整,它可轻松地被修改。 ? 光速绘制 - 通过使用GPU 加速,你的物体将以难以置信的速度被绘制。代码还经过深度优化来防止 GC 分配,和将所有绘制操作一起批次完成。 ? 在游戏内和编辑器中绘制 - Paint in 3D 是被设计来既可以用于游戏内,也可用于编辑器中,以便你想创建自己的纹理。如果你是程序员的话,你还可以直接从 C# 中使用它。 ? 稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 ?自动保存和加载 - Paint in 3D 带有一个简易使用的系统,可自动恢复你的绘制进度。如果你需要更高级的控制的话,你可以使用简单的 C# API 来手动控制。 ?蒙皮网格绘制 – Paint in 3D 让你能够以高性能绘制动态物体。查看 WebGL 演示,了解到僵尸绘制是多好看和绘制是如何一瞬间完成。 ?画笔修改器 - 为你的画笔添加修改器,让它们变得活跃起来。它们可随机改变位置、旋转、不透明度、纹理,以及更多! ? 无缝UV 绘制 - 正在用复杂的 UV 来绘制复杂的网格?没问题,Paint in 3D 能流畅无缝地在 UV 缝合上进行绘制,即使它们在不同的物体上,或甚至它们的缩放度不同! ? 撤消和重做系统 - Paint in 3D 中包括了完整的撤销 + 重做支持来为游戏内和编辑器内的绘制。在游戏内,绘制可以设置为使用全纹理快照来达到快速切换,也可以绘制动作重放来降低内存使用。撤消和重做能分别在全局、或在个别物体上进行,还可以用 UI 按钮或 C# AAPI 触发。 ? 绘制遮罩 - 使用任何自定义纹理形状来轻松地将 3D 绘制遮罩添加到场景中。这将会自动防止所有新增的绘制在指定区域中出现,为你带来了油印效果。 ? 智能镜像系统 - Paint in 3D 自带强大的镜像功能,让你同时绘制物体的两面。如果你用文字来绘制贴图的话 ,它们通常会倒后出现,Paint in 3D 能更正它! ? 绘制任何着色器 - Paint in 3D 让你绘制各种着色器和材质,包括你的自定义。只需直接选择你想绘制的纹理和你想使用的混合模式,然后你就能开始了! ? 多纹理绘制 - PBR 材料往往需要你同时绘制反照率 + 金属性 + AO 地图。这在 Paint in 3D 里很容易设置,甚至还可以将其自定义为任何其他类型的复杂材质。 ? 颜色计数 – Paint in 3D 自带简易使用的系统来计算某个指定的颜色占了多少像素。这在团队合作绘制游戏时非常合适,能让你看到谁绘制的最多。 ?LOD 绘制 - 假如你需要绘制高多边形网格的话,你可以通过应用低多边形网格绘制来加速过程,并且仍然使用高多边形网格来可视化绘制! ? VR支持 - 所有功能都在VR中都很好用,而且 Paint in 3D 还附带了几个专为利用这些来设计的演示场景。如果你没有 VR 头盔的话, 不用担心,这些演示场景也可以与鼠标一起使用! ? 贴图绘制 - 使用此绘制工具来用你喜欢的纹理在物体表面上绘制。你能全面调控颜色、角度,甚至还有背面绘制和角度限制等这些高级设置。非常适合于汽车贴图、血溅 ,和更多! ? 实时绘制 - 应用了之后还需要移动贴图和其他绘制吗?实时绘制功能让你可以轻松地将绘制附加到任何变换中,给予你全面控制。 ? 动态绘制 - 轻松地绘制动态贴图,就跟文字一样。此绘制模式兼容你在 UI 或相机中绘制的东西,包括复杂的纹理、角色、3D 物体等。 ? 粒子碰撞绘制 - 使用此功能来用粒子绘制物体。这能让你做出逼真的喷漆涂鸦、烟熏等等! ?物理碰撞绘制 - 留下绘制并将你的碰撞影响带到下一个关卡中。这非常适用于添加凹痕、抓痕、 血溅,等等! ? 球形绘制 - 使用此 绘制工具来绘制球体半径中的每个像素。 ? 三边平面绘制 - 使用此绘制工具在复杂几何体上绘制无缝纹理。这能与球形和贴图绘制一起使用。 ? 孔形绘制 - 使用减性混合模式在物体上绘制孔。这能与球形和贴图绘制一起使用。 ? 法线绘制 - 使用法线混合模式绘制法线贴图。这可以让你将凹痕、抓痕 和其他细节添加到物体中。 ? 模糊绘制 - 使用模糊混合模式来将纹理中的像素模糊化。这可以让你将法线贴图平滑化 、抹去尖锐的线条等等! ? 间介绘制 - 使用此混合模式在 2 个 3D 点之间绘制第一个表面。这非常适合激光光束特效,还有更多! ? 贯通绘制 - 使用此混合模式在两个 3D 点之间绘制所有像素。这适合于非常强烈的激光光束特效,来贯穿一切。 ? 渐变绘制 - 使用此工具的任何混合模式,渐变绘制你的纹理中的所有像素。这非常适合随着时间逐渐淡化的特效,例如能量盾、雪中的足迹,以及更多! ? 泼溅贴图绘制 - 此绘制工具可让你用泼溅贴图将瓷片纹理绘制在物体上。
Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的GUI(图形用户界面)和功能组件,其中包括自绘控件。自绘控件是指通过重写绘制函数来实现自定义外观和行为的控件。 在Qt中,自绘控件通常是从QWidget类派生而来的子类。要使用自绘控件,你需要重写QWidget的paintEvent()函数,并在其中进行绘制操作。paintEvent()函数会在控件需要重新绘制时被调用,你可以在该函数中使用Qt提供的绘图工具进行绘制。 以下是使用paintEvent()函数自绘控件的基本步骤: 1. 创建一个继承自QWidget的子类,并重写其paintEvent()函数。 2. 在paintEvent()函数中,创建一个QPainter对象,并使用该对象进行绘制操作。 3. 使用QPainter提供的绘图函数(如drawRect()、drawText()等)来实现你想要的外观效果。 4. 根据需要,可以在其他事件处理函数中添加交互逻辑,例如鼠标点击事件等。 下面是一个简单的示例代码,展示了如何使用paintEvent()函数自绘一个简单的矩形控件: ```cpp #include <QtWidgets> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿 painter.fillRect(rect(), Qt::blue); // 绘制蓝色背景 painter.setPen(Qt::white); // 设置画笔颜色为白色 painter.drawRect(rect().adjusted(10, 10, -10, -10)); // 绘制带边距的矩形 } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.resize(200, 200); widget.show(); return app.exec(); } ``` 这个示例中,我们创建了一个名为MyWidget的自定义控件,重写了其paintEvent()函数,在其中使用QPainter对象绘制了一个带有蓝色背景和白色边框的矩形。在main()函数中,我们创建了一个应用程序对象,并显示了这个自定义控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值