Giter Site home page Giter Site logo

miku-luaprofiler's Introduction

Lua Profiler For Unity

支持情况

系统 支持情况
windows
android
MAC 支持中
IOS 支持中

部署和安装

  1. 推荐安装Unity2019可以直接用PackageManager 用add by git路径添加,国内网络不好可以使用gitee代理

https://github.com/leinlin/Miku-LuaProfiler.git

  1. Unity5.6以上版本建议把代码clone下来,然后把LuaProfiler目录copy到Assets中

  2. 看到这个菜单说明安装成功了

如何使用

  • 编辑器使用推荐使用local模式,打开DeepLua开关即可

  • 真机目前只支持android系统,打包的时候加上宏 USE_LUA_PROFILER

  • 打包后,使用四根手指同时连续敲击屏幕5下以上后,就会出现以下菜单

  • 点击 Open Lua Profiler就会打上标记,下一次启动游戏就会出现一个黑屏

编辑器中点击local mode 按钮就可以切换remote mode,输入手机ip就可以查看数据了

如果公司网络不允许你直接访问手机ip,那么可以用USB数据线连接手机和电脑输入以下指令

adb forward tcp:2333 tcp:2333

之后直接在ip栏中输入127.0.0.1即可

数据说明

Name Descriptions
Overview 函数名称
totalLuaMemory 此函数生成的所有Lua GC的总和
self 函数本身产生的GC量
totalMonoMemory 此函数生成的所有Mono GC的总和
self 函数本身产生的GC量
currentTime 函数在当前帧中运行所需的时间
averageTime 计算在函数上花费的时间的平均值
totalTime 此功能消耗的所有时间
LuaGC 由当前帧生成的Lua GC
MonoGC 由当前帧生成的Mono GC
totalCalls 游戏开始后此功能的运行次数
Calls 函数当前帧的执行次数

FAQ

有的Unity版本不支持 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]这个属性的时候,你可以在lua虚拟机启动之前调用代码

MikuLuaProfiler.HookLuaSetup.OnStartGame();

打开DeepLua之后会有很多空异常报错

有的项目组会使用debug.getupvalue去获取变量并进行修改,但是MikuLuaProfiler会在所有代码执行之前添加一个Upvalue函数进行BeginSample和EndSample。这个会导致原先的upvalue表混乱,解决办法就是遍历Upvalue表,然后根据upvalue的命名获取到相应的变量,如下代码:

function debug.getupvalue_byname(func, name)
    local i = 1
    while true do
        local n, v = debug.getupvalue(func, i)
        if not n then break end
        if n == name then return v end
        i = i + 1
    end
end

function debug.setupvalue_byname(func, name, value)
    local i = 1
    while true do
        local n, v = debug.getupvalue(func, i)
        if not n then break end
        if n == name then
            debug.setupvalue(func, i, value)
            break
        end
        i = i + 1
    end
end

真机数据只有resume或者协程数据

不要用luac加密代码,请直接使用明码字符串

运行了性能调试之后,用代码调用luaGC无效

为了防止lua的GC导致内存统计出现负数,本项目直接用hook技术接管了lua的GC函数,让用户的自动促发无效,GC会根据内存是否增长到上次GC的1.2倍左右就触发,如果项目的Update GC优化的较好,内存曲线是基本一致的。

关于XLua demo跑不起来的问题

把Demo里面LuaBehaviour 中 internal static LuaEnv luaEnv = new LuaEnv()的赋值改到Awake里面

关于自定义profiler点

local LuaProfiler = MikuLuaProfiler.LuaProfiler
LuaProfiler.BeginSampleCustom("profiler name")
-- your code
LuaProfiler.EndSampleCustom()

MarkStaticRecord、MarkLuaRecord、DiffRecord、ClearDiff有什么用

这一组功能是查泄漏使用的。举一个例子,你可以在打开UI前MarkStaticRecord,进行一次内存快照,然后打开UI后MarkLuaRecord,记录第二次快照,最后你在调用UI释放的函数这里DiffRecord。如果打开UI前不持有,而打开UI后 与释放UI后都持有的对象为泄漏。 函数API为:

function miku_do_record(val, prefix, key, record, history, null_list, staticRecord)

function miku_diff(record, staticRecord)

运行起来后totalLuaMemory为负数

底层统计lua内存申请采用记录lua虚拟机总量来记录对应的GC,如果函数运行的中间发生了GC就会导致内存差值为负数,你可以把自动GC关闭掉后进行统计。

如何对Lua函数进行各种数据排序

在搜索框中输入:[lua],然后点击右上角的merge按钮,最后点击各个数据标签进行排序

如何定位Lua函数内存暴涨的点

使用Record模式启动游戏,在想采样的地方点击StartRecord,截取完记录后,找一段明显内存上涨的地方,采样出来分析函数即可.(鼠标点击上去,然后按键盘的左右键)

ref的function代表什么

这里存储的一般都是C#这里持有的回调函数,你可以每一次打开UI前先clear数据,然后进入UI后记录数据,释放UI后如果 还持有不少委托,就代表说泄漏了。

如果您发现任何错误或有任何建议加入QQ群:882425563 与我们联系

投食

miku-luaprofiler's People

Contributors

leinlin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

miku-luaprofiler's Issues

has no history

master 分支,先MarkLuaRecord, 然后 DiffRecord, 出现 has no histroy 错误。但我看readme里面说是这样操作的。

请问totalLuaMemory 不会下降是什么原因?

例如如下写法:
local list = {}
for i = 1, 100000 do
list[i] = i
end
image
即使调用了lua的gc后,看totalLuaMemory 这个值也不会降下来,请问大佬是什么原因?totalLuaMemory 即使gc后也不会下降吗?

闭合函数存在return时缺少结束Sample语句

如果闭合函数有return时会少了EndMikuSample
test1缺少了,而test2正常

--test 1
function TestFunc1()
    local function Test()
        return true
    end
end

-- test 2
function TestFunc2()
    local function Test()

    end
end

生成结果

local BeginMikuSample = MikuLuaProfiler.LuaProfiler.BeginSample local EndMikuSample = MikuLuaProfiler.LuaProfiler.EndSample local miku_unpack_return_value = miku_unpack_return_value BeginMikuSample("[lua]:require Test,Test&line:1")
--test 1
function TestFunc1() BeginMikuSample("[lua]:TestFunc1,Test&line:3") 
    local function Test() BeginMikuSample("[lua]:Test,Test&line:4") 
         return miku_unpack_return_value( true) 
    end
end

-- test 2
function TestFunc2() BeginMikuSample("[lua]:TestFunc2,Test&line:10") 
    local function Test() BeginMikuSample("[lua]:Test,Test&line:11") 

     EndMikuSample() end
 EndMikuSample() end

 
 EndMikuSample()

crash

MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_unhook(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1020) MikuLuaProfiler.LuaProfiler:BeginSample(IntPtr, String, Boolean) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaProfiler.cs:146) MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_unhook(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1020) MikuLuaProfiler.LuaProfiler:BeginSample(IntPtr, String, Boolean) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaProfiler.cs:146) MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_unhook(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1020) MikuLuaProfiler.LuaProfiler:BeginSample(IntPtr, String, Boolean) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaProfiler.cs:146) MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_unhook(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1020) MikuLuaProfiler.LuaProfiler:BeginSample(IntPtr, String, Boolean) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaProfiler.cs:146) MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_unhook(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1020) MikuLuaProfiler.LuaProfiler:BeginSample(IntPtr, String, Boolean) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaProfiler.cs:146) MikuLuaProfiler.MikuLuaProfilerLuaProfilerWrap:BeginSample(IntPtr) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\LuaHookSetup.cs:1147) System.Object:wrapper_native_00007FF873CE77A0(IntPtr, LuaGCOptions, Int32) MikuLuaProfiler.LuaDLL:lua_gc_replace(IntPtr, LuaGCOptions, Int32) (at Assets\GameAssembly\sandy\third\LuaProfiler\Core\Driver\LuaDLL.cs:1050)

客户端工程报错,DllNotFoundException

DllNotFoundException: F
MikuLuaProfiler_Editor.LuaDeepProfilerSetting.get_isDeepMonoProfiler () (at Assets/LuaFramework/LuaProfilerClient/Editor/LuaDeepProfilerSetting.cs:86)
MikuLuaProfiler_Editor.LuaProfilerWindowProfiler.DoToolbar () (at Assets/LuaFramework/LuaProfilerClient/Editor/Window/LuaProfilerWindow.cs:55)
MikuLuaProfiler_Editor.LuaProfilerWindowProfiler.OnGUI () (at Assets/LuaFramework/LuaProfilerClient/Editor/Window/LuaProfilerWindow.cs:31)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at :0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at :0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at :0)
UnityEditor.HostView.Invoke (System.String methodName, System.Object obj) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:342)
UnityEditor.HostView.Invoke (System.String methodName) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:336)
UnityEditor.HostView.InvokeOnGUI (UnityEngine.Rect onGUIPosition, UnityEngine.Rect viewRect) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:310)
UnityEditor.DockArea.DrawView (UnityEngine.Rect viewRect, UnityEngine.Rect dockAreaRect, System.Boolean customBorder, System.Boolean floatingWindow, System.Boolean isBottomTab) (at C:/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:363)
UnityEditor.DockArea.OldOnGUI () (at C:/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:322)
UnityEngine.Experimental.UIElements.IMGUIContainer.DoOnGUI (UnityEngine.Event evt, UnityEngine.Matrix4x4 worldTransform, UnityEngine.Rect clippingRect, System.Boolean isComputingLayout) (at C:/buildslave/unity/build/Modules/UIElements/IMGUIContainer.cs:244)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

il2cpp下是否无法使用

最近在尝试使用Miku-LuaProfiler测试项目中的lua代码的性能。

项目使用的是2018.4/tolua,用的是Miku-LuaProfiler的master分支,开启了il2cpp。

打包之后在安卓机器上运行会crash,看logcat信息发现是空指针错误导致的,通过定位最后检查到出错的是这段代码。

在NativeAPI.cs类中(MikuHook.dll里的)

public static IntPtr GetFunctionAddr(MethodBase method)
{
	return method?.MethodHandle.GetFunctionPointer() ?? IntPtr.Zero;
}

从后续的排查来看是MethodHandle是非空的,但GetFunctionPointer()返回的是null或者IntPtr.Zero。

我搜了搜没搜到有特地提到这个方法未实现的帖子或问答,从unity的scripting restrictions页面来看,这个方法所在类使用了System.Runtime.Serialization,确实很有可能没被il2cpp支持。

发这个issue还是想确认下il2cpp下是否无法使用,因为没有看到有相关的issue。以及如果确定无法使用,是否有支持的办法/支持的打算。

顺便,mono下是可以跑并接收到数据的,可以在mono下对比并进行优化。只是因为最后发的包都是il2cpp的,如果可以的话,还是希望能在il2cpp下直接收集到数据。

tolua运行项目栈溢出

我使用的2.0版的,一运行项目就栈溢出。
然后我修改了Sample.cs 第148行,把“item.fahter = this;”修改为“item.fahter = s;”,就好了

HookLuaSetup.OnStartGame() 耗时太长

HookLuaSetup里面的OnStartGame() 有个为了找EasyHook64.bin 的位置要遍历Asset目录的逻辑
这个项目文件很多的情况下 要好几秒

xlua多线程环境下导致crash

项目里面处理网络消息会异步回调到lua函数中,xlua已经使用了THREAD_SAFE宏:
========== OUTPUTTING STACK TRACE ==================

0x00000000777285FC (ntdll) C_specific_handler
0x00000000774C2D3E (kernel32) RtlUnwindEx
0x000007FEDF3BEF9A (xlua) luaopen_ffi
0x000007FEDF338226 (xlua) lua_setlocal
0x000007FEDF336D08 (xlua) lua_xmove
0x000007FEDF331779 (xlua) lua_error
0x000007FEDF337C92 (xlua) lua_setlocal
0x000007FEDF337745 (xlua) lua_setlocal
0x000007FEDF3377A5 (xlua) lua_setlocal
0x000007FEDF33130D (xlua) lua_callk
0x000007FEDF34B677 (xlua) luaL_tolstring
0x000007FEDF34C1B2 (xlua) luaL_where
0x000007FEDF337C92 (xlua) lua_setlocal
0x000007FEDF348437 (xlua) lua_newthread
0x000007FEDF337751 (xlua) lua_setlocal
0x000007FEDF3377A5 (xlua) lua_setlocal
0x000007FEDF337F95 (xlua) lua_setlocal
0x000007FEDF3379E0 (xlua) lua_setlocal
0x000007FEDF3325F1 (xlua) lua_pcallk
0x000007FEDF361525 (xlua) lua_pcall
0x000000006E1F7ABB (Mono JIT Code) (wrapper managed-to-native) MikuLuaProfiler.LuaDLL:lua_pcall (intptr,int,int,int)
0x000000006F6A8153 (Mono JIT Code) MikuLuaProfiler.LuaLib:DoRefLuaFun (intptr,string,int)
0x000000006F7B4AB3 (Mono JIT Code) MikuLuaProfiler.LuaHook/<>c__DisplayClass2_0:b__0 ()
0x000000006F7B3C49 (Mono JIT Code) MikuLuaProfiler.HookLuaSetup:LateUpdate ()
0x000000006F735AA8 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this
_ (object,intptr,intptr,intptr)
0x000007FEC7F7BE4B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke
0x000007FEC7F01E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke
0x000007FEC7F0AE3F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2966] mono_runtime_invoke
0x0000000140C00F2A (Unity) scripting_method_invoke
0x0000000140BF14FA (Unity) ScriptingInvocation::Invoke
0x0000000140BBA177 (Unity) MonoBehaviour::CallMethodIfAvailable
0x0000000140BBA891 (Unity) MonoBehaviour::CallUpdateMethod
0x00000001406ED76C (Unity) BaseBehaviourManager::CommonUpdate
0x00000001406F3BB6 (Unity) LateBehaviourManager::Update
0x000000014095F523 (Unity) InitPlayerLoopCallbacks'::2'::PreLateUpdateScriptRunBehaviourLateUpdateRegistrator::Forward
0x000000014095E357 (Unity) ExecutePlayerLoop
0x000000014095E423 (Unity) ExecutePlayerLoop
0x00000001409616D1 (Unity) PlayerLoop
0x000000014133A81F (Unity) PlayerLoopController::UpdateScene
0x0000000141338DD0 (Unity) Application::TickTimer
0x00000001414953AB (Unity) MainMessageLoop
0x0000000141497046 (Unity) WinMain
0x000000014247897A (Unity) __scrt_common_main_seh
0x00000000774A652D (kernel32) BaseThreadInitThunk
0x000000007773C541 (ntdll) RtlUserThreadStart

