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++编写它时,我可以毫不费力地翻译其他语言.谢谢你的时间〜
数据结构
您绝对应该使用四叉树(或其他分层数据结构)来存储画布,并且其节点应包含比 512x512 像素小得多的块。也许不会像 1x1 像素那么小,因为那样的话层次开销会杀掉你 - 你会通过测试找到一个很好的平衡。
绘图
让您的用户只能在一种(最高分辨率)分辨率上绘图。想象一个无限大的均匀网格(二维数组)。由于您知道鼠标的位置以及用户从原点滚动的量,因此您可以导出绝对坐标。将四叉树遍历到该区域(最终添加新节点),并在用户将块(例如 32x32)绘制到四叉树中时插入它们。我会缓冲用户在 2D 数组中绘制的内容(例如与屏幕分辨率一样大),并使用单独的线程来遍历/更改四叉树并从缓冲区复制数据以避免任何延迟。
渲染
遍历四叉树并将所有图块复制到一个纹理并将其发送到 GPU?不!您会看到,发送与屏幕分辨率一样大的纹理并不是问题(带宽方面)。但是遍历四叉树并组装最终图像是(至少如果你想要很多 fps)。答案是将四叉树存储在系统内存中并从 GPU 流式传输。含义:另一个线程异步执行遍历,并尽可能快地将当前查看的数据分块复制到 GPU。如果您的用户没有以全分辨率查看画布,则您不必将树遍历到叶级别,这会为您提供自动细节级别 (LOD)。
关于拟议策略的一些随机想法
..从我的头顶上掉下来。如果您还有其他问题,请告诉我!
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |