我正在寻找可以在图形编辑程序中进行的任何优化

Add*_*ddi 6 c++ windows directx performance image

Heyo,这是我第一次在这里问一个问题所以请原谅我,如果我搞砸了~~ <

我正在开发一个类似于openCanvas的程序,早期的程序允许多人通过互联网实时绘制同一个画布.OC真的很麻烦,并且有很多限制,这就是我想写这个的原因.

我已经设置好了,所以画布在所有方向上"无限延伸",由512x512块像素组成,这些像素在被绘制之前不会变得活跃,这应该很容易制作,而我正在考虑使用Direct3D使其硬件加速,因此512平方块.

我的问题出现在我想要使用图层时,我不太确定如何快速编写图层并且不使用大量内存,因为我的目标是具有128米内存的DirectX9兼容视频卡,以及大约3.2 ghz的系统CPU功率和2到8演出的RAM.我有一些不同的方法,我正在考虑使用,并想知道哪些可能是最好的,如果有什么我可以调查,使它运行得更好.

我的第一个想法是让gfx硬件通过将所有块上的所有层用作纹理来尽可能多地工作,并且通过锁定更改的区域,在cpu上更新它们以及解锁它们来更新它们.那些目前没有被改变块被压扁成一个纹理和所使用的单个层本身被保持在系统存储器中,这将降低GFX存储器,但可以显著提高系统和GFX存储器之间的带宽使用.我可以看到持续锁定和解锁可能会使系统变得非常糟糕.另一个可能的问题是我听说有些人使用多达200层,考虑到上述情况,我想不出任何优化方法.

我的另一个想法是在系统内存中组合纹理 - 完全 - 将它们写入纹理,并将该纹理复制到gfx内存以在每个块中呈现.这似乎消除了其他方法的许多问题,但同时我将所有工作都转移到CPU中,而不是平衡它.但是,只要它仍然能够快速运行,这不是什么大问题.然而,再次,有几百层的问题.在这种情况下,我可能只更新实际更改的最终像素,这就是我认为像Sai和Photoshop这样的大名称程序.

我主要是寻找建议,可能会改进上述建议,更好的方法,或链接到可能与此类项目相关的文章.当我用C++编写它时,我可以毫不费力地翻译其他语言.谢谢你的时间〜

Dav*_* O. 4

数据结构
您绝对应该使用四叉树(或其他分层数据结构)来存储画布,并且其节点应包含比 512x512 像素小得多的块。也许不会像 1x1 像素那么小,因为那样的话层次开销会杀掉你 - 你会通过测试找到一个很好的平衡。

绘图
让您的用户只能在一种(最高分辨率)分辨率上绘图。想象一个无限大的均匀网格(二维数组)。由于您知道鼠标的位置以及用户从原点滚动的量,因此您可以导出绝对坐标。将四叉树遍历到该区域(最终添加新节点),并在用户将块(例如 32x32)绘制到四叉树中时插入它们。我会缓冲用户在 2D 数组中绘制的内容(例如与屏幕分辨率一样大),并使用单独的线程来遍历/更改四叉树并从缓冲区复制数据以避免任何延迟。

渲染
遍历四叉树并将所有图块复制到一个纹理并将其发送到 GPU?不!您会看到,发送与屏幕分辨率一样大的纹理并不是问题(带宽方面)。但是遍历四叉树并组装最终图像是(至少如果你想要很多 fps)。答案是将四叉树存储在系统内存中并从 GPU 流式传输。含义:另一个线程异步执行遍历,并尽可能快地将当前查看的数据分块复制到 GPU。如果您的用户没有以全分辨率查看画布,则您不必将树遍历到叶级别,这会为您提供自动细节级别 (LOD)。

关于拟议策略的一些随机想法

  • 四叉树方法很棒,因为它的内存效率非常高。
  • 流媒体理念可以扩展到 HDD... SeaDragon
  • 复杂的实现需要诸如 CUDA 之类的东西。
  • 如果您的 GPU 无法提供必要的性能/可编程性,只需在 CPU 上实现遍历即可——在图像完全显示之前延迟稍长,但应该可以接受。不要忘记使用多线程进行异步编程,以便在等待 CPU 时屏幕不会冻结。您可以使用不同的效果:一次显示整个图像,一开始模糊,然后慢慢增加细节(广度优先搜索(BFS))或逐块渲染(深度优先搜索(DFS)) - 可能与一些很酷的效果混合。
  • 当只允许以全分辨率查看画布时,软件实现应该非常简单。如果可以逐步缩小,这对遍历来说就是一个微小的改变。如果可以无缝缩放,则需要在相邻四叉树节点的图块之间进行线性插值 - 不再是微不足道的,但可行。
  • 层:四叉树应该为您提供足够低的内存消耗,让您只需在每一层存储一个四叉树。但是,当您有很多层时,您将需要一些优化才能保持实时性:您无法每帧组装 200 个纹理并将它们发送到 GPU。也许(不完全确定这是否是最佳解决方案)对于每个层,删除该层下方的四叉树的所有节点,其图块的像素完全被上面的层覆盖。这需要在运行时完成,同时需要绘图和深度缓冲区。如果您提供橡皮擦工具,则无法删除节点,但必须将它们标记为“不可见”,以便在遍历过程中忽略它们。

..从我的头顶上掉下来。如果您还有其他问题,请告诉我!