不安全的 C# 和 2D 渲染指针,是好是坏?

2023-12-26

我正在编写一个 C# 控件,它包装 DirectX 9 并提供一个简化的接口来执行 2D 像素级绘图。 .NET 要求我将此代码包装在不安全代码块中,并使用允许不安全代码选项进行编译。

我锁定整个表面,然后返回指向锁定的内存区域的指针。然后我可以使用“简单”指针算术直接写入像素数据。我对此进行了性能测试,发现比我所知道的其他“安全”方法有显着的速度改进。

这是在 C# .NET 应用程序中操作单个像素的最快方法吗?有没有更好、更安全的方法?如果有一种同样快速且不需要指针操作的方法,我会更倾向于使用它。

(我知道现在是 2008 年,我们都应该使用 DirectX 3D,OpenGL http://en.wikipedia.org/wiki/OpenGL等,但是此控件专门用于 2D 像素渲染,并且不需要 3D 渲染。)


使用不安全指针是在 C# 中进行直接内存操作的最快方法(绝对比使用 Marshal 包装函数更快)。

只是出于好奇,您想要执行哪种 2D 绘图操作?

我之所以这么问,是因为锁定 DirectX 表面来进行像素级操作将会破坏您希望通过使用 DirectX 获得的大部分硬件加速优势。此外,当通过终端服务(远程桌面)使用时,DirectX 设备将无法初始化,因此该控件在这种情况下将无法使用(这对您来说可能并不重要)。

当绘制大三角形和转换图像(纹理映射到四边形)时,DirectX 将是一个巨大的胜利,但它在单像素操作方面的表现并不那么出色。

在 .NET 领域,一种替代方法是保留 Bitmap 对象作为表面,使用 LockBits 并通过返回的 BitmapData 对象中的不安全指针直接访问像素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不安全的 C# 和 2D 渲染指针,是好是坏? 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 涉及指针时如何 P/Invoke

    在尝试学习在 C 中使用 PInvoke 时 我有点不确定如何处理涉及简单值类型的指针的各种情况 我从非托管 DLL 导入以下两个函数 public int USB4 Initialize short device public int U
  • 如何用键对 pandas DataFrame 进行排序?

    我正在寻找一种对 pandas DataFrame 进行排序的方法 pd DataFrame sort values不接受关键功能 我可以将其转换为列表并将密钥应用于sorted功能 但是速度会很慢 另一种方式似乎与分类索引有关 我没有固定
  • git hook 来更新对工作目录和裸 git 目录的更改[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道如何克隆更改并将更改推送 写入 到生产服务器上的裸存储库 但是这些更改如何反映在生产工作目录中呢 我已经使用其他 SCLM 多年
  • Django - 以 __init__ 形式更改 min_length?

    有什么方法可以更改表单构造函数内字段的 min length 参数吗 那是行不通的 def init self args kwargs super CreateTeamForm self init args kwargs self fiel
  • C++17 std::visit 示例中令人困惑的模板

    当看着std visit cppreference 中的页面 https en cppreference com w cpp utility variant visit https en cppreference com w cpp uti
  • 如何使用curl 发布包含需要转义字符的json 字符串?

    我有一个 shell 脚本 我一直用它来将内容发布到 hipchat 频道 它工作正常 直到我尝试发送包含需要转义的字符的消息 我像这样运行命令 注意其中额外的反斜杠会导致问题 usr local bin hipchatmsg sh my
  • 如何删除旧的和未使用的 Docker 镜像

    当Docker长时间运行时 系统中会存在大量的镜像 如何一次性安全删除所有未使用的 Docker 镜像以释放存储空间 此外 我还想删除几个月前提取的图像 这些图像具有正确的TAG 因此 我不仅仅要求删除未标记的图像 我正在寻找一种方法来删除
  • 通过 .whereArrayContains() 查询时出现意外行为

    我有一个 RecyclerView 它利用 FireaseUI 并通过 时间戳 字段 按顺序 对 轮询 节点中的所有对象进行排序 新片段 onViewCreated Query queryStore FirebaseFirestore ge
  • 从代码隐藏提交表单

    我在 c asp net 应用程序上实现功能时遇到问题 我有一个带有 RadioButtonList 和提交按钮的表单 RadioButtonList 生成于Page Load 从我从数据库检索的对象列表中 如果列表中只有 1 个对象 我想
  • SQL 和 where 子句中的 NULL 值

    所以我有一个简单的查询 返回产品列表 SELECT Model CategoryID FROM Products WHERE Model 010 00749 01 这返回 010 00749 01 00000000 0000 0000 00
  • 如何在 Haskell 中实现二进制数

    我看到了以下教堂数字的数据构造函数 data Nat Zero Succ Nat deriving Show 但这是一元数 我们如何以这种方式在 Haskell 中实现二进制数的数据构造函数 我已经尝试过这个 data Bin Zero O
  • React-Native WebView 嵌入 YouTube 视频在 Android 中没有全屏选项

    我正在尝试将 YouTube 视频嵌入到我的 React Native 应用程序中 它工作正常 但我无法获得这些视频的全屏按钮 功能 这是我的代码
  • 您已经拥有当前的 iOS 开发证书或待处理的证书请求

    我安装了新的 OSX High Siera 问题 所有已安装的证书均已删除 所以我使用本地计算机签名证书创建了新的分发证书 并将其下载并安装到计算机中 当我运行项目或它给出错误 我尝试了 stackOverflow 中找到的所有步骤 但无法
  • C# 中的 JOptionPane 等效项?

    在 Java 中 标准 Swing 库中有一个有用的类 称为 JOptionPane 它提供了一堆预制但可自定义的窗口 用于显示消息和获取 简单 用户输入 我知道有 MessageBox Show 可以在 C 中向用户显示 是 否 取消 类
  • 如何在项目范围内使用 Kotlin ExperimentalUnsignedTypes (AndroidStudio)

    我正在尝试使用 ExperimentalUnsignedTypes在我的 Android Studio 项目中 看来我必须把它放在任何地方 所以我宁愿在项目范围内设置它 文档 https kotlinlang org api latest
  • 如何在 git 中执行“hg mv --after”?

    我在 git 之外重命名了一些文件并对其进行了大量修改 当我跑步时git diff index M name status HEAD我只看到 4 个文件被重命名 移动 而实际上应该更多 我知道我可以使用 Mercurial 记录事后移动hg
  • 如何自动安装 Xcode?

    我正在尝试编写一个 shell 脚本 将我们所有的开发工具和依赖项安装到干净的 OSX 机器上 有谁知道自动化安装 Xcode 的最佳方法吗 我这样做是为了 记录开发环境 加快新开发人员的入职流程 遵循一切自动化原则 全自动 Xcode 安
  • 在 tkinter 打开文件弹出窗口中指定“此电脑”作为初始目录

    我正在编写一个 python 脚本 该脚本使用 tkinter 使用代码打开 打开文件弹出窗口 root filename filedialog askopenfilename initialdir title Select file fi
  • Android Studio 将 ProGuard 映射文件保存在哪里?

    在Android Studio中 编译签名的APK后生成的ProGuard映射文件在哪里 我不确定它是否不起作用或者我是否只是忘记了文件路径 并且我的强制性 Google Stack Overflow 搜索没有回答这个问题 它应该位于bui
  • 不安全的 C# 和 2D 渲染指针,是好是坏?

    我正在编写一个 C 控件 它包装 DirectX 9 并提供一个简化的接口来执行 2D 像素级绘图 NET 要求我将此代码包装在不安全代码块中 并使用允许不安全代码选项进行编译 我锁定整个表面 然后返回指向锁定的内存区域的指针 然后我可以使