========== END OF STACKTRACE ===========

A crash has been intercepted by the crash handler. For call stack and other details, see the latest crash report generated in:

  • C:/Users/ADMINI~1/AppData/Local/Temp/Unity/Editor/Crashes

tolua的demo测试真机启动闪退

06-21 18:23:48.399 29261 29295 E CRASH   : 	#00  pc 0004b11c  /system/lib/libc.so (tgkill+12)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#01  pc 0001a9b3  /system/lib/libc.so (abort+54)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#02  pc 0032d583  /system/lib/libart.so (art::Runtime::Abort(char const*)+230)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#03  pc 0032dc13  /system/lib/libart.so (art::Runtime::Aborter(char const*)+10)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#04  pc 003e88fd  /system/lib/libart.so (android::base::LogMessage::~LogMessage()+456)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#05  pc 00224d97  /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1262)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#06  pc 00224ff3  /system/lib/libart.so (art::JavaVMExt::JniAbortF(char const*, char const*, ...)+66)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#07  pc 00352073  /system/lib/libart.so (art::Thread::DecodeJObject(_jobject*) const+290)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#08  pc 000c67e1  /system/lib/libart.so (art::CheckJNI::CallFloatMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue*)+28)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#09  pc 000c5dfb  /system/lib/libart.so (art::CheckJNI::IsInstanceOf(_JNIEnv*, _jobject*, _jclass*)+1310)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#10  pc 000c564d  /system/lib/libart.so (art::CheckJNI::GetObjectClass(_JNIEnv*, _jobject*)+768)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#11  pc 000c9bf5  /system/lib/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+480)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#12  pc 000ca59f  /system/lib/libart.so (art::CheckJNI::ReleaseStringUTFChars(_JNIEnv*, _jstring*, char const*)+42)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#13  pc 000bc3c3  /system/lib/libart.so (art::ClassHierarchyAnalysis::UpdateAfterLoadingOf(art::Handle<art::mirror::Class>)+934)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#14  pc 00cd1380  /data/app/com.lua.test.tolua-YETuQT-p9USpRK13D0m53A==/lib/arm/libunity.so (AndroidJNIBindingsHelpers::CallStaticIntMethod(void*, void*, dynamic_array<jvalue, 0u> const&)+152)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#15  pc 00cd6a18  /data/app/com.lua.test.tolua-YETuQT-p9USpRK13D0m53A==/lib/arm/libunity.so (AndroidJNI_CUSTOM_CallStaticIntMethod(void*, void*, MonoArray*)+52)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#16  pc 0000e904   ( (wrapper managed-to-native) UnityEngine.AndroidJNI:CallStaticIntMethod (intptr,intptr,UnityEngine.jvalue[]) {0xc94a7df8} + 0x54 (0xcaa108b0 0xcaa10980) [0xde12cf00 - Unity Root Domain]+59652)
06-21 18:23:48.400 29261 29295 E CRASH   : 	#17  il 0000003f  at (wrapper managed-to-native) UnityEngine.AndroidJNI.CallStaticIntMethod (intptr,intptr,UnityEngine.jvalue[]) <0x0003f>
06-21 18:23:48.400 29261 29295 E CRASH   : 	#18  il 0000007f  at MikuLuaProfiler.NativeHelper.GetPass () [0x00010] in <b402c1254b204fedb09d4180a5ce465e>:0
06-21 18:23:48.400 29261 29295 E CRASH   : 	#19  il 000007df  at MikuLuaProfiler.HookLuaSetup.LateUpdate () [0x000dd] in <b402c1254b204fedb09d4180a5ce465e>:0
06-21 18:23:48.400 29261 29295 E CRASH   : 	#20  il 0000007f  at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) [0x00020] in <c6bd535f6ab848b4a13f34d01b756eef>:0
06-21 18:23:48.436   935   935 W Binder:935_9: type=1400 audit(0.0:7674): avc: denied { write } for name="logd" dev="tmpfs" ino=19015 scontext=u:r:audioserver:s0 tcontext=u:object_r:logd_socket:s0 tclass=sock_file permissive=0

直接用tolua的helloworld的demo打包,启动的时候闪退,这是CRASH堆栈,同样xlua真机没有问题。

查内存泄漏功能不起作用!

我在测试测试的时候, 点击 MarkStaticRecord 之后, 创建一个新tabel 插入一些数据,然后 记录二次快照(MarkLuaRecord),最后 点击 DiffRecord 对比快照, 没有任何日志 或 数据打印....(感觉 Table 引用读取有些bug)

框架:ToLua

实例代码如下:
`
arr = {}
for i=1,1000 do
table.insert( arr, GameObject(tostring(i)))
end

`

二次运行 crash

编辑器下第一次运行游戏能记录数据,二次启动会crash

  • lua:xlua 5.3
  • unity version:2019.4.3
  • profiler version:3.1.4

Stacktrace:

  at <unknown> <0xffffffff>
  at (wrapper managed-to-native) object.wrapper_native_00007FFED4C42DC0 (intptr) [0x00009] in <fb001e01371b4adca20013e0ac763896>:0
  at MikuLuaProfiler.LuaLib.DoRefLuaFun (intptr,string,int,MikuLuaProfiler.LuaDLL/tolua_getref_fun) [0x00001] in Assets\ThirdParty\LuaProfiler\Core\LuaHookSetup.cs:710
  at MikuLuaProfiler.LuaHook.HookUnRef (intptr,int,MikuLuaProfiler.LuaDLL/tolua_getref_fun) [0x0000b] in Assets\ThirdParty\LuaProfiler\Core\LuaHookSetup.cs:328
  at MikuLuaProfiler.LuaDLL.luaL_unref_replace (intptr,int,int) [0x0001d] in Assets\ThirdParty\LuaProfiler\Core\Driver\LuaDLL.cs:1190
  at (wrapper native-to-managed) MikuLuaProfiler.LuaDLL.luaL_unref_replace (intptr,int,int) [0x00022] in <233898f79033455eb9478bd74704edea>:0
  at <unknown> <0xffffffff>
  at (wrapper managed-to-native) XLua.LuaDLL.Lua.lua_pcall (intptr,int,int,int) [0x0000c] in <233898f79033455eb9478bd74704edea>:0
  at XLua.DelegateBridge.PCall (intptr,int,int,int) [0x00001] in Assets\ThirdParty\XLua\Src\DelegateBridge.cs:138
  at XLua.DelegateBridge.__Gen_Delegate_Imp25 () [0x00020] in Assets\XLua\Gen\DelegatesGensBridge.cs:603
  at Main.Update () [0x00020] in Assets\Scripts\Main.cs:143
  at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) [0x00020] in <fb001e01371b4adca20013e0ac763896>:0

=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

unity2019.4.9f1运行会报错,无法做性能分析

在unity2019.4.9f1下运行,有该错误,不知道是否还没有对unity2019做支持?
NullReferenceException: Object reference not set to an instance of an object
MikuLuaProfiler.HookLuaSetup.OnStartGame () (at :0)

弄的Server那个工程打开window就报错

NullReferenceException: Object reference not set to an instance of an object
MikuLuaProfiler.GuiSkinManager+GuiStyleManager..ctor () (at Assets/LuaProfilerServer/Assets/Editor/Skin/GuiSkinManager.cs:107)
MikuLuaProfiler.GuiSkinManager.get_Styles () (at Assets/LuaProfilerServer/Assets/Editor/Skin/GuiSkinManager.cs:200)
MikuLuaProfiler.LuaProfilerWindow.DoChart () (at Assets/LuaProfilerServer/Assets/Editor/TreeView/LuaProfilerWindow.cs:504)
MikuLuaProfiler.LuaProfilerWindow.OnGUI () (at Assets/LuaProfilerServer/Assets/Editor/TreeView/LuaProfilerWindow.cs:189)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at :0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at :0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at :0)
UnityEditor.HostView.Invoke (System.String methodName, System.Object obj) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:342)
UnityEditor.HostView.Invoke (System.String methodName) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:336)
UnityEditor.HostView.InvokeOnGUI (UnityEngine.Rect onGUIPosition, UnityEngine.Rect viewRect) (at C:/buildslave/unity/build/Editor/Mono/HostView.cs:310)
UnityEditor.DockArea.DrawView (UnityEngine.Rect viewRect, UnityEngine.Rect dockAreaRect, System.Boolean customBorder, System.Boolean floatingWindow, System.Boolean isBottomTab) (at C:/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:361)
UnityEditor.DockArea.OldOnGUI () (at C:/buildslave/unity/build/Editor/Mono/GUI/DockArea.cs:320)
UnityEngine.Experimental.UIElements.IMGUIContainer.DoOnGUI (UnityEngine.Event evt, UnityEngine.Matrix4x4 worldTransform, UnityEngine.Rect clippingRect, System.Boolean isComputingLayout) (at C:/buildslave/unity/build/Modules/UIElements/IMGUIContainer.cs:244)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

