我先给你一点背景知道我为什么问这个问题:
我目前正在一个严格监管的行业工作,因此我们的代码由官方测试机构仔细查看.这些测试机构希望能够构建代码并生成.exe或.dll,每次都完全相同(显然不会更改任何代码!).他们检查MD5和他们创建的可执行文件的SHA1以确保这一点.
到目前为止,我主要使用C++进行编码,其中(经过一些项目设置调整后)我设法让项目能够相同地重建到相同的MD5/SHA1.我现在正在一个项目中使用C#,并且在重建之后很难让MD5匹配.我知道文件的PE头中有"Time-Stamps",它们已经被清除为0.我也知道.exe有一个GUID,它再次被清除为00 00 00 ......等但是文件仍然不匹配.
我正在使用CFF资源管理器查看和编辑PE标头以删除时间和日期戳.使用二进制比较工具后,.exe中只有2个字节块不同(都非常小).
其中不一致的块的出现只是之前的一些二进制代码,这在ASCII详细介绍了路径*Project*\obj\Release\xxx.pdb文件.
编辑:现在已知这是*.pdb文件的GUID,但我仍然不知道是否可以修改它而不会导致任何错误!?
另一个块出现在看起来是函数名称的中间,即.(典型的部分)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
那么不同的代码块:
4A134ACE-D6A0-461B-A47C-3A4232D90816
其次是:
"} .ValueType .__ StaticArrayInitTypeSize = 7. $$ method0x60000ab-1.RuntimeFieldHandle.InitializeArray` ...等.
任何想法或建议将是最受欢迎的!
好的,这样解释; 我正在开发一个可以在任何时间点出现电源故障的系统,我正在测试的一点是在我使用StreamWriter写出文件之后.代码如下:
// Write the updated file back out to the Shell directory.
using (StreamWriter shellConfigWriter =
new StreamWriter(@"D:\xxx\Shell\Config\Game.cfg.bak"))
{
for (int i = 0; i < configContents.Count; i++)
{
shellConfigWriter.WriteLine(configContents[i]);
}
shellConfigWriter.Close();
}
FileInfo gameCfgBackup = new FileInfo(@"D:\xxx\Shell\Config\Game.cfg.bak");
gameCfgBackup.CopyTo(@"D:\xxx\Shell\Config\Game.cfg", true);
Run Code Online (Sandbox Code Playgroud)
将shellConfigWriter(a List字符串)的内容写入用作临时存储的文件,然后将其复制到原始文件上.现在,在此代码完成执行后,电源丢失,再次启动时,文件Game.cfg存在并且大小正确,但是完全空白.起初我认为这是由于在硬盘驱动器上启用了写入缓存,但即使关闭它仍然会发生(尽管不经常).
任何想法都会非常受欢迎!
更新:好的,所以在删除.Close()语句并.Flush()在每次写入操作后调用后,文件仍然是空白的.在创建新文件之前,我可以更进一步创建原始文件的备份,然后我有足够的备份来进行完整性检查,但我认为它不会有助于解决根本问题(当我告诉它写入时,刷新并关闭文件......它没有!).
目前,我DocumentViewer在一个显示XPS文件的WPF窗口中.我创建了自己的"下一页"和"上一页"按钮,并将DocumentViewer.Background属性设置为完全透明.
DocumentViewer自己的控件剩下的就是顶部的菜单栏(显示缩放设置,打印等)和底部的"查找"栏.我很想删除(或隐藏)这两个栏,但我似乎无法弄清楚如何!?
此外,当文档加载时,默认为缩放级别,不会在屏幕上显示整个页面,我需要将其更改为一次显示1页(完全); 我确信有一种方法可以做到这一点但又一次,我还没有找到.
好吧,所以我试图权衡使用各种不同纹理压缩技术的专业人士和骗子.我花了99.999%的时间使用DirectX为Windows机器编写2D精灵游戏.
到目前为止,我已经看了纹理打包(SpriteSheets)与alpha修剪,这似乎是获得更多性能的好方法.现在我开始看看它们存储的纹理格式; 目前所有内容都存储为*.PNGs.
我听说*.DDS文件很好,尤其是当与DXT5(/ 3/1取决于任务)压缩一起使用时,因为纹理在VRAM中保持压缩状态?还有人说,因为它们已经是DirectDraw Surfaces,所以它们加载的速度也快得多.
所以我创建了一个应用程序来测试它; 我将该行调用20次以下,在每次调用之间释放纹理.
for (int i = 0; i < 20; i++)
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
{
return E_FAIL;
}
g_pTexture->Release();
g_pTexture = NULL;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试使用DXT5纹理,它需要比在简单的*.PNG中加载要长5倍.我听说如果你不生成Mipmap,它会变慢,所以我仔细检查了一下.然后我改变了我用来生成*.DDS文件的程序,切换到NVIDIA自己的nvcompress.exe,但没有任何效果.
编辑:我忘了提到文件(*.png和*.dds)都是相同的图像,只是以不同的格式保存.(相同大小,alpha数量,一切!)
编辑2:当使用以下参数时,它的加载速度提高了近2.5倍,并且消耗的VRAM少了很少!
D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
Run Code Online (Sandbox Code Playgroud)
但是,我现在正在失去纹理的所有透明度,我看了DXT5纹理,它在Paint.NET和DirectX DDS Viewer中看起来很好.但是当装入所有透明度时变成纯黑色.ColorKey问题?
编辑3:忽略最后一点,我是愚蠢的,在我的"快速示例"中,我忘了在D3DXSprite-> Begin()上启用Alpha-Blending.卫生署!
c# ×2
compression ×1
dds-format ×1
directdraw ×1
directx ×1
streamwriter ×1
textures ×1
wpf ×1
xps ×1
xpsdocument ×1