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

我正在开发一个类似于openCanvas的程序,早期的程序允许多人通过Internet实时在同一张 Canvas 上绘制。 OC确实是个 buggy ,并且有很多局限性,这就是为什么我想写这个。

我将其设置为使 Canvas 在所有方向上“无限期地”延伸,并由512x512像素的像素块组成,这些像素在被绘制之前不会变为事件状态,这应该真的很容易制作,我在考虑使用Direct3D使其硬件加速,即512平方块。

我的问题是当我想使用图层时,我不太确定如何在不使用大量内存的情况下快速组成图层,因为我的目标是具有128m内存的DirectX9兼容视频卡以及具有约3.2 ghz的系统CPU功率和2到8演出的ram之间。我正在考虑使用几种不同的方法,并且想知道哪种方法最好,以及是否有什么我可以研究以使其运行更好的方法。

我的第一个想法是通过将所有块上的所有层都用作纹理来使gfx硬件尽可能多地工作,并且可以通过锁定更改的区域,在cpu上更新它们并对其进行解锁来对其进行更新。当前未更改的块被展平为一个纹理,各个层本身保留在系统内存中,这将减少使用的gfx内存,但可能会大大增加系统和gfx内存之间的带宽使用率。我可以看到不断的锁定和解锁也可能会减慢系统的运行速度。另一个可能的问题是,我听说有些人使用了多达200层,并且鉴于上述情况,我想不出任何优化该层的好方法。

我的另一个想法是在系统内存中完全构成纹理,将它们写入纹理,然后将该纹理复制到gfx内存中以在每个块中进行渲染。这似乎消除了其他方法的许多问题,但是与此同时,我将所有工作移到了CPU中,而不是平衡它。不过,只要它仍然可以快速运行,这并不是什么大不了的事情。但是,仍然存在数百层的问题。不过,在这种情况下,我可能只能更新实际更改的最终像素,这就是我认为像Sai和Photoshop这样的大型程序所要做的。

我主要是在寻找建议,可能会改善上述内容的建议,更好的方法,或链接到可能与该项目相关的文章。当我用C++编写代码时,可以很容易地从其他语言进行翻译。谢谢你的时间〜

最佳答案

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

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

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

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

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

  • ..离开我的头顶。如果您还有其他问题,请告诉我!

    关于c++ - 我正在寻找可以在图形编辑程序中进行的任何优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4986847/

    10-14 06:09