Unity2019 + Xlua导入3.1.4版本死循环

Start importing Assets/LuaDeepProfilerSetting.asset using Guid(437d0d871d949cd43bc32b54034ccb1a) Importer(-1,00000000000000000000000000000000)
Done importing asset: 'Assets/LuaDeepProfilerSetting.asset' (target hash: '088d692fbd1b35792fcc7401d0986e85') in 0.003412 seconds
Import parameters got modified during import
UnityEditor.AssetDatabase:CreateAsset(Object, String)
MikuLuaProfiler.LuaDeepProfilerSetting:get_Instance() (at Assets\LuaProfiler\Common\Setting\LuaDeepProfilerSetting.cs:60)
MikuLuaProfiler.StartUp:.cctor() (at Assets\LuaProfiler\Editor\StartUp.cs:54)
System.Runtime.CompilerServices.RuntimeHelpers:RunClassConstructor(IntPtr)
System.Runtime.CompilerServices.RuntimeHelpers:RunClassConstructor(RuntimeTypeHandle)
UnityEditor.EditorAssemblies:ProcessInitializeOnLoadAttributes(Type[])

[E:\unity\Modules/AssetDatabase/Editor/V2/AssetImportManager.cpp line 348]
(Filename: Assets/LuaProfiler/Common/Setting/LuaDeepProfilerSetting.cs Line: 60)

安卓真机adb调试问题

小米10,真机调试时,打开record,打开startRecord,能看到图形,看不到数据。而且点击endRecord后,并没有按预期收集到数据,帧数是0,。在本地测试都是正常的

发布demo到mumu模拟器运行崩溃

image
修改LuaProfilerClient目录下的NativeHelper.cs第68行代码

AndroidJNI.FindClass("com.miku.profiler.Profiler");
修改为
AndroidJNI.FindClass("com/miku/profiler/Profiler");
重新导出demo安装包到mumu模拟器后正常

愚蠢的打开文件方式

看代码使用填写编辑器判断路径是否有对应关键字形式打开文件是非常愚蠢的行为。

   static void OpenFileAtLineExternal(string filePath, int line)
        {
            string editorPath = LuaDeepProfilerSetting.Instance.luaIDE;
            // 没有path就弹出面板设置
            if (string.IsNullOrEmpty(editorPath) || !File.Exists(editorPath))
            {
                SetExternalEditorPath();
            }
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = editorPath;
            string procArgument = "";

            if (editorPath.IndexOf("Code") != -1)
            {
                procArgument = string.Format("-g {0}:{1}", filePath, line);
            }
            else if (editorPath.IndexOf("idea") != -1 || editorPath.IndexOf("clion") != -1 || editorPath.IndexOf("rider") != -1)
            {
                procArgument = string.Format("--line {0} {1}", line, filePath);
                Debug.Log(procArgument);
            }
            else
            {
                procArgument = string.Format("{0}:{1}", filePath, line);
            }
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.Arguments = procArgument;
            proc.Start();

            if (editorPath.IndexOf("idea") != -1 || editorPath.IndexOf("clion") != -1 || editorPath.IndexOf("rider") != -1)
            {
#if UNITY_EDITOR_WIN
                IntPtr hwd = FindWindow("SunAwtFrame", null);
                if (hwd != IntPtr.Zero)
                {
                    ShowWindow(hwd, 3);
                }
#endif
            }
        }

事实上Unity内置有对应接口打开文件UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal,只是如果没有设置正确的运行后缀打开文件行数不对,只需要加入后缀即可,比如

        if (!EditorPrefs.GetString("vscode_userExtensions").Contains("lua"))
        {
            string vscode_userExtensions = EditorPrefs.GetString("vscode_userExtensions");
            HashSet<string> erxtensions = new HashSet<string>(vscode_userExtensions.Split(';'));
            erxtensions.Add("lua");
            EditorPrefs.SetString("vscode_userExtensions", string.Join(";", erxtensions));
        }

3.1.3版本:ArgumentOutOfRangeException: Index was out of range.

选择 Deep Lua,在Editor下启动游戏,然后点 “Record”,点击波线任意地方报错。

