- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直难以理解 System.Drawing
命名空间中的哪些确切对象实际上对系统总 GDI 对象计数有贡献。例如,Matrix
对象算不算? 图形路径
? 笔
?
为了对此进行测试,我在 Form
初始化时运行了以下代码。
public partial class Form1 : Form
{
Timer timer = new Timer();
List<Pen> pens = new List<Pen>();
public Form1()
{
InitializeComponent();
var r = new Random();
for (int i = 0; i < 1000; i++)
{
var p = new Pen(
Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)),
(float)r.NextDouble() * 10);
pens.Add(p);
}
timer.Interval = 30;
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
panel1.Invalidate();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
for (int i = 0; i < pens.Count; i++)
{
e.Graphics.DrawLine(pens[i], (int)(20 + i * 0.1), 20, (int)(50 + i * 0.1), 50);
}
}
}
我惊讶地发现我的应用程序 GDI 对象计数是 32(使用任务管理器 > 详细信息 > GDI 对象列测量)。即使我保留列表并强制 Paint
事件使用生成的每支笔绘制单独的线条,情况也是如此。我什至尝试创建随机颜色以确保没有任何东西被重复使用,并且 GDI 计数仍然稳定在 32。
有很多帖子担心缓存和重用 Pen
实例和其他对象,但我不清楚是否所有 System.Drawing
对象都对此有贡献数数。
也许现代 GDI+ 实现实际上是惰性的,并且仅在您实际绘制某些东西时才延迟分配?
更新: GSerg指出MSDN official documentation说
When you use GDI+, you don't have to be as concerned with handles and device contexts as you do when you use GDI.
GDI+ 似乎对 GDI 句柄进行了抽象,并尽可能避免使用它们。这也与报告一致 elsewhere这似乎表明 GDI+ 仅在绝对必要时才实际创建 GDI 句柄。例如,如果您调用需要存在句柄的方法,则 Bitmap
仅由句柄支持,例如GetHBitmap()
.
看来,至少在现代 GDI+ 中,Pen
、Brush
和许多其他 System.Drawing
对象实际上并没有对GDI 对象总数。当然,在 C# 中,如果未释放它们,它们仍然会泄漏非托管内存,因为它们由非托管 GDI+ 对象支持,但 native 内存不像 GDI 内存那样苛刻。
如果当前的解释没有争议,我将在接下来的几天内将其移至答案。
最佳答案
以下对象导致创建 GDI 句柄:
此列表是使用此处的信息制定的: https://learn.microsoft.com/en-gb/windows/desktop/SysInfo/gdi-objects
关于c# - 哪些 System.Drawing 类算作 GDI 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49940530/
关于 我的数据库中有这个表,其中包含一些用用户 ID 和时间保存的信息。 | CONTENT | USER ID | TIME | | text | 1 | 140508
我正在准备我的一个网站的应用程序版本。 该应用程序需要您登录才能访问您的用户帐户。此登录过程是通过 HTTP 而不是 HTTPS 完成的,但密码是使用 MD5 和我的服务器上的其他一些哈希值存储的。
是否可以从 google+ 获取特定 URL 的公共(public) +1 计数作为 json 或 xml? (类似于 +1 按钮的功能) 最佳答案 不,没有用于为 URL 获取 +1 的 API。目
我想创建一个简短的 HTML 段落,其中包括指向我们域(域 A)的反向链接,并算作一个 do follow 反向链接。我将使用 IFrame 在其他域上显示它,这样当我更新段落时它会在多个域上更新。但
我正在编写一个 Java 程序来计算在《我的歌唱怪物》中将怪物提升到一定级别需要多少食物。当我运行该程序时,它说“无法从 double 转换为 int”。有人可以解释这是为什么吗?这是程序。 int
在我的 Flutter 应用中,如果我有两个嵌套的 StreamBuilder 从同一个文档读取,它会算作从 Firestore 读取两次吗?还是以一种只计为一次读取的方式进行缓存? 这是我正在谈论的
我读到一个变量永远不应该做超过一件事。重载一个变量来做不止一件事是不好的。 因此,我最终编写了如下代码:(使用 customerFound 变量) bool customerFound = false
我有点困惑,对于 Firestore 定价,像下面这样的查询算作一次读取还是 25 次读取? queryRef.limit(25).get().then(()=>{ ... }); 据我了解,在 pr
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!