j2me:“g.clipRect()”对速度有啥影响?

Posted

技术标签:

【中文标题】j2me:“g.clipRect()”对速度有啥影响?【英文标题】:j2me: what is effect of 'g.clipRect()' on speed?j2me:“g.clipRect()”对速度有什么影响? 【发布时间】:2012-07-17 09:53:27 【问题描述】:

我正在 j2me 中开发并使用画布绘制一些图像。

现在,我的问题是:下面的示例代码在绘图速度上有什么区别?

裁剪区域矩形后绘制:

g.clipRect(x, y, myImage.getWidth(), myImage.getHeight());

g.drawImage(myImage, x , y, Graphics.TOP | Graphics.LEFT);

g.setClip(0, 0, screenWidth, screenHeight);

没有剪辑的绘图:

g.drawImage(myImage, x, y, Graphics.TOP | Graphics.LEFT);

第一个更快吗?我经常在屏幕上画画。

【问题讨论】:

考虑到在这个例子中你的 draw 是一个 drawImage 调用,实际上是一个 blit,这可能使差异接近于零,除非图像宽度和屏幕尺寸非常大不同。 【参考方案1】:

恐怕您的问题的直接答案是Mu - 因为您似乎从错误的方向解决问题。

问题是,裁剪 API 不适合考虑性能/优化。您可以在 API 文档 (available online) 中找到其用途的完整介绍,它没有说明与性能影响相关的任何内容:

剪辑

剪辑是图形对象目标中的一组像素,可以通过图形渲染操作进行修改。

每个Graphics 对象有一个剪辑。由图形操作修改的唯一像素是位于剪辑内的像素。剪辑之外的像素不会被任何图形操作修改。

提供了将当前剪辑与给定矩形相交以及完全设置当前剪辑的操作...

尝试使用裁剪 API 来考虑虚构的性能,这将使您的代码成为未来维护者难以理解的噩梦。请注意,这个未来的维护者可能是你自己,就在几周/几个月/几年之后 - 我曾经对自己的代码感到震惊就像弄乱别人写的糟糕代码一样。


不要误会我的意思 - 在特定设备上的某些特定情况下,剪辑可能会对性能产生重大影响 - 为什么不呢,鉴于 MIDP 实现的多样性,一切皆有可能。知道什么?它甚至有可能对其他设备产生相反的影响,为什么不呢。

如果 (if) 发生这种情况,如果 (if) 您将以某种方式获得明确、可靠、经过测试和证明的特定性能影响的理由 - 那么 (then),继续,实​​施任何必要的技巧来达到所需的性能,无论它们多么不正当(BTDTGTTS)。不过,在那之前,请放弃您可能想到的任何毫无根据的假设。

在那之前……只是。降低。它。

开发人员喜欢优化代码是有充分理由的。它是如此令人满意和有趣。但知道何时优化更为重要。不幸的是,开发人员通常对应用程序中的性能问题实际上会出现在哪里有可怕的直觉......大多数性能调整让我想起了一个老笑话,关于那个在厨房里找钥匙的人,尽管他在街上把它们弄丢了,因为厨房里的光线更好……(Brian Goetz)

【讨论】:

【参考方案2】:

这几乎肯定会因平台而异,并且取决于您实际绘制的数量。

我建议您通过记录每秒绘制次数或绘制方法的平均持续时间并在屏幕上绘制来衡量性能。

【讨论】:

【参考方案3】:

没有剪辑的绘图在任何平台上都应该更快,原因很简单,因为您没有调用两个剪辑方法。但我可能会问,你为什么要使用剪辑开始?

当您在同一文件中有动画精灵或图标变体时,您通常会使用剪辑。在这种情况下,您可以为每个框架/图标创建一个文件。它会增加您的 jar 文件大小并使用更多堆空间来在内存中保存这些图像,但绘制速度会更快。

【讨论】:

以上是关于j2me:“g.clipRect()”对速度有啥影响?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 有啥方法可以加快插入 TVF 中的表变量的速度?

有啥PWM输入0-10V输出的电路?RC滤波的方案速度跟不上。

INTEL和AMD的CPU都有很多指令集,这个有啥用?对电脑的运行速度有影响吗?

Cython 对进口有啥作用?

再读J2ME游戏编程

oracle为啥创建实例,为何通过实例来访问数据,这样有啥优点吗