环境:
unity2019.4.5f1
xlua框架

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at <fb001e01371b4adca20013e0ac763896>:0)
System.ThrowHelper.ThrowArgumentOutOfRangeException () (at <fb001e01371b4adca20013e0ac763896>:0)
System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at <fb001e01371b4adca20013e0ac763896>:0)
MikuLuaProfiler.LuaProfilerTreeView.GetPreFrame (System.Int32 start, System.Boolean isChange) (at Assets/LuaProfiler/Editor/Window/ProfilerWin/TreeView/LuaProfilerTreeView.cs:934)
MikuLuaProfiler.LuaProfilerWindow.HandleInputForChart (UnityEngine.Rect expandRect) (at Assets/LuaProfiler/Editor/Window/ProfilerWin/TreeView/LuaProfilerWindow.cs:1193)
MikuLuaProfiler.LuaProfilerWindow.DrawChart (UnityEngine.Rect rect) (at Assets/LuaProfiler/Editor/Window/ProfilerWin/TreeView/LuaProfilerWindow.cs:870)
MikuLuaProfiler.LuaProfilerWindow.DoChart () (at Assets/LuaProfiler/Editor/Window/ProfilerWin/TreeView/LuaProfilerWindow.cs:739)
MikuLuaProfiler.LuaProfilerWindow.OnGUI () (at Assets/LuaProfiler/Editor/Window/ProfilerWin/TreeView/LuaProfilerWindow.cs:250)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <fb001e01371b4adca20013e0ac763896>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <fb001e01371b4adca20013e0ac763896>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <fb001e01371b4adca20013e0ac763896>:0)
UnityEditor.HostView.Invoke (System.String methodName, System.Object obj) (at <7f83bc84aafb4ee094404bddcf0d5495>:0)
UnityEditor.HostView.Invoke (System.String methodName) (at <7f83bc84aafb4ee094404bddcf0d5495>:0)
UnityEditor.HostView.InvokeOnGUI (UnityEngine.Rect onGUIPosition, UnityEngine.Rect viewRect) (at <7f83bc84aafb4ee094404bddcf0d5495>:0)
UnityEditor.DockArea.DrawView (UnityEngine.Rect viewRect, UnityEngine.Rect dockAreaRect) (at <7f83bc84aafb4ee094404bddcf0d5495>:0)
UnityEditor.DockArea.OldOnGUI () (at <7f83bc84aafb4ee094404bddcf0d5495>:0)
UnityEngine.UIElements.IMGUIContainer.DoOnGUI (UnityEngine.Event evt, UnityEngine.Matrix4x4 parentTransform, UnityEngine.Rect clippingRect, System.Boolean isComputingLayout, UnityEngine.Rect layoutSize, System.Action onGUIHandler, System.Boolean canAffectFocus) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.IMGUIContainer.HandleIMGUIEvent (UnityEngine.Event e, UnityEngine.Matrix4x4 worldTransform, UnityEngine.Rect clippingRect, System.Action onGUIHandler, System.Boolean canAffectFocus) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.IMGUIContainer.HandleIMGUIEvent (UnityEngine.Event e, System.Action onGUIHandler, System.Boolean canAffectFocus) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.IMGUIContainer.HandleIMGUIEvent (UnityEngine.Event e, System.Boolean canAffectFocus) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.IMGUIContainer.SendEventToIMGUI (UnityEngine.UIElements.EventBase evt, System.Boolean canAffectFocus) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.IMGUIContainer.HandleEvent (UnityEngine.UIElements.EventBase evt) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatchUtilities.PropagateEvent (UnityEngine.UIElements.EventBase evt) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.MouseEventDispatchingStrategy.DispatchEvent (UnityEngine.UIElements.EventBase evt, UnityEngine.UIElements.IPanel panel) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.ApplyDispatchingStrategies (UnityEngine.UIElements.EventBase evt, UnityEngine.UIElements.IPanel panel, System.Boolean imguiEventIsInitiallyUsed) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.ProcessEvent (UnityEngine.UIElements.EventBase evt, UnityEngine.UIElements.IPanel panel) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.ProcessEventQueue () (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.OpenGate () (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcherGate.Dispose () (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.ProcessEvent (UnityEngine.UIElements.EventBase evt, UnityEngine.UIElements.IPanel panel) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.EventDispatcher.Dispatch (UnityEngine.UIElements.EventBase evt, UnityEngine.UIElements.IPanel panel, UnityEngine.UIElements.DispatchMode dispatchMode) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.BaseVisualElementPanel.SendEvent (UnityEngine.UIElements.EventBase e, UnityEngine.UIElements.DispatchMode dispatchMode) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.UIElementsUtility.DoDispatch (UnityEngine.UIElements.BaseVisualElementPanel panel) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.UIElements.UIElementsUtility.ProcessEvent (System.Int32 instanceID, System.IntPtr nativeEventPtr) (at <34a846d0ed7c4d6db0304c9b82af49f3>:0)
UnityEngine.GUIUtility.ProcessEvent (System.Int32 instanceID, System.IntPtr nativeEventPtr) (at <5cac3f765efb4a7198fbbe8126e46e77>:0)

多次运行崩溃

环境:
Unity 2021.3.11f
xLua Lua 5.4
LuaProfiler 最新版本
Unity设置的是
Enter Play Mode,不开启 Reload Domain,不开启Reload Scene
第一次运行正常,关闭Play模式,再次运行,必然崩溃
求解问题如何解决哈~~~

崩溃堆栈:

Received signal SIGSEGV
Obtained 44 stack frames
0x00007ffa88aafa12 (xlua) lua_setcstacklimit
0x00007ffa88aac635 (xlua) luaopen_os
0x00007ffa88a9cacc (xlua) lua_setlocal
0x00007ffa88a9d93c (xlua) lua_setlocal
0x00007ffa88a9d7c4 (xlua) lua_setlocal
0x00007ffa88a91e43 (xlua) lua_load
0x00007ffa88a940b9 (xlua) luaL_loadbufferx
0x00007ffa88ac5cb5 (xlua) xluaL_loadbuffer
0x000001f5022dba86 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:xluaL_loadbuffer (intptr,byte[],int,string)
0x000001f5022daf4b (Mono JIT Code) [LuaEnv.cs:262] XLua.LuaEnv:DoString (byte[],string,XLua.LuaTable) 
0x000001f5022dabf3 (Mono JIT Code) [LuaEnv.cs:290] XLua.LuaEnv:DoString (string,string,XLua.LuaTable) 
0x000001f5ad758cdb (Mono JIT Code) [LuaComponent.cs:86] Game.LuaComponent:PreLoadAll () 
0x000001f5ad758aa3 (Mono JIT Code) [LuaComponent.cs:77] Game.LuaComponent:LoadAll () 
0x000001f5ad7499fb (Mono JIT Code) [ProcedurePreload.cs:120] Game.ProcedurePreload:PreloadResources () 
0x000001f5ad74553b (Mono JIT Code) [ProcedurePreload.cs:58] Game.ProcedurePreload:OnEnter 
0x000001f5ad7442b3 (Mono JIT Code) [ProcedureSplash.cs:35] Game.ProcedureSplash:OnUpdate 
0x000001f5024146d2 (Mono JIT Code) [Fsm.cs:545] GameFramework.Fsm.Fsm`1<T_REF>:Update (single,single) 
0x000001f502413512 (Mono JIT Code) [FsmManager.cs:78] GameFramework.Fsm.FsmManager:Update (single,single) 
0x000001f5023ff27f (Mono JIT Code) [GameFrameworkEntry.cs:29] GameFramework.GameFrameworkEntry:Update (single,single) 
0x000001f5023feff3 (Mono JIT Code) [BaseComponent.cs:231] UnityGameFramework.Runtime.BaseComponent:Update () 
0x000001f5553f3078 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this__ (object,intptr,intptr,intptr)
0x00007ffa893dfe24 (mono-2.0-bdwgc) [mini-runtime.c:3445] mono_jit_runtime_invoke 
0x00007ffa8931e764 (mono-2.0-bdwgc) [object.c:3066] do_runtime_invoke 
0x00007ffa8931e8fc (mono-2.0-bdwgc) [object.c:3113] mono_runtime_invoke 
0x00007ff6b4828164 (Unity) scripting_method_invoke
0x00007ff6b4807a04 (Unity) ScriptingInvocation::Invoke
0x00007ff6b47f0ce4 (Unity) MonoBehaviour::CallMethodIfAvailable
0x00007ff6b47f0dd2 (Unity) MonoBehaviour::CallUpdateMethod
0x00007ff6b42e1ed8 (Unity) BaseBehaviourManager::CommonUpdate<BehaviourManager>
0x00007ff6b42e94ba (Unity) BehaviourManager::Update
0x00007ff6b44fb76d (Unity) `InitPlayerLoopCallbacks'::`2'::UpdateScriptRunBehaviourUpdateRegistrator::Forward
0x00007ff6b44e1dda (Unity) ExecutePlayerLoop
0x00007ff6b44e1f66 (Unity) ExecutePlayerLoop
0x00007ff6b44e8009 (Unity) PlayerLoop
0x00007ff6b5433d9f (Unity) PlayerLoopController::UpdateScene
0x00007ff6b543203f (Unity) Application::TickTimer
0x00007ff6b588181a (Unity) MainMessageLoop
0x00007ff6b58860cb (Unity) WinMain
0x00007ff6b6c2533e (Unity) __scrt_common_main_seh
0x00007ffb58a07344 (KERNEL32) BaseThreadInitThunk
0x00007ffb593426b1 (ntdll) RtlUserThreadStart

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.