モバイルゲームは少ないメモリを取るにする方法?メモリ消費量のiOSリアルタイム統計を開始

 

iOS版がクラッシュしますあまりにも多くのメモリを使用して、なぜ、パフォーマンスが低下しますか?テンセントのゲーム、モバイルゲームは少ないメモリを取るようにする方法を説明するため、この記事では大学の専門家デブリン?メモリ消費量のiOSリアルタイム統計を開始します。

まず、問題

手にツアープロジェクト、過度のメモリ使用量に先立ち、すべてが離れて落ちるようになったので、あなたは、iOS用メモリの統計を行う必要があります。XCodeのメモリ使用量の統計、UnityInternalProfileメモリ統計情報、モノメモリ統計情報やその他の方法:いくつかの方法のメモリ統計があります。

しかし、XCodeの統計はUnityInternalProfileメモリ統計情報とXCodeのメモリ統計情報、携帯電話を接続する必要があるとのギャップは、クラッシュのメモリ時間大きすぎるとの関係を重視誰?彼らはどのように携帯電話のメモリの総量を示して?彼女に戻るには、適切なメモリ統計を達成する方法を所有しています。

第二に、テスト勉強

UnityInternalProfileに師事、我々はそれがresident_size(物理メモリフットプリント)にmach_base_task_infoを取ったことがわかりました

私がテストをした後、数フレームごとに統計Xcodeのメモリとresident_sizeをプリントアウトし、その後、一定量のメモリを使用するように割り当てられています。

横軸は時間であり、縦軸はメモリです。

成長resident_size値メモリの増加に伴い、しかし、ある程度の成長は、憶測が圧縮されている可能性があり際に、どのように変更された情報検索(MacOSのは、メモリ圧縮技術を使用する必要があります)とのコードは、iOSのtask_vm_infoこの構造が発見されませんそこにあるの内側にちょうどこれを圧縮します。

次に圧縮、再テストの出力値を上げます!

メモリ使用量がresident_size(物理メモリ)はもはや増加は、線形成長を圧縮する際、途中で増加し続けています。

第三に、推論

なお、図から見ることができます。実際のメモリ使用量=常駐+湿布を。それは、iOSがメモリを圧縮してメモリフットプリントを削減することをすることができます。

そして、テスト中に、半分の物理メモリに到達するとき、実際のメモリシステム、システムは警告memorywarningを送信し続けます、Qは、アプリの60%オフになりますがわかりました。

第四に、アプリケーション

现在只需要实时拿到task_vm_info里的resident 和 compress 就可以统计App的实际内存的使用量了,对于Unity手机项目来说,需要写Native和C#代码,幸运的是,我已经帮你把代码写好了。

在XCodePostProcess::OnPostProcessBuild()里加入如下代码,会在Unity生成的XCode工程自动插入如下Native代码:

XClass AppRender = new XClass(pathToBuiltProject + "/Classes/UnityAppController+Rendering.mm");
if( AppRender != null)
{
string TCode = "";
TCode += "#include <mach/mach_time.h>\n";
TCode += "#include <mach/mach.h>\n";
TCode += "#include <mach/mach_host.h>\n";
TCode += "#include <mach/task_info.h>\n";
TCode += "#include <mach/task.h>\n";
TCode += "static float GetTotalPhysicsMemory( )\n";
TCode += "{\n";
TCode += " kern_return_t kr;\n";
TCode += " mach_msg_type_number_t info_count = TASK_VM_INFO_COUNT;\n";
TCode += " task_vm_info_data_t vm_info;\n";
TCode += " kr = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vm_info, &info_count);\n";
TCode += " if (kr == KERN_SUCCESS) return (float)(vm_info.compressed + vm_info.resident_size) / 1024.0 / 1024.0;\n";
TCode += " return 0;\n";
TCode += "}\n";
TCode += "extern \"C\" float _Get_Profiler_TotalPhysicMemory(){return _fLockStepPhysicMemory;}\n";
TCode += "extern \"C\" void UnityRepaint()";

AppRender.Replace("extern \"C\" void UnityRepaint()",TCode );
}
(左右滑动可查看全部代码)

在UnityC#里加入以下托管代码,调用 Get_Profiler_TotalPhysicMemory()即可实时拿到内存使用值。

#if ( UNITY_IPHONE && !UNITY_EDITOR )

[DllImport("__Internal")]
static extern float _Get_Profiler_TotalPhysicMemory( );

public static float Get_Profiler_TotalPhysicMemory( )
{
return _Get_Profiler_TotalPhysicMemory( );
}
#endif
(左右滑动可查看全部代码)

五、补充

由于系统有分页机制,即你申请使用1字节的内存,系统也有可能会给你一整页(16k大小的物理页),所以会导致这里的实际内存使用量(内存分页总和)与XCode内存统计(精确统计)不完成相等,但大致符合一定比例。

おすすめ

転載: www.cnblogs.com/dyf214/p/12091